학습 자료

데이터 분할: 훈련 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 튜터

디자인

업로드

수업 노트

즐겨찾기

도움말