교차검증(Cross-Validation)이 필요한 이유와 기법 선택 기준

데이터를 한 번만 나눠 평가하는 방식의 한계와, K-Fold·계층적 K-Fold·LOOCV·시계열 교차검증을 상황별로 선택하는 기준을 정리한다.

2026-08-13 · 최초 발행 2025-05-23

한 번의 분할로는 알 수 없는 것

데이터를 훈련용과 테스트용으로 한 번만 나눠 평가하면, 그 점수가 하필 그 분할에서 우연히 잘(혹은 못) 맞은 결과일 가능성을 배제할 수 없다. 교차검증(Cross Validation)은 데이터를 여러 방식으로 반복해서 나누고 평가함으로써 이 문제를 해결하는 방법론이다. 머신러닝 모델 개발 과정에서 교차검증은 모델의 일반화 성능을 정확히 측정하고, 하이퍼파라미터 튜닝을 통한 모델 최적화에 필수적인 요소로 쓰인다.

교차검증이 풀어주는 문제는 다음과 같다.

  • 데이터 편중 문제: 특정 데이터 세트에만 최적화된 모델은 실제 환경에서 성능 저하 발생
  • 과적합 방지: 학습 데이터에만 과도하게 최적화되는 문제 예방
  • 모델 강건성 확보: 다양한 데이터 분포에서의 모델 성능 검증 가능
  • 하이퍼파라미터 최적화: 다양한 설정에서 모델 성능을 체계적으로 비교 가능
  • 제한된 데이터 환경 극복: 데이터가 부족한 상황에서도 신뢰성 있는 평가 가능

방법론마다 다른 트레이드오프

교차검증은 데이터를 나누는 방식에 따라 여러 갈래로 나뉜다. 어떤 방식을 고를지는 데이터 규모, 클래스 분포, 시간 순서 여부에 달려 있다.

K-Fold 계열

전체 데이터셋을 K개의 동일한 크기의 폴드(fold)로 나누고, 매 반복마다 하나의 폴드를 테스트로 나머지를 학습으로 사용해 K번 반복하는 방식이다. 데이터가 충분히 많고 모든 데이터를 골고루 검증에 활용하고 싶을 때, 그리고 K번 반복 학습을 감당할 계산 자원이 있을 때 우선 고려한다. K=5 또는 K=10을 흔히 쓰며, 계산 비용은 K에 비례해 늘어난다. 구체적인 절차와 구현, 변형 기법은 이 방식만 따로 다루는 별도 글에서 더 깊이 짚는다.

반복 K반복 2반복 1전체 데이터셋Fold 1Fold 2Fold 3...Fold K테스트 데이터학습 데이터테스트 데이터학습 데이터테스트 데이터학습 데이터

계층적 K-Fold 교차검증(Stratified K-Fold)

불균형 데이터셋에서 각 폴드가 원본 데이터의 클래스 분포를 보존하도록 설계된 방식이다. 특정 클래스의 데이터가 현저히 적은 불균형 데이터셋에서, 일반 K-Fold를 쓰면 폴드마다 클래스 비율이 들쭉날쭉해질 수 있다. 각 폴드에서 클래스 비율이 유지되어야 하는 상황이라면 이 방식을 선택한다.

원본 데이터: 클래스0 80%,클래스1 20%일반 K-Fold: 불균형 발생 가능계층적 K-Fold: 모든 폴드에서클래스0 80%, 클래스1 20%유지

Leave-One-Out 교차검증(LOOCV)

극단적인 형태의 K-Fold로, K=N(데이터 샘플 수)인 경우다. 각 반복에서 데이터 포인트 하나만 테스트 세트로 쓰고 나머지 N-1개로 모델을 학습한 뒤 N번 반복한다. 데이터를 최대한 활용할 수 있다는 장점이 있지만 계산 비용이 매우 높아, 데이터셋이 작을 때만 현실적인 선택지다.

시계열 교차검증(Time Series Cross Validation)

시간 순서가 중요한 데이터에는 앞의 방식들을 그대로 적용할 수 없다. 학습 데이터가 항상 검증 데이터보다 시간적으로 선행하도록 윈도우를 이동시키며 검증하는 방식으로, 롤링 윈도우(Rolling Window) 또는 확장 윈도우(Expanding Window) 방식을 쓴다. 미래 정보가 학습에 섞여 들어가는 데이터 누수(Data Leakage)를 막는 것이 핵심이다.

시계열 교차검증윈도우 1: 학습윈도우 1: 검증윈도우 2: 학습윈도우 2: 검증윈도우 3: 학습윈도우 3: 검증과거 데이터현재 데이터미래 데이터

교차검증으로 모델을 최적화하는 방법

하이퍼파라미터 튜닝

하이퍼파라미터 후보 정의교차검증 수행평균 성능 평가최적 하이퍼파라미터 선택최종 모델 학습
  • 그리드 서치(Grid Search): 하이퍼파라미터 공간을 격자 형태로 탐색하며 모든 조합을 시도해 최적값을 찾는다. 예를 들어 학습률=[0.01, 0.1, 0.5], 은닉층=[1, 2, 3]이면 9가지 조합을 모두 탐색한다.
  • 랜덤 서치(Random Search): 하이퍼파라미터 공간에서 무작위로 샘플링해 탐색한다. 일반적으로 그리드 서치보다 효율적이고, 계산 자원이 제한적일 때 유용하다.
  • 베이지안 최적화(Bayesian Optimization): 이전 평가 결과를 활용해 다음 탐색 영역을 정한다. 효율적인 탐색으로 최적값을 빠르게 찾을 수 있어 계산 비용이 높은 딥러닝 모델에 적합하다.

