C.W.K.
Stream
Lesson 05 of 06 · published

Train/Val/Test 분할: 자기기만 막는 규율

~6 min · train-test-split, validation, leakage

Level 0수학 초심자
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

세 데이터셋, 세 역할

  • 학습셋 — 모델이 봐. Weight 갱신.
  • 검증셋 — 모델이 절대 학습 X. 하이퍼파라미터 (모델 크기, 학습률, 정규화 강도) 튜닝에 사용.
  • 테스트셋 — 모델이 절대 학습 X AND 너도 절대 튜닝 X. 끝에 한 번 사용해 실전 성능 추정.

왜 셋 다

train + test 만 있으면, 테스트 성능 보면서 하이퍼파라미터 튜닝하고 싶은 유혹 — 테스트셋이 비밀스럽게 학습 데이터 됨. 최종 보고 숫자 = 낙관적. 검증셋이 튜닝 흡수, 테스트셋 진짜 hold out 으로 남음.

흔한 재앙

  • 데이터 leakage — 테스트 데이터가 학습에 sneak (종종 전처리 통해). 학습 통계만으로 표준화, 전체 데이터셋 X.
  • 테스트셋 peek — 개발 중 테스트셋 반복 실행. 충분 peek 후 테스트셋 오염.
  • 시계열 leakage — 시간 데이터에서 미래가 과거로 leak. 시계열은 늘 시간순 분할.
Kaggle 리더보드 효과. 상위 팀이 가끔 public 리더보드 (사실상 검증셋) overfit, private (테스트) 리더보드에서 극적으로 떨어짐. 수학이 peek 처벌 — 집계된 peek 도.
테스트셋은 신성. 한 번 봐. 두 번 = 평가 오염.

Code

scikit-learn 으로 3-way 분할·python
import numpy as np
from sklearn.model_selection import train_test_split

X = np.random.randn(1000, 10)
y = np.random.randint(0, 2, 1000)

# 두 단계 분할: 60% train, 20% val, 20% test
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.25, random_state=42)

print(f"train: {len(X_train)}, val: {len(X_val)}, test: {len(X_test)}")

External links

Exercise

표 데이터셋 (임의 또는 실제), 60/20/20 train/val/test 분할. 학습셋 통계 (평균, std) 만으로 표준화. 같은 변환을 val 과 test 에 적용. 왜 중요?
Hint
전체 데이터셋에 mean/std 계산하면 val/test 가 전처리 중 자기 분포 정보 봄 — leakage. 학습 한 번 계산, 같은 숫자를 val/test 재사용.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.