콘텐츠로 이동

교차 검증 (Cross-Validation)

개요

모델의 성능을 추정할 때, 단일 훈련/테스트 분할은 분할 방법에 따라 결과가 크게 달라지는 노이즈가 많은 추정이다. 교차 검증(Cross-Validation, CV)은 데이터를 여러 번 다르게 분할하여 모든 데이터를 훈련과 검증에 모두 사용하면서도 일반화 성능의 안정적인 추정치를 얻는 방법이다.

교차 검증은 단순한 평가 기법이 아니라, 하이퍼파라미터 튜닝과 모델 선택의 기반이 된다.


핵심 개념

k-Fold 교차 검증

데이터를 \(k\)개의 동일한 크기의 부분집합(fold)으로 나누고, 각 반복에서 1개 fold를 검증에, 나머지 \(k-1\)개를 훈련에 사용한다. \(k\)번 반복하면 모든 데이터가 정확히 한 번씩 검증에 사용된다.

gantt
    title 5-Fold 교차 검증
    dateFormat X
    axisFormat %s
    section Fold 1
    검증 : 0, 1
    훈련 : 1, 5
    section Fold 2
    훈련 : 0, 1
    검증 : 1, 2
    훈련 : 2, 5
    section Fold 3
    훈련 : 0, 2
    검증 : 2, 3
    훈련 : 3, 5
    section Fold 4
    훈련 : 0, 3
    검증 : 3, 4
    훈련 : 4, 5
    section Fold 5
    훈련 : 0, 4
    검증 : 4, 5

보고: 평균과 표준편차를 함께 보고한다.

\[\text{CV Score} = \frac{1}{k}\sum_{i=1}^{k} \text{Score}_i \quad \pm \quad \text{std}(\text{Score}_1, \ldots, \text{Score}_k)\]

k 선택의 편향-분산 트레이드오프:

k 값 편향 분산 계산 비용
작은 k (예: 2) 높음 (적은 훈련 데이터) 낮음 낮음
큰 k (예: 20) 낮음 높음 (fold 간 유사) 높음
k = 5 또는 10 적절한 균형 적절한 균형 보통

Kohavi (1995)의 연구에 따르면, k = 10이 일반적으로 좋은 절충점이다. 층화(stratified) 10-fold가 실무 기본값으로 많이 사용된다.


상세 내용

층화 k-Fold (Stratified k-Fold)

각 fold에서 클래스 분포를 원본과 동일하게 유지한다. 불균형 분류에서 필수적이다.

  • 분류: 각 fold의 양성/음성 비율이 전체 데이터와 동일
  • 회귀: 목표 변수를 구간(bin)으로 나누어 층화 가능

층화하지 않으면, 특정 fold에 소수 클래스가 매우 적거나 아예 없을 수 있어 성능 추정이 불안정해진다.


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

\(k = n\) (각 fold에 샘플 하나). 즉, 매번 1개 샘플만 빼고 나머지 전부로 훈련한다.

  • 장점: 거의 비편향적 일반화 오차 추정 (훈련 데이터 \(n-1\)개 사용)
  • 단점: 분산이 매우 높고, 계산 비용이 큼 (\(n\)번 훈련)
  • 특수한 경우: 선형 모델에서는 Hat matrix \(h_{ii}\)를 이용해 한 번의 학습으로 LOOCV를 정확히 계산할 수 있다
  • 사용 시기: 데이터가 매우 적을 때 (수십 개 수준)

반복 k-Fold (Repeated k-Fold)

k-fold를 서로 다른 무작위 분할로 여러 번 반복한다.

  • 효과: 성능 추정의 분산을 줄인다
  • 일반적 설정: 5x2 CV (2-fold를 5회 반복), 10x10 CV (10-fold를 10회 반복)
  • 비용: 반복 횟수 \(\times\) \(k\)만큼 훈련이 필요

시계열 교차 검증 (Time-Series Split)

시계열 데이터에서 표준 k-fold는 미래 데이터로 과거를 예측하는 데이터 누수(data leakage)를 발생시킨다.

gantt
    title 시계열 교차 검증 (Expanding Window)
    dateFormat X
    axisFormat %s
    section Split 1
    훈련 : 0, 2
    테스트 : 2, 3
    section Split 2
    훈련 : 0, 3
    테스트 : 3, 4
    section Split 3
    훈련 : 0, 4
    테스트 : 4, 5
    section Split 4
    훈련 : 0, 5
    테스트 : 5, 6
