"검증 정확도 80%였는데 운영에서 60%로 떨어졌어요." 학습·검증·테스트 분할이 잘못됐을 가능성이 큽니다. 한 번 분할로는 운에 따라 검증 데이터가 운영 데이터와 너무 유사하거나 다를 수 있습니다. Cross-validation은 같은 데이터를 여러 번 쪼개 학습·평가하면서 진짜 일반화 능력을 측정합니다. ML 기초 시리즈의 마지막 자리.
1. 검증의 한 줄 정의
ML 모델 평가의 한 줄 원칙:
모델이 학습 시 본 적 없는 데이터에서 평가해야 진짜 성능.
학습 데이터에서의 정확도는 의미 없습니다 (overfitting 글 참조). 본 적 없는 데이터에 어떻게 일반화하는지가 진짜 성능.
가장 단순한 분할 — Train/Validation/Test:
| 분할 | 비율 | 역할 |
|---|---|---|
| Train | 70% | 모델 학습 |
| Validation | 15% | 하이퍼파라미터 조정·early stopping |
| Test | 15% | 최종 평가 (1번만 사용) |
이 단순 분할의 한계 — 한 번의 분할로는 운에 따라 결과가 흔들림. 검증 데이터가 우연히 쉬우면 80%, 어려우면 60% 같이.
이 한계를 푸는 도구가 cross-validation.

데이터를 5개로 쪼개고, 1개씩 차례로 검증·나머지 4개로 학습. 5번 반복하면 모든 데이터가 한 번씩 검증에 사용됨.
📌 이 글에서 다루는 것
이 글은 cross-validation의 표준 도구·운영 적용에 집중. 시계열·계층화·이중 CV 같은 변형까지. ML 기초 시리즈의 5편(회귀·분류·손실·overfitting·평가·CV)의 마지막.
2. CV의 전제 — IID 가정과 마케팅 데이터에서 깨지는 이유
K-Fold CV를 쓰기 전에 확인해야 할 전제 조건이 있습니다: IID(Independent and Identically Distributed) 가정입니다.
- Independent(독립): 데이터 포인트들이 서로 영향을 주지 않는다
- Identically Distributed(동일 분포): 학습 데이터와 검증 데이터가 같은 분포에서 왔다
표준 K-Fold CV는 이 두 가정 위에 서 있습니다. 그런데 마케팅 데이터는 이 가정이 자주 깨집니다.
독립성 위반 — 유저 데이터
같은 유저가 1월·2월·3월 세 번 구매했다면, 이 세 행은 독립이 아닙니다. 유저의 취향·구매 습관이라는 공통 요인이 세 데이터를 연결하고 있어요. 표준 K-Fold로 분할하면 1월 구매가 학습에, 2월·3월이 검증에 들어갈 수 있습니다. 모델이 유저 패턴을 학습 데이터에서 "외우고" 검증에서 확인하는 셈이라 가짜 정확도가 나옵니다.
이게 인과추론의 SUTVA(Stable Unit Treatment Value Assumption) 위반과 정확히 같은 구조입니다. 유닛(유저) 간 독립성이 전제돼야 CV가 유의미한 평가를 하는데, 같은 유저의 데이터가 학습·검증에 동시에 있으면 유닛 내 spillover가 평가를 오염시킵니다.
해결책: Group K-Fold — 유저 ID를 그룹으로 지정해 같은 유저가 학습과 검증에 동시에 들어가지 않게.
동일 분포 위반 — 시계열 데이터
광고 클릭 패턴, 구매 행동은 시간이 지나면서 분포가 바뀝니다(distribution shift). 2024년 1월 데이터와 12월 데이터는 같은 분포에서 왔다고 보기 어렵습니다. 표준 K-Fold로 랜덤 분할하면 미래(12월) 정보가 학습에, 과거(1월) 검증에 들어가는 데이터 누수가 발생합니다.
해결책: Time Series CV — 항상 과거로만 학습하고 미래로 검증.
📌 CV 변형 선택의 기준
데이터가 IID인가? → K-Fold 사용 가능
같은 유저/캠페인 반복 데이터인가? → Group K-Fold
시간 순서가 중요한가? → Time Series CV
클래스 불균형인가? → Stratified K-Fold (IID 조건 충족 시)
3. K-Fold Cross-Validation — 표준
K-fold CV의 흐름:
- 데이터를 K개로 균등 분할 (보통 K=5 또는 10)
- K번 반복:
- 1개 fold를 검증, 나머지 K-1개로 학습
- 검증 정확도 기록
- K개 정확도의 평균·표준편차
5-fold CV로 정확도 [82%, 79%, 81%, 80%, 78%] 나오면 평균 80% ± 1.6%. 이 분산이 모델의 진짜 신뢰도.
장점:
- 모든 데이터가 한 번씩 검증에 사용
- 평균·분산을 같이 보고 → 신뢰도 측정
- 작은 데이터셋에 효과적
단점:
- K번 학습 → 학습 시간 K배
- 시계열 데이터는 IID 가정이 깨져서 부적합
python
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.ensemble import GradientBoostingClassifier

