🔁 교차검증(Cross-Validation) 완전 정복 🌈
📘 모델의 ‘진짜 실력’을 확인하는 가장 공정한 방법!
🎯 1️⃣ 교차검증이란?
머신러닝 모델이 새로운 데이터(미래 데이터) 에서도 잘 작동하는지를 확인하기 위해
데이터를 여러 번 나눠 훈련(train) 과 검증(validation) 을 반복하는 방법이에요 🔄
👉 한 번만 나누는 홀드아웃(Hold-out) 보다 훨씬 안정적이고
👉 과적합(Overfitting) 을 미리 막을 수 있어요 💪
🧩 2️⃣ 교차검증 방법 한눈 정리표
| 방법 | 핵심 아이디어 | 장점 | 단점 | 사용 상황 |
| 🧱 홀드아웃(Hold-out) | 한 번만 나눠서 Train/Valid 평가 | 빠름, 간단 | 분할 운에 좌우됨 😅 | 데이터 많고 탐색 단계 |
| 🔄 k-겹 교차검증(k-Fold) | k번 나눠 번갈아 검증 | 안정적 평균 | 계산량 ↑ | 표준 실전용 (k=5~10) |
| ⚖️ 층화 k-겹(Stratified k-Fold) | 클래스 비율 유지 | 불균형에 강함 | – | 분류 문제 기본 |
| 🔁 반복 k-겹(Repeated k-Fold) | 여러 번 셔플 반복 | 평균 안정 ↑ | 시간 ↑ | 데이터 적을 때 |
| 👨👩👧 그룹 k-겹(Group k-Fold) | 그룹 단위로 분리 | 누수 방지 | 그룹 지정 필요 | 고객/환자 등 동일 그룹 |
| 📘 LOOCV | 1개 검증, 나머지 학습 | 데이터 최대 활용 | 매우 느림 😵 | 소형 데이터 |
| 💫 LpOCV | p개 검증, 나머지 학습(조합 반복) | 편향↓, 정교함 | 계산량 폭발💥 | n 작고 p 작을 때 |
| ⏰ 시계열 CV | 과거→미래로만 검증 | 누수 방지 | 구현 복잡 | 시계열 문제 |
🧱 3️⃣ 홀드아웃 검증 (Hold-out Validation)
가장 단순한 검증법이에요 👇
- 데이터를 훈련용 80% + 검증용 20% 으로 한 번만 나눠 모델 평가
- 분류 문제에서는 층화(Stratify) 로 클래스 비율을 유지
- 시계열은 시간 순서대로 분할(과거→미래) 해야 해요 ⏱️
✅ 장점
- 빠르고 간단! 모델 탐색 단계에 딱이에요 ⚡
⚠️ 단점
- 한 번만 나누기 때문에, 분할 운(운빨)에 따라 결과가 흔들릴 수 있어요 😅
- 그래서 최종 평가에는 보통 k-겹 교차검증을 사용합니다.
🧮 4️⃣ LpOCV (Leave-p-Out Cross-Validation)
💡 LOOCV(Leave-One-Out) 의 확장판이에요.
즉, 한 번에 p개의 데이터만 검증용으로 두고, 나머지는 학습에 사용합니다.
📘 예를 들어
- 데이터 10개 중 2개(p=2)를 검증에 사용 → 조합 가능한 모든 경우의 수로 반복
✅ 장점
- 매우 정교하고, 편향(Bias) 이 적음
- 작은 데이터셋에서 정확한 일반화 성능 확인 가능
⚠️ 단점
- 조합 수가 C(n, p) 로 폭발적이에요 💣
- → n=100, p=2이면 4,950번 반복 😱
- 그래서 실전에서는 거의 사용되지 않지만,
- 시험에선 개념적으로 출제돼요!
📊 5️⃣ k-겹 교차검증 (k-Fold CV)
📘 데이터를 k개의 폴드(fold) 로 나눈 뒤,
한 폴드씩 번갈아 검증하고 나머지 k−1개로 학습합니다.
예시 👉 5-Fold라면
- Fold 1: 검증, 나머지 4개 Train
- Fold 2: 검증, 나머지 4개 Train
- … 이렇게 총 5번 반복 후 평균 성능 계산 ✨
✅ 안정적 평균으로 운빨 제거
✅ 과적합 여부 파악 가능
📌 일반적으로 k=5 또는 10 사용!
🧭 6️⃣ 시계열 교차검증 (Time-Series CV)
⏰ 시계열 데이터는 시간 순서가 중요해요!
- 과거 데이터로 학습 → 미래 데이터로 검증
- 절대 무작위 섞으면 ❌ 미래 정보 누수 발생
📘 예시
- Expanding: (2019)→2020, (2019-20)→2021, (2019-21)→2022
- Rolling: (2019)→2020, (2020)→2021 … (윈도우 굴림)
🧯 7️⃣ 데이터 누수(Leakage) 방지 체크리스트 ✅
| 항목 | 주의 포인트 |
| ⚙️ 전처리 | fit은 Train에서만, Valid/Test엔 transform만 |
| ⏱️ 시계열 | 미래 정보 금지 (시간 순서 유지) |
| 👨👩 그룹 데이터 | 동일 그룹이 Train/Valid에 동시에 등장 금지 |
| 🧮 파생 변수 | 라벨 정보 포함된 파생 변수 생성 금지 |
⚙️ 8️⃣ 교차검증 + 튜닝의 황금 조합 🎛️
- 그리드/랜덤/베이지안 서치 × (층화) k-겹 CV
- 조기 종료(Early Stopping) 기준은 CV의 검증 점수
- 공정한 모델 비교엔 Nested CV 사용
- (바깥 루프 → 성능 평가 / 안쪽 루프 → 튜닝)
📏 9️⃣ 분할 비율 & k값 가이드
| 방법 | 비율 / k값 | 특징 |
| 🧱 홀드아웃 | Train : Valid = 8 : 2 또는 7 : 3 | 탐색용, 빠름 |
| 🔄 k-겹 | k = 5 (기본), k = 10 (데이터 적을 때 안정↑) | 표준 실전용 |
| 💫 LpOCV | p = 1~2 (LOOCV 포함) | 소형 데이터 전용, 계산량 주의 |
🧾 10️⃣ 시험에 자주 나오는 포인트 ✍️
✅ 홀드아웃은 가장 간단한 검증법, 빠르지만 운에 좌우됨
✅ k-겹은 데이터 효율과 안정성 모두 좋음
✅ LOOCV = LpOCV(p=1)의 특수형
✅ 시계열 CV는 시간 순서 유지가 생명
✅ 전처리 fit / transform 분리 안 하면 데이터 누수!
🌈 11️⃣ 한 줄 요약
💬 “홀드아웃은 빠르고 간단,
k-겹은 표준 실전용,
LpOCV는 작은 데이터에서 정교하지만 계산이 많다!”
⚡ 핵심은 데이터 특성에 맞게 검증법을 선택하고,
전처리는 반드시 ‘폴드 안에서만 fit’ 하는 것!