교차 검증 (Cross-Validation)
핵심 요약: 교차 검증(Cross-Validation)은 데이터를 K등분해서, 각 조각을 돌아가며 테스트용으로 사용하는 방법이다. 한 번 나누는 것보다 훨씬 안정적인 성능 추정을 제공한다. 시험 문제를 한 세트만 풀면 운이 좌우하지만, 10세트를 풀면 실력이 드러나는 것과 같은 원리다.
모델의 성능을 추정할 때, 단일 훈련/테스트 분할(데이터를 한 번만 나누는 것)은 분할 방법에 따라 결과가 크게 달라지는 노이즈가 많은 추정이다. 교차 검증(Cross-Validation, CV)은 데이터를 여러 번 다르게 분할하여 모든 데이터를 훈련과 검증에 모두 사용하면서도 일반화 성능의 안정적인 추정치를 얻는 방법이다.
교차 검증은 단순한 평가 기법이 아니라, 하이퍼파라미터 튜닝과 모델 선택의 기반이 된다.
탄생 배경
섹션 제목: “탄생 배경”교차 검증의 아이디어 자체는 1930년대 통계학까지 거슬러 올라가지만, 오늘날의 “k=10이 표준”이라는 실무 관행은 Ron Kohavi의 1995년 논문 “A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection”에 크게 기인한다. Kohavi는 다양한 데이터셋과 분류기에 대해 Leave-One-Out CV, 2-fold, 5-fold, 10-fold, 20-fold 등을 체계적으로 비교하는 대규모 경험적 연구(empirical study)를 수행했다. 핵심 발견은 다음과 같았다: LOOCV는 이론적으로 편향이 낮지만 분산이 매우 높아 불안정했고, 작은 k(예: 2-fold)는 편향이 높아 성능을 과소 추정했다. 10-fold 층화 교차 검증(Stratified 10-fold CV)이 편향과 분산 사이에서 가장 좋은 균형을 보였으며, 대부분의 데이터셋에서 안정적인 성능 추정을 제공했다. 이 연구는 이후 수천 편의 논문에서 인용되었고, scikit-learn 등 주요 ML 라이브러리의 기본 설정(default k=5 또는 10)에도 직접적인 영향을 미쳤다.
핵심 개념
섹션 제목: “핵심 개념”k-Fold 교차 검증
섹션 제목: “k-Fold 교차 검증”데이터를 개의 동일한 크기의 부분집합(fold, 접힌 조각이라는 뜻)으로 나누고, 각 반복에서 1개 fold를 검증에, 나머지 개를 훈련에 사용한다. 번 반복하면 모든 데이터가 정확히 한 번씩 검증에 사용된다.
숫자로 이해하기
섹션 제목: “숫자로 이해하기”100개의 데이터로 5-Fold CV를 수행한다고 하자:
Fold 훈련 데이터 테스트 데이터 정확도 1 데이터 21~100 (80개) 데이터 1~20 (20개) 85% 2 데이터 1 20 + 41100 (80개)데이터 21~40 (20개) 82% 3 데이터 1 40 + 61100 (80개)데이터 41~60 (20개) 88% 4 데이터 1 60 + 81100 (80개)데이터 61~80 (20개) 84% 5 데이터 1~80 (80개) 데이터 81~100 (20개) 86% CV Score = (85 + 82 + 88 + 84 + 86) / 5 = 85.0% +- 2.1%
만약 Fold 3만 사용했다면 “정확도 88%“라고 낙관적으로 보고했을 것이다. 5-Fold CV를 통해 더 현실적인 85%를 얻었다.
보고: 평균과 표준편차를 함께 보고한다.
k 선택의 편향-분산 트레이드오프:
| k 값 | 편향 | 분산 | 계산 비용 |
|---|---|---|---|
| 작은 k (예: 2) | 높음 (적은 훈련 데이터) | 낮음 | 낮음 |
| 큰 k (예: 20) | 낮음 | 높음 (fold 간 유사) | 높음 |
| k = 5 또는 10 | 적절한 균형 | 적절한 균형 | 보통 |
Kohavi (1995)의 연구에 따르면, k = 10이 일반적으로 좋은 절충점이다. 층화(stratified) 10-fold가 실무 기본값으로 많이 사용된다.
상세 내용
섹션 제목: “상세 내용”층화 k-Fold (Stratified k-Fold)
섹션 제목: “층화 k-Fold (Stratified k-Fold)”각 fold에서 클래스 분포를 원본과 동일하게 유지한다. 불균형 분류에서 필수적이다.
- 분류: 각 fold의 양성/음성 비율이 전체 데이터와 동일
- 회귀: 목표 변수를 구간(bin)으로 나누어 층화 가능
층화하지 않으면, 특정 fold에 소수 클래스가 매우 적거나 아예 없을 수 있어 성능 추정이 불안정해진다.
Leave-One-Out 교차 검증 (LOOCV)
섹션 제목: “Leave-One-Out 교차 검증 (LOOCV)”(각 fold에 샘플 하나). 즉, 매번 1개 샘플만 빼고 나머지 전부로 훈련한다.
- 장점: 거의 비편향적 일반화 오차 추정 (훈련 데이터 개 사용)
- 단점: 분산이 매우 높고, 계산 비용이 큼 (번 훈련)
- 특수한 경우: 선형 모델에서는 Hat matrix 를 이용해 한 번의 학습으로 LOOCV를 정확히 계산할 수 있다
- 사용 시기: 데이터가 매우 적을 때 (수십 개 수준)
반복 k-Fold (Repeated k-Fold)
섹션 제목: “반복 k-Fold (Repeated k-Fold)”k-fold를 서로 다른 무작위 분할로 여러 번 반복한다.
- 효과: 성능 추정의 분산을 줄인다
- 일반적 설정: 5x2 CV (2-fold를 5회 반복), 10x10 CV (10-fold를 10회 반복)
- 비용: 반복 횟수 만큼 훈련이 필요
시계열 교차 검증 (Time-Series Split)
섹션 제목: “시계열 교차 검증 (Time-Series Split)”시계열 데이터에서 표준 k-fold는 미래 데이터로 과거를 예측하는 데이터 누수(Data Leakage, 테스트 정보가 훈련에 새어 들어가는 것)를 발생시킨다.
| 방법 | 설명 |
|---|---|
| 확장 윈도우 (Expanding Window) | 훈련 기간이 점차 늘어남: 로 훈련, 로 테스트 |
| 슬라이딩 윈도우 (Sliding Window) | 고정 길이 훈련: 로 훈련, 로 테스트 |
| Gap 추가 | 자기상관(autocorrelation) 누수 방지를 위해 훈련과 테스트 사이에 간격 |
| Walk-Forward | 실제 운영 환경 모사: 시간이 지남에 따라 모델을 재학습 |
그룹 k-Fold (Group k-Fold)
섹션 제목: “그룹 k-Fold (Group k-Fold)”그룹 내 샘플들이 상관될 때 (예: 한 환자의 여러 검사 결과, 한 사용자의 여러 클릭), 같은 그룹의 모든 샘플이 같은 fold에 있어야 한다.
- 그룹 간에 데이터가 나뉘어야만 진정한 일반화 성능을 측정할 수 있다
- 그룹을 무시하면 같은 환자의 데이터가 훈련과 테스트에 동시에 들어가 누수가 발생한다
중첩 교차 검증 (Nested Cross-Validation)
섹션 제목: “중첩 교차 검증 (Nested Cross-Validation)”- 외부 루프: 일반화 성능 추정
- 내부 루프: 하이퍼파라미터 튜닝 / 모델 선택
- 필요한 이유: 같은 CV를 튜닝과 평가에 모두 사용하면 낙관적 편향 발생
- 계산 비용: 번 학습
- 일반적 설정: 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 + 통계적 검정
실전 사례
섹션 제목: “실전 사례”한 데이터 과학 팀이 고객 이탈 예측(Customer Churn Prediction) 모델을 개발하면서, 전체 데이터에 대해 먼저 StandardScaler로 스케일링(Scaling)과 PCA(주성분 분석)를 적용한 후 10-fold 교차 검증을 수행했다. 결과는 AUC 0.92로 매우 우수했다. 그러나 완전히 새로운 테스트 데이터(hold-out set)에 배포하자 AUC가 0.78로 급락했다. 원인은 전형적인 전처리 누수(Preprocessing Leakage)였다 — 스케일링과 PCA를 CV 루프 밖에서 수행했기 때문에, 검증 fold의 통계 정보(평균, 분산, 주성분 방향)가 훈련에 이미 반영되어 있었다. 이 팀이 sklearn의 Pipeline을 사용하여 전처리를 CV 루프 안으로 옮기자, CV 점수는 0.81로 정직하게 내려왔고, 새 데이터에서의 실제 성능(0.79)과 거의 일치했다. 0.92에서 0.78로의 14%p 격차가 순전히 전처리 누수에서 발생한 것이다.
흔한 오해와 함정
섹션 제목: “흔한 오해와 함정”-
“전처리를 CV 밖에서 해도 된다” — 스케일링, 특성 선택 등 전처리는 반드시 CV 루프 안에서 수행해야 한다. 전체 데이터로 전처리하면 검증 세트 정보가 훈련에 누수된다. 이것이 가장 흔한 실수 중 하나다.
-
“표준 k-fold는 모든 데이터에 적용된다” — k-fold는 i.i.d. (독립 동일 분포) 가정을 한다. 시계열, 공간 데이터, 그룹 구조 데이터에서는 이 가정이 깨진다.
-
“LOOCV가 항상 최선이다” — LOOCV는 편향은 낮지만 분산이 매우 높다. fold 간 훈련 세트가 거의 동일하기 때문이다. 대부분의 경우 10-fold가 더 좋은 성능 추정을 준다.
-
“CV 점수의 평균만 보면 된다” — 표준편차도 반드시 보고해야 한다. 평균은 같지만 분산이 다른 모델은 안정성이 다르다.
-
“CV로 성능을 추정하면서 동시에 하이퍼파라미터를 튜닝할 수 있다” — 같은 CV를 두 목적에 사용하면 추정이 낙관적으로 편향된다. 중첩 CV를 사용해야 한다.
-
“데이터가 많으면 CV가 필요 없다” — 데이터가 충분하면 단일 hold-out도 괜찮을 수 있지만, CV는 성능 추정의 분산을 줄여주므로 여전히 가치가 있다.
다른 주제와의 연결
섹션 제목: “다른 주제와의 연결”- 편향-분산 트레이드오프: k 선택 자체가 편향-분산 트레이드오프; CV로 과적합/과소적합 진단
- 모델 선택 기준: AIC/BIC는 CV의 빠른 근사; 정보 기준 vs CV 비교
- 통계적 검정: CV 결과에 기반한 모델 비교 검정 (corrected t-test, 5x2 CV test)
- 혼동 행렬과 분류 지표: CV 각 fold에서 계산하는 지표
- 회귀 지표: CV로 회귀 지표를 안정적으로 추정