Skip to main content

교차검증

교차검증(Cross-Validation)은 데이터를 여러 번 분할하여 모델의 성능을 더 안정적으로 추정하는 기법입니다.

학습 목표

  • K-Fold, Stratified K-Fold, Leave-One-Out CV의 차이를 이해합니다.
  • 교차검증 결과를 올바르게 해석할 수 있습니다.
  • Nested CV가 필요한 상황을 판별할 수 있습니다.
  • scikit-learn의 cross_val_score를 활용할 수 있습니다.

왜 중요한가

단일 홀드아웃 분할은 어떤 데이터가 학습/테스트에 포함되느냐에 따라 결과가 크게 달라질 수 있습니다. 교차검증은 이 문제를 해결하여 더 신뢰할 수 있는 성능 추정을 제공합니다.

핵심 개념

K-Fold 교차검증

from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
model = RandomForestClassifier(n_estimators=100, random_state=42)

# 5-Fold 교차검증
scores = cross_val_score(model, X, y, cv=5, scoring="accuracy")
print(f"각 Fold 정확도: {scores}")
print(f"평균 정확도: {scores.mean():.4f} (+/- {scores.std():.4f})")

Stratified K-Fold

클래스 비율을 각 Fold에서 유지합니다. 불균형 데이터에 필수적입니다.
from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skf, scoring="accuracy")
print(f"Stratified K-Fold 평균: {scores.mean():.4f}")

Nested CV (모델 선택 + 성능 추정)

하이퍼파라미터 튜닝과 성능 추정을 동시에 수행할 때 사용합니다.
from sklearn.model_selection import cross_val_score, GridSearchCV

# 외부 루프: 성능 추정
# 내부 루프: 하이퍼파라미터 최적화
param_grid = {"n_estimators": [50, 100], "max_depth": [3, 5, None]}
inner_cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
outer_cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

grid_search = GridSearchCV(model, param_grid, cv=inner_cv, scoring="accuracy")
nested_scores = cross_val_score(grid_search, X, y, cv=outer_cv, scoring="accuracy")
print(f"Nested CV 평균: {nested_scores.mean():.4f} (+/- {nested_scores.std():.4f})")

CV 방법 비교

방법K적합한 상황계산 비용
K-Fold5-10일반적 사용중간
Stratified K-Fold5-10불균형 데이터중간
Leave-One-Outn데이터 매우 적음 (< 100)높음
Repeated K-Fold5-10 x 반복안정적 추정 필요높음
TimeSeriesSplit5-10시계열 데이터중간
일반적으로 K=5 또는 K=10을 사용합니다. K가 크면 편향은 줄지만 분산이 증가하고 계산 비용이 높아집니다. 데이터가 1000건 이상이면 K=5, 그보다 적으면 K=10을 권장합니다.
아닙니다. 교차검증은 모델 선택과 하이퍼파라미터 튜닝에 사용합니다. 최종 모델의 성능은 교차검증에 전혀 사용되지 않은 테스트 세트로 1회 평가해야 합니다.

체크리스트

  • K-Fold와 Stratified K-Fold의 차이를 설명할 수 있다
  • cross_val_score 결과를 올바르게 해석할 수 있다
  • Nested CV가 필요한 상황을 판별할 수 있다
  • 시계열 데이터에 적합한 CV 방법을 선택할 수 있다

다음 문서