데이터 분할: 훈련 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
를 사용할 수 있습니다.
Quiz
0 / 1
머신러닝에서 데이터셋을 학습 세트와 테스트 세트로 나누는 주된 이유는 무엇인가요?
데이터셋의 크기를 줄이기 위해서
데이터셋의 균형을 맞추기 위해서
모델이 보지 못한 데이터에 얼마나 잘 일반화하는지 평가하기 위해서
모델의 복잡도를 높이기 위해서
학습 자료
AI 튜터
디자인
업로드
수업 노트
즐겨찾기
도움말