Fish Market Data로 쉽게 따라하는 머신러닝 · 3

물고기를 직접 만들고, 여덟 모델에 넣어 보기

종마다 크기와 체형의 분포를 직접 정해 물고기 데이터를 만들고, 규칙 기반부터 딥러닝까지 여덟 모델에 넣어 봅니다. 같은 데이터에서 모델마다 경계를 긋는 방식과 점수가 어떻게 다른지 바로 비교할 수 있습니다.

① 만들기종마다 크기와 체형의 분포를 정하면 물고기 데이터가 생기고 CSV로 받을 수 있습니다.
② 학습하기여덟 모델 가운데 하나를 골라 같은 데이터로 학습하고 시험합니다.
③ 판정하기가상의 물고기를 만들어 모델이 어떤 종으로 보는지 확인합니다.

①물고기 데이터 만들기

빠른 시작
종마다 분포와 모양 (그림이 바로 바뀝니다)
측정 조건

자로 잴 때 생기는 오차입니다. 크게 하면 비율 특성(꼬리 비율 등)이 먼저 흐려집니다.

설정은 이 브라우저에 자동 저장됩니다.

②모델에 넣고 학습하기

어떤 특성을 넣을까 (두 개를 고르면 경계가 그려집니다)
모델
모델 설정

③새 물고기 판정하기

가상의 물고기를 만들면 학습한 모델이 바로 판정합니다. 결과 그림의 과녁이 이 물고기입니다.

내보내기 · 처음부터

데이터 CSV는 ①의 "CSV 받기"로 받습니다. 코드는 지금 고른 모델과 특성을 scikit-learn으로 옮긴 것입니다.

결과 그림 · 가로축 세로축

혼동행렬 (시험 20%)

대각선(테두리 칸)이 맞힌 수, 나머지가 틀린 수입니다. 재현율 = 그 종을 실제로 몇 %나 찾았는지.

?

도움말How it works

실험실이 무엇을 계산하는지, 결과를 어떻게 읽는지 정리했습니다.

데이터는 이렇게 만들어집니다

물고기 한 마리마다 종의 분포에서 모양을 뽑고, 그 모양으로 나머지 크기를 계산합니다.

몸길이 L ~ 정규분포(평균, 편차)
높이 = L × 체형 비율,   두께 = L × 두께 비율,   전체 길이 = L × (1 + 꼬리 비율)
무게 = k × 몸길이 × 높이 × 두께 k는 종마다 다른 밀도 계수(실제 데이터에서 0.22~0.33)

