Chapter 6: 학습용 vs 테스트용 - 데이터 나누기¶
한 줄 요약: 시험 문제를 미리 보고 공부하면 진짜 실력을 알 수 없듯이, 머신러닝도 학습에 사용하지 않은 데이터로 평가해야 진짜 성능을 알 수 있어요.
🎯 이 장에서 배우는 것¶
- [ ] 왜 데이터를 학습용과 테스트용으로 나눠야 하는지 설명할 수 있다
- [ ] train_test_split 함수를 사용해 데이터를 분할할 수 있다
- [ ] 과적합(overfitting)의 개념을 이해하고 예시를 들 수 있다
- [ ] 적절한 분할 비율을 선택할 수 있다
- [ ] random_state의 역할을 이해한다
💡 왜 이걸 배우나요?¶
시험의 진짜 목적을 생각해봐¶
학교 시험은 왜 볼까요? "이 학생이 개념을 진짜 이해했는지" 확인하기 위해서죠.
그런데 만약: - 시험 문제를 미리 알려주고 - 그 문제만 달달 외워서 - 100점을 맞았다면?
이 학생이 진짜 실력이 있는 걸까요? 아니죠. "처음 보는 문제"도 풀 수 있어야 진짜 실력이에요.
머신러닝도 똑같아¶
모델이 학습한 데이터로 평가하면?
→ 당연히 잘 맞춤 (문제를 이미 알고 있으니까!)
→ 하지만 새로운 데이터가 들어오면? 💥 실패
모델이 처음 보는 데이터로 평가하면?
→ 진짜 실력 확인 가능
→ 실제로 사용해도 비슷한 성능 기대 가능
실제 사례로 보면¶
😱 나쁜 예시: - 쇼핑몰에서 고객 이탈 예측 모델을 만들었어 - 학습에 쓴 데이터로 테스트했더니 정확도 99%! 🎉 - 실제 서비스에 적용했더니... 정확도 60% 😭 - 왜? 모델이 데이터를 "외워버린" 거야
😊 좋은 예시: - 데이터를 학습용 80%, 테스트용 20%로 나눔 - 학습용으로만 훈련, 테스트용으로 평가 - 테스트 정확도 85% - 실제 서비스에서도 비슷하게 85% 정도 성능 유지! ✨
📚 핵심 개념¶
개념 1: 학습 데이터(Training Data)¶
비유로 시작: 학습 데이터는 마치 교과서와 문제집이야. 시험 전에 열심히 공부하는 자료지.
정확히 말하면: 모델이 패턴을 배우는 데 사용하는 데이터야. 모델은 이 데이터를 보면서 "아, 이런 특징이 있으면 이런 결과가 나오는구나"를 학습해.
예를 들어:
학습 데이터 예시 (주택 가격 예측)
┌─────────────────────────────────────────────┐
│ 면적 │ 방 개수 │ 위치 │ 가격(정답) │
├─────────────────────────────────────────────┤
│ 50㎡ │ 2 │ 서울 │ 3억원 │
│ 80㎡ │ 3 │ 부산 │ 2억원 │
│ 100㎡ │ 4 │ 서울 │ 5억원 │
│ ... │ ... │ ... │ ... │
└─────────────────────────────────────────────┘
↓
모델이 이걸 보면서 배움:
"면적이 크고, 서울이면 가격이 높구나!"
쉽게 말하면: 모델이 공부하는 교재!
개념 2: 테스트 데이터(Test Data)¶
비유로 시작: 테스트 데이터는 마치 본 시험 문제야. 학습할 때는 절대 보면 안 되고, 오직 실력 평가용으로만 써.
정확히 말하면: 모델의 실제 성능을 평가하기 위해 학습 과정에서 전혀 사용하지 않는 데이터야.
예를 들어:
테스트 데이터 (모델이 처음 보는 것!)
┌─────────────────────────────────────────────┐
│ 면적 │ 방 개수 │ 위치 │ 가격(정답) │
├─────────────────────────────────────────────┤
│ 70㎡ │ 2 │ 서울 │ ??? │
│ 90㎡ │ 3 │ 대구 │ ??? │
└─────────────────────────────────────────────┘
↓
모델에게 물어봄: "가격이 얼마일 것 같아?"
↓
모델 예측: [3.5억원] [2.3억원]
실제 정답: [3.8억원] [2.1억원]
↓
평가: "음, 꽤 가깝네! 성능 괜찮은 편이야"
쉽게 말하면: 모델의 진짜 실력을 확인하는 시험 문제!
개념 3: 과적합(Overfitting)¶
비유로 시작: 과적합은 마치 시험 문제를 통째로 외운 학생이야. 교과서 문제는 100점인데, 조금만 다른 문제 나오면 못 푸는 거지.
정확히 말하면: 모델이 학습 데이터에 지나치게 맞춰져서, 새로운 데이터에 대한 예측력이 떨어지는 현상이야.
예를 들어:
과적합된 모델의 특징
┌─────────────────────────────────────────────┐
│ │ 정상 모델 │ 과적합 모델 │
├─────────────────────────────────────────────┤
│ 학습 데이터 │ 85% │ 99% │ ← 과적합은 여기서 너무 높아
│ 테스트 데이터 │ 83% │ 60% │ ← 여기서 확 떨어짐
└─────────────────────────────────────────────┘
차이가 크면 = 과적합! ⚠️
시각적으로 이해하기:
정상 모델 과적합 모델
y │ ○ y │ ○
│ ○ ○ │ ○ ○
│ ───────── (부드러운 선) │ ∿∿∿∿∿∿∿ (구불구불한 선)
│○ ○ │○ ○
└──────────── x └──────────── x
새 데이터도 잘 맞춤 학습 데이터만 정확히 맞춤
새 데이터는 틀릴 가능성 높음
쉽게 말하면: 교과서 내용을 "이해"한 게 아니라 "암기"한 상태!
개념 4: 분할 비율¶
일반적인 비율:
┌─────────────────────────────────────────────┐
│ 전체 데이터 100% │
├─────────────────────────────────────────────┤
│ ██████████████████████████ │ ████████ │
│ 학습용 80% │ 테스트 20% │
└─────────────────────────────────────────────┘
가장 많이 쓰는 비율: 80:20 또는 70:30
데이터 양에 따른 가이드: | 데이터 개수 | 추천 분할 | 이유 | |------------|----------|------| | 100개 미만 | 70:30 | 테스트에 충분한 샘플 필요 | | 100~1000개 | 80:20 | 표준적인 비율 | | 1000개 이상 | 90:10도 가능 | 학습에 더 많은 데이터 할당 |
쉽게 말하면: 보통 80%는 공부용, 20%는 시험용!
개념 5: random_state (재현성)¶
비유로 시작: random_state는 마치 뽑기 기계의 시작 위치야. 같은 위치에서 시작하면 항상 같은 순서로 뽑혀.
정확히 말하면: 데이터를 무작위로 섞을 때 사용하는 시드(seed) 값이야. 같은 숫자를 넣으면 항상 같은 방식으로 데이터가 나뉘어.
예를 들어:
# random_state가 없으면: 실행할 때마다 다른 결과
train_test_split(data, test_size=0.2) # 매번 다른 분할
# random_state가 있으면: 항상 같은 결과
train_test_split(data, test_size=0.2, random_state=42) # 항상 동일한 분할
왜 중요해?
실험 결과를 재현하려면 같은 데이터 분할이 필요해!
상황 1: random_state 없음
├── 1차 실행: 정확도 85%
├── 2차 실행: 정확도 82% ← 데이터가 다르게 나뉘어서 비교 불가
└── 3차 실행: 정확도 88%
상황 2: random_state=42
├── 1차 실행: 정확도 85%
├── 2차 실행: 정확도 85% ← 항상 같은 결과!
└── 3차 실행: 정확도 85%
쉽게 말하면: 나중에 똑같이 다시 할 수 있게 해주는 "저장 번호"!
💡 42는 왜 자주 쓸까?
"은하수를 여행하는 히치하이커를 위한 안내서"라는 소설에서 "삶, 우주, 그리고 모든 것에 대한 답"이 42라서, 프로그래머들이 재미로 자주 써요. 아무 숫자나 써도 돼!
🔨 따라하기¶
Step 1: 필요한 도구 불러오기¶
목표: 데이터 분할에 필요한 라이브러리를 불러와요.
코드:
# === WHAT: 필요한 라이브러리 불러오기 ===
# 데이터 분할과 샘플 데이터를 위한 도구들을 준비해요
# --- WHY: 각각의 역할 ---
# sklearn.model_selection: 데이터 분할 함수 제공
# sklearn.datasets: 연습용 샘플 데이터 제공
# pandas: 데이터를 표 형태로 다루기
from sklearn.model_selection import train_test_split # 데이터 분할 함수
from sklearn.datasets import load_iris # 붓꽃 샘플 데이터
import pandas as pd # 데이터프레임 도구
print("✅ 라이브러리 불러오기 완료!")
실행 결과:
✅ 라이브러리 불러오기 완료!
여기서 잠깐! 🤔
- sklearn은 "사이킷런"이라고 읽어요
- 머신러닝에서 가장 많이 쓰는 라이브러리 중 하나야
- train_test_split 함수 하나만 불러오면 데이터 분할 끝!
Step 2: 샘플 데이터 준비하기¶
목표: 연습용 붓꽃(Iris) 데이터를 불러와서 살펴봐요.
코드: ```python
=== WHAT: 붓꽃 데이터 불러오기 ===¶
머신러닝 입문에서 가장 유명한 샘플 데이터야¶
--- WHY: 왜 붓꽃 데이터? ---¶
- 크기가 적당함 (150개)¶
- 이해하기 쉬운 특성들¶
- 분류 문제 연습에 딱 좋음¶
HOW: 데이터 로드¶
iris = load_iris() # 붓꽃 데이터 가져오기
특성 데이터 (X): 꽃잎/꽃받침의 길이와 너비¶
X = iris.data