방법 설명
확장 윈도우 (Expanding Window) 훈련 기간이 점차 늘어남: \([1..t]\)로 훈련, \([t+1..t+h]\)로 테스트
슬라이딩 윈도우 (Sliding Window) 고정 길이 훈련: \([t-w..t]\)로 훈련, \([t+1..t+h]\)로 테스트
Gap 추가 자기상관(autocorrelation) 누수 방지를 위해 훈련과 테스트 사이에 간격
Walk-Forward 실제 운영 환경 모사: 시간이 지남에 따라 모델을 재학습

그룹 k-Fold (Group k-Fold)

그룹 내 샘플들이 상관될 때 (예: 한 환자의 여러 검사 결과, 한 사용자의 여러 클릭), 같은 그룹의 모든 샘플이 같은 fold에 있어야 한다.

  • 그룹 간에 데이터가 나뉘어야만 진정한 일반화 성능을 측정할 수 있다
  • 그룹을 무시하면 같은 환자의 데이터가 훈련과 테스트에 동시에 들어가 누수가 발생한다

중첩 교차 검증 (Nested Cross-Validation)

flowchart TD
    A["전체 데이터"] --> B["외부 CV (k_outer fold)"]
    B --> C["Fold 1: 훈련 세트"]
    B --> D["Fold 1: 테스트 세트"]
    C --> E["내부 CV (k_inner fold)"]
    E --> F["최적 하이퍼파라미터 선택"]
    F --> G["선택된 하이퍼파라미터로<br/>훈련 세트 전체 학습"]
    G --> H["테스트 세트에서 평가"]
    H --> I["이 과정을 k_outer번 반복"]
  • 외부 루프: 일반화 성능 추정
  • 내부 루프: 하이퍼파라미터 튜닝 / 모델 선택
  • 필요한 이유: 같은 CV를 튜닝과 평가에 모두 사용하면 낙관적 편향 발생
  • 계산 비용: \(k_{\text{outer}} \times k_{\text{inner}}\)번 학습
  • 일반적 설정: 5x5 또는 10x5

교차 검증 전략 비교

전략 장점 단점 추천 상황
k-Fold (k=10) 좋은 편향-분산 균형 i.i.d. 가정 범용 기본값
Stratified k-Fold 불균형에 강건 i.i.d. 가정 불균형 분류
LOOCV 거의 비편향 높은 분산, 높은 비용 매우 작은 데이터
Repeated k-Fold 낮은 분산 높은 비용 안정적 추정 필요 시
Time-Series Split 시간 순서 보존 초기 fold 훈련 데이터 적음 시계열 데이터
Group k-Fold 그룹 상관 처리 그룹 정보 필요 그룹 구조 데이터
Nested CV 비편향 성능 + 튜닝 매우 높은 비용 공정한 모델 비교

언제 사용하는가

  • 모델의 일반화 성능을 추정할 때 → k-Fold CV (기본값: 층화 10-fold)
  • 하이퍼파라미터 튜닝 + 성능 추정을 동시에 할 때 → 중첩 CV
  • 시계열 데이터를 다룰 때 → 시계열 분할 (절대 표준 k-fold 사용 금지)
  • 환자/사용자 등 그룹 구조가 있을 때 → 그룹 k-Fold
  • 논문에서 모델 비교를 보고할 때 → 반복 k-Fold + 통계적 검정

흔한 오해와 함정

  1. "전처리를 CV 밖에서 해도 된다" — 스케일링, 특성 선택 등 전처리는 반드시 CV 루프 안에서 수행해야 한다. 전체 데이터로 전처리하면 검증 세트 정보가 훈련에 누수된다. 이것이 가장 흔한 실수 중 하나다.

  2. "표준 k-fold는 모든 데이터에 적용된다" — k-fold는 i.i.d. (독립 동일 분포) 가정을 한다. 시계열, 공간 데이터, 그룹 구조 데이터에서는 이 가정이 깨진다.

  3. "LOOCV가 항상 최선이다" — LOOCV는 편향은 낮지만 분산이 매우 높다. fold 간 훈련 세트가 거의 동일하기 때문이다. 대부분의 경우 10-fold가 더 좋은 성능 추정을 준다.

  4. "CV 점수의 평균만 보면 된다" — 표준편차도 반드시 보고해야 한다. 평균은 같지만 분산이 다른 모델은 안정성이 다르다.

  5. "CV로 성능을 추정하면서 동시에 하이퍼파라미터를 튜닝할 수 있다" — 같은 CV를 두 목적에 사용하면 추정이 낙관적으로 편향된다. 중첩 CV를 사용해야 한다.

  6. "데이터가 많으면 CV가 필요 없다" — 데이터가 충분하면 단일 hold-out도 괜찮을 수 있지만, CV는 성능 추정의 분산을 줄여주므로 여전히 가치가 있다.


다른 주제와의 연결