데이터 분할: 훈련 vs 테스트
머신러닝에서는 모델이 보지 못한 데이터에 얼마나 잘 일반화하는지 평가하기 위해 데이터셋을 훈련
세트와 테스트
세트로 나눕니다.
-
훈련 세트
: 모델이 패턴을 학습하는 데 사용됩니다. -
테스트 세트
: 모델이 한 번도 보지 못한 데이터에서의 성능을 확인합니다.
이 둘을 분리하지 않으면 모델이 데이터를 과적합하여 일반 규칙을 배우지 못하고 암기해버릴 수 있습니다.
사이킷런의 train_test_split
사용하기
train_test_split()
은 데이터를 무작위로 훈련/테스트 세트로 나눕니다.
기본 훈련-테스트 분할
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 데이터셋 로드
iris = load_iris()
X, y = iris.data, iris.target
# 훈련(80%) / 테스트(20%)로 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print("훈련 크기:", X_train.shape)
print("테스트 크기:", X_test.shape)
무작위성 제어
random_state
파라미터를 지정하면 재현성이 보장됩니다.
이 파라미터를 지정하지 않으면 실행할 때마다 분할 결과가 달라질 수 있습니다.
고정된 random_state
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=123
)
print("훈련 크기:", X_train.shape)
print("테스트 크기:", X_test.shape)
계층화 분할
분류 문제에서는 stratify=y
를 사용해 클래스 비율을 유지하는 것이 좋습니다.
계층화 분할
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=42
)
# 분포 확인
import numpy as np
unique_train, counts_train = np.unique(y_train, return_counts=True)
unique_test, counts_test = np.unique(y_test, return_counts=True)
print("훈련 분포:", dict(zip(unique_train, counts_train)))
print("테스트 분포:", dict(zip(unique_test, counts_test)))
핵심 정리
- 과적합을 피하려면 항상 학습 전에 데이터를 분할하는 것이 좋습니다.
train_test_split()
을 사용하여 데이터를 분할할 수 있습니다.- 분류 문제에서는 레이블 비율을 보존하기 위해
stratify=y
를 사용할 수 있습니다.
다음 내용이 궁금하다면?
코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!