📊 StratifiedKFold 완전 이해하기
❓ 문제: KFold는 완벽한가?
KFold는 데이터를 무작위로 K조각으로 나눕니다.
하지만 불균형한 클래스가 있는 경우, 일부 Fold에 특정 클래스가 아예 빠질 수 있습니다!
🍬 비유: 간식 나누기
학생 10명 중 초콜릿 좋아하는 학생은 3명뿐이라고 해볼게요.
- KFold: 1~10번 순서대로 나누면, 어떤 그룹엔 초콜릿 좋아하는 사람이 0명일 수도!
- StratifiedKFold: 미리 초콜릿/사탕/쿠키 그룹을 나누고, 각 그룹에서 조금씩 골라서 Fold에 배분
🔍 내부 원리
- 먼저 정답(label)을 기준으로 클래스별 인덱스 목록을 만듭니다.
- 각 클래스 바구니를
n_splits개수만큼 최대한 공평하게 나눕니다. - 각 Fold에 클래스별로 하나씩 넣으면서 구성합니다.
👀 시각 예시 (3-Fold, 클래스 0/1/2)
클래스 0 → [0, 1, 2]
클래스 1 → [3, 4]
클래스 2 → [5, 6, 7, 8, 9]
Fold 1 → 0, 3, 5, 6
Fold 2 → 1, 4, 7, 8
Fold 3 → 2, 9
→ 각 Fold에 모든 클래스가 포함되어 있음 🎯
🚨 현실 문제: 사기 탐지처럼 희귀 클래스일 땐?
예: 전체 10만 건 중 사기 클래스 1% (1,000건)
StratifiedKFold로 나누면 각 Fold에 사기 데이터 200개씩- 하지만 전체 데이터가 너무 커서 사기 클래스가 “희석”됨
✅ 해결 방법 3가지
- Fold 수를 줄이기 → 3-Fold 등으로
- SMOTE 오버샘플링 → 소수 클래스 복제 or 생성
- 평가지표 변경 → accuracy 대신
f1-score,recall,roc_auc
📘 SMOTE 간단 예시
from imblearn.over_sampling import SMOTE
X_resampled, y_resampled = SMOTE().fit_resample(X, y)
🧠 마무리 요약
- StratifiedKFold는 클래스 비율을 유지하며 Fold를 나눠주는 똑똑한 방식
- 불균형 데이터에서 사기 클래스 등 희귀 데이터가 무시되는 문제를 방지
- 하지만 데이터가 너무 크고 클래스가 너무 희귀할 경우엔 오히려 흐려질 수 있음
- 그래서 오버샘플링, 적절한 Fold 수, 정확한 지표 선택이 함께 필요
🌟 진짜 한 줄 정리
StratifiedKFold는 “클래스별로 먼저 정렬하고, 공평하게 Fold에 나눠주는 간식 배분자”다.
'python의 유용한 함수' 카테고리의 다른 글
| numpy 에서의 기본 문법 (0) | 2025.06.24 |
|---|