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

모델은 그대로 두고, 방법만 바꿔 성능 올리기

물고기 데이터를 직접 만들고, 모델 하나를 고정한 채 데이터 분할, 스케일링과 학습률, 특성과 규제, 여러 모델 묶기를 하나씩 바꿔 봅니다. 실험할 때마다 결과가 기록표에 쌓여, 어떤 방법이 얼마나 효과가 있었는지 나란히 비교할 수 있습니다.

① 만들기분포와 모양을 정하고, 같은 물고기의 복제본 수도 정합니다. CSV로 받을 수 있습니다.
② 방법 바꾸기모델은 하나로 고정한 채 평가·학습 과정·특성·앙상블만 바꿉니다.
③ 기록하기실험할 때마다 설정과 점수가 기록표에 쌓여 방법끼리 비교됩니다.

①물고기 데이터 만들기

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

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

복제본 = 같은 물고기를 조금씩 흔들어 다시 잰 행입니다(같은 fish_id). 1장의 "누수" 실험에 씁니다.

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

②모델은 고정, 방법 바꾸기

🔒 고정할 모델: 로지스틱 회귀

1 · 평가 설계 분할 오류 바로잡기

분할
층화나누는 단위

2 · 학습 과정 경사하강법을 쓰는 모델만

스케일링
배치

3 · 특성과 규제 무엇을 넣고, 얼마나 단순하게

2차 다항 특성
규제

4 · 여러 모델 묶기 같은 모델을 여러 개

③결과

혼동행렬 (시험 조각 합계)
내보내기 · 처음부터
빠른 비교 · 한 가지만 바꿔 두 번 이상 실행하고 기록에 남깁니다
실험 기록 (최신이 위, 가장 높은 점수에 색)
데이터 그림 · 가로축 세로축

흐린 점 = 마지막 실험의 학습용, 진한 점 = 시험용(교차검증이면 첫 조각), ✕ = 틀린 물고기.

?

도움말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마리에서 구했습니다.

결과를 읽는 법
  • 누수: 복제본이 있을 때 "행" 단위로 나누면 같은 물고기가 학습과 시험 양쪽에 들어가 점수가 부풀려집니다. KNN을 고정하면 차이가 가장 크게 보입니다.
  • 스케일링: 무게(수백 g)와 비율(0.1 안팎)의 단위 차이 때문에, 끄면 경사하강법이 제대로 내려가지 못하거나 발산합니다(⚠ 표시).
  • 학습률: 너무 작으면 에포크 안에 못 내려가고, 너무 크면 손실 곡선이 튑니다.
  • 특성: 어려운 짝에서 꼬리 비율 하나가 다른 모든 조정보다 효과가 큽니다.
  • 규제와 복잡도: 2차 다항 특성으로 복잡하게 만든 뒤 L1·L2를 걸면 학습·시험 차이가 줄어드는지 보세요.
  • 앙상블: 흔들리는 모델(깊은 나무)에 배깅을 걸 때 효과가 가장 큽니다.
  • 교차검증의 "±"는 다섯 조각 점수의 표준편차입니다. 두 실험의 차이가 이보다 작으면 우연일 수 있습니다.
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). 원문

수고하셨습니다!

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

박사
박사모델 하나를 고정하고 방법만 바꿔 실험 기록을 쌓았어요.
  • KNN 고정: 행 단위로 나누면 0.805, 물고기 단위로 나누면 0.738이다
  • 로지스틱 고정: 꼬리 비율을 더하면 0.698에서 0.879로 오른다
  • 배깅 15개는 0.698에서 0.699로 거의 그대로다
조수
조수기록표를 보니 무엇이 효과였는지 한눈에 보여요!
초파리 연구원
초파리 연구원기록이 없으면 실험도 없는 거야.