비율들도 종마다 작은 편차로 흔들고, 마지막에 모든 측정값에 측정 잡음(%)을 곱합니다. 기본값 "7종 전체"는 실제 데이터와 같은 규모(1,554마리)와 종별 마리 수를 쓰고, 종별 평균과 편차는 Kaggle Fish Market 데이터(https://www.kaggle.com/datasets/vipullrathod/fish-market) 원본 158마리에서 구했습니다.

해 볼 만한 실험
  • "쉬운 짝"에서 여덟 모델을 차례로 눌러 보세요. 모두 1.000 근처입니다. 모델의 차이는 어려운 데이터에서만 드러납니다.
  • "어려운 짝"에서 특성으로 꼬리 비율을 켜 보세요. 어떤 모델이든 점수가 크게 오릅니다.
  • KNN의 k를 1로, 나무의 깊이를 10으로 올려 학습과 시험 정확도의 차이(과적합)를 보세요.
  • 로지스틱 회귀의 학습률을 1까지 올리고 배치를 1로 두면 손실 곡선이 흔들립니다.
  • "쌍둥이 두 종"은 꼬리 비율만 조금 다릅니다. 어느 특성을 넣어야 구분되는지 찾아보세요.
  • ③에서 체형 비율만 바꿔 가며, 판정이 바뀌는 지점이 결과 그림의 경계와 같은지 확인해 보세요.
AI

AI와 함께 바꿔 보기 — 풀버전 프롬프트Prompt

내려받은 코드를 내 데이터로 바꾸거나 다른 모델로 바꾸고 싶을 때, 아래 프롬프트를 복사해 AI 도우미에게 붙여 넣으세요. [ ] 칸을 채우고, 해당하지 않는 항목은 지우면 됩니다.

# 역할
너는 파이썬(pandas, scikit-learn)으로 분류 모델을 가르치는 친절한 데이터 과학 튜터이자 코드 리뷰어다.

# 배경
나는 "물고기 분류" 해설 페이지(또는 실험실)에서 코드를 내려받았다. 이 코드를 [데이터 변환 / 모델 변환 / 둘 다] 하고 싶다.
- 지금 데이터: [파일 이름], 행 수 [ ]
  - 기본 열: species(정답), weight_g, length1_cm, length2_cm, length3_cm, height_cm, width_cm, source, seed_id
  - 내 데이터라면 열 이름과 뜻을 여기에 적는다: [ ]
- 실행 환경: [코랩 / 주피터 / 로컬 파이썬 3.x], scikit-learn 버전 [ ](모르면 "모름")
- 내 수준: [입문 / 중급 / 실무]

# 하고 싶은 일 (해당하는 번호만 남기고 [ ]를 채운다)
## A. 데이터 변환
A1. 다른 데이터로 바꾸기: 파일 [경로], 정답 열 [ ], 특성 열 [ ]
A2. 정리: 결측치 [삭제 / 평균 대체 / 중앙값 대체], 이상치 [예: 무게 0인 행 삭제], 완전히 같은 행 [삭제 / 유지]
A3. 새 특성 만들기: [예: 체형 비율 = height_cm / length2_cm, 꼬리 비율 = (length3_cm - length2_cm) / length2_cm]
A4. 변환: 범주형 [원-핫 / 순서형], 스케일링 [표준화 / 최소-최대 / 없음], 로그 변환할 열 [ ]
A5. 데이터 증강: 원본마다 복제본 [n]개, 크기 배율 ~ 정규분포(평균 1, 표준편차 [0.12]), 무게는 배율의 세제곱에 비례, 모양 비율에는 표준편차 [3%]의 잡음. 원본 ID 열(seed_id)을 반드시 만든다.
A6. 클래스 고르기·합치기: [예: 농어와 로치 두 종만 / 흰송어와 로치를 한 클래스로]
## B. 모델 변환
B1. 모델 바꾸기: 지금 [ ] → [KNN / 의사결정나무 / 로지스틱 회귀 / 선형 SVM / 커널 SVC / MLP / 랜덤 포레스트 / 그래디언트 부스팅]
B2. 하이퍼파라미터: 직접 지정 [ ] 또는 탐색 [GridSearchCV / RandomizedSearchCV], 탐색 범위 [ ]
B3. 학습 과정: 학습률 [ ], 에포크 [ ], 배치 크기 [ ], 조기 종료 [사용 / 안 함]
B4. 규제: [L1 / L2], 강도 [C 또는 alpha 값]
B5. 앙상블: [보팅(모델 목록) / 배깅(기본 모델, 개수) / 부스팅(종류, 단계 수)]
B6. 여러 모델 비교표: [비교할 모델 목록]

# 반드시 지킬 것
1. 분할: 층화(stratify)로 나눈다. 증강·복제 데이터라면 원본 ID(seed_id) 단위로 나눈다(StratifiedGroupKFold 또는 GroupShuffleSplit). 이유를 주석 한 줄로 적는다.
2. 누수 방지: 스케일링, 특성 선택, 결측치 처리는 Pipeline 안에서 학습 데이터로만 fit한다. 시험 세트는 모든 선택이 끝난 뒤 한 번만 쓴다.
3. 재현성: random_state=0처럼 난수를 고정한다.
4. 기준선: 가장 많은 클래스만 답할 때의 정확도를 함께 출력한다.
5. 출력: 교차검증 정확도(평균 ± 표준편차), 시험 정확도, 혼동행렬, classification_report(클래스별 정밀도·재현율·F1).
6. 원래 코드에서 바뀐 줄에는 "# [변경]" 주석을 단다.
7. 주석과 설명은 한국어로, 입문자도 따라올 수 있게 쓴다.
8. 코랩에서 바로 실행되도록 import를 모두 넣고, 필요하면 파일 올리기 칸(google.colab.files.upload)을 포함한다.

# 답변 형식
1. 무엇을 왜 바꿨는지 3~5줄 요약
2. 그대로 실행되는 전체 코드 한 덩어리 (주피터 칸으로 나눌 곳에 "# %%" 표시)
3. 결과를 읽는 법과 주의할 점 (과적합·누수·클래스 불균형 신호)
4. 다음에 해 볼 만한 실험 2~3가지

# 코드
[여기에 내려받은 .py 코드나 노트북 코드를 붙여 넣는다]

프롬프트의 "반드시 지킬 것"은 이 자료에서 다룬 원칙(층화 분할, 원본 단위 분할, 누수 방지, 기준선 비교)을 그대로 옮긴 것입니다. AI가 만든 코드도 이 원칙을 지켰는지 확인하세요.

E-1 저자 소개

안상선 ((주)M-Robo 대표)

한국전기안전공사, 매일경제신문을 거쳐 현재 매일경제 사외벤처 (주)M-Robo를 창업해 대표로 재직하고 있다. (주)M-Robo는 언론사 사내 벤처로 시작한 미디어 벤처로, 국민일보에 로봇기자(스톡봇)을 서비스 했으며, 한국인터넷진흥원, 한국언론진흥재단, 한국방송통신전파진흥원 등에서 다수의 프로젝트를 진행했다. 이후 자체 A.I 뉴스 신문인 Money-Robo를 서비스 중이다. 대표 재직 중 아시아오픈 데이터 해커톤 우승, 데이터창업 분야 공로로 행정안전부 장관상을 2회 수상했으며, 인공지능 및 블록체인 분야에 대한 5개 특허 발명 및 등록자이다. 저서로는 “AI범죄와 자기방어”가 있으며, 핀테크분야, 통계학, 인공지능 분야에 대해서 한국기술교육대학교 온라인평생교육원 이러닝 콘텐츠 개발을 진행했다. 최종학위는 경제학 박사(동국대, 미시수리경제학)이다. 국민대학교, 호서대학교 등 여러 대학교에서 데이터 및 인공지능과 관련한 과목을 강의하고 있다. 자세한 프로필

강의

  • 안상선 (2025). 「비즈니스를 위한 데이터 과학」 강의안. 한국열린사이버대학교 인공지능융합학과.
  • 안상선 (2025). [K-디지털] 인공지능 자연어 처리. STEP(스마트직업훈련플랫폼), 한국기술교육대학교 온라인평생교육원.
  • 안상선 (2024). [K-디지털] 핀테크 데이터 분석 기초. STEP(스마트직업훈련플랫폼), 한국기술교육대학교 온라인평생교육원.

STEP 강의 바로가기: link.step.or.kr/1qyVoJ · link.step.or.kr/M9na9N · link.step.or.kr/brqEyc
사이트 개편으로 접속이 원활하지 않을 경우에는 www.step.or.kr로 접속 바랍니다.

논문과 발표

  • 안상선 (2025). 국민노후보장패널데이터를 활용한 가구지출 예측 모델 연구: 인공지능 모델 기반 접근. 「미래사회」, 16(2). 원문
  • 안상선 (2025). 국민노후보장패널데이터를 활용한 가구지출 예측 모델 연구: 인공지능 접근. 국민노후보장패널 학술대회 발표자료(2025.05.13), 국민연금공단 국민연금연구원. 발표자료
  • 안상선 (2025). SNS 텍스트 기반 마약 의심 거래 탐지 알고리즘에 대한 연구: 패턴 및 맥락 분석을 중심으로. 「미래사회」, 16(1). 원문
  • 안상선 (2024). 금융분야의 이상탐지 모델 보안을 위한 통계 기반의 적대적 데이터 대응 방안: 실증적 분석과 시뮬레이션 결과. 「미래사회」, 15(3). 원문
  • 안상선 (2024). 인공지능을 활용한 가상 캐릭터 특성 기반 SNS 포스팅 탐지 솔루션. 2024 Summer Newmedia Party 포스터 발표(2024.06.19), 서울미디어대학원대학교.
  • 안상선 (2024). 산업재해 패널 데이터를 활용한 머신러닝 모델. 제10회 산재보험패널 학술대회 포스터 발표(2024.05.17), 근로복지공단 근로복지연구원.
  • 안상선 (2024). 가상 자산 시계열 데이터의 분석과 예측: 시계열 모델 및 인공지능 모델의 비교, 개선점 제시. 「미래사회」, 15(1). 원문

수고하셨습니다!

「3 물고기 분류 실험실 ① 모델 바꿔 보기」 편을 끝까지 읽었어요. 연구실 식구들이 한마디씩 정리해 드립니다.

박사
박사물고기를 직접 만들어 여덟 모델에 넣어 봤어요.
  • 어시장 4종을 몸길이·높이로만 가르면 로지스틱 회귀 시험 정확도는 0.784다
  • 꼬리 비율을 켜면 0.922로 오른다
  • 만든 데이터는 CSV로, 설정은 .py·.ipynb 코드로 가져갈 수 있다
조수
조수제가 만든 물고기로 다시 돌려 볼게요!
초파리 연구원
초파리 연구원데이터를 만든 사람도 결과는 못 고른다고.