피처 선택(Feature Selection)

교차검증을 통해 최적의 피처 조합을 선택하는 과정이다.

  • 전진 선택법(Forward Selection): 빈 피처 세트에서 시작해 성능이 향상되는 피처를 점진적으로 추가한다. 각 단계에서 교차검증으로 성능을 평가한다.
  • 후진 제거법(Backward Elimination): 모든 피처로 시작해 성능 저하를 최소화하는 피처를 점진적으로 제거한다. 각 제거 단계에서 교차검증으로 성능을 확인한다.
  • 재귀적 피처 제거(RFE): 모델 가중치 기반으로 중요도가 낮은 피처를 순차적으로 제거하고, 교차검증으로 최적 피처 수를 결정한다.

사이킷런으로 확인하는 실제 동작

5-Fold로 정확도를 측정하기

from sklearn.model_selection import KFold, cross_val_score
from sklearn.ensemble import RandomForestClassifier
import numpy as np

# 데이터 준비
X = feature_data  # 피처 데이터
y = target_data   # 타겟 데이터

# 5-Fold 교차검증 정의
kf = KFold(n_splits=5, shuffle=True, random_state=42)

# 모델 정의
model = RandomForestClassifier(n_estimators=100)

# 교차검증 수행
scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')

# 결과 출력
print(f"개별 폴드 정확도: {scores}")
print(f"평균 정확도: {np.mean(scores):.4f}, 표준편차: {np.std(scores):.4f}")

그리드 서치와 결합하기

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

# 하이퍼파라미터 후보 정의
param_grid = {
    'C': [0.1, 1, 10, 100],
    'gamma': [0.001, 0.01, 0.1, 1],
    'kernel': ['rbf', 'linear']
}

# GridSearchCV 설정 (5-Fold 교차검증)
grid_search = GridSearchCV(
    estimator=SVC(),
    param_grid=param_grid,
    cv=5,
    scoring='accuracy',
    refit=True,
    verbose=1
)

# 그리드 서치 수행
grid_search.fit(X_train, y_train)

# 최적 하이퍼파라미터 및 성능 출력
print(f"최적 하이퍼파라미터: {grid_search.best_params_}")
print(f"최적 정확도: {grid_search.best_score_:.4f}")

# 테스트 세트에서 최종 평가
final_model = grid_search.best_estimator_
test_accuracy = final_model.score(X_test, y_test)
print(f"테스트 세트 정확도: {test_accuracy:.4f}")

실무에서 주의할 점들

계산 복잡성 관리

K-Fold 교차검증은 모델을 K번 학습해야 하므로 계산 비용이 늘어난다. 대규모 데이터셋에서는 K 값을 작게 설정(예: K=3)하고, 계산 비용이 높은 모델은 병렬 처리를 활용하며, 초기 단계에는 작은 데이터 샘플로 검증한 뒤 확장하는 식으로 관리한다.

데이터 누수(Data Leakage) 방지

테스트 데이터의 정보가 학습 과정에 유입되면 성능이 과대평가된다. 전처리 과정을 교차검증 내부에서 수행하고, 피처 선택을 각 폴드 내에서 독립적으로 수행하며, 시계열 데이터는 시간 순서를 보존해야 한다.

올바른 방법데이터 분할 폴드별 독립적 전처리모델 학습 평가잘못된 방법전체 데이터 전처리데이터 분할모델 학습 평가

평가 지표 선택

  • 분류 문제: 균형 데이터는 정확도(Accuracy), 불균형 데이터는 F1-점수·AUC-ROC·정밀도-재현율 곡선
  • 회귀 문제: MSE(평균 제곱 오차), MAE(평균 절대 오차), R²
  • 순위 문제: NDCG, MAP, MRR

앙상블 기법과의 결합

교차검증 결과를 앙상블하면 성능 향상을 도모할 수 있다.

  • 교차검증 앙상블(Cross-Validation Ensembling): K-Fold 교차검증을 수행하고, 각 폴드에서 학습된 K개의 모델을 보존한 뒤, 모든 모델의 예측을 결합(투표 또는 평균)해 최종 예측을 만든다.
  • 스태킹(Stacking): 여러 기본 모델에 대해 교차검증을 수행하고, 각 모델의 교차검증 예측 결과를 새로운 피처로 사용해 메타 모델을 학습, 최종 예측을 만든다.

도메인별로 다르게 적용되는 이유

금융 산업: 신용 위험 모델링

대출 상환 능력 예측 모델을 개발할 때는 시간 기반 교차검증으로 경제 사이클 변화를 고려하고, 불균형 데이터(채무불이행 비율이 낮음)에는 계층적 교차검증을 적용하며, FPR·FNR 같은 비용-민감도 지표로 평가한다.

헬스케어: 질병 진단 모델

의료 영상에서 종양을 탐지하는 AI를 개발할 때는 병원별 데이터 특성을 고려한 그룹 기반 교차검증을 쓰고, 환자 ID 기준으로 분할해 같은 환자의 데이터가 학습·테스트에 중복되지 않도록 설계하며, 진단 정확도와 민감도·특이도의 균형을 최적화한다.

추천 시스템: 사용자 행동 예측

전자상거래 플랫폼의 제품 추천 모델은 사용자-아이템 상호작용의 시간 순서를 보존하는 시계열 교차검증을 쓰고, 콜드스타트 문제를 시뮬레이션하기 위한 사용자 기반 분할을 적용하며, CTR·구매전환율 등 다양한 추천 지표로 평가한다.

교차검증머신러닝모델평가과적합하이퍼파라미터튜닝