콘텐츠로 이동

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

정답