데이터 분리 전략¶
5.1 전체 구조: OOS를 먼저 떼어놓는다¶
데이터 분리의 첫 번째 원칙은 Out-of-Sample(OOS)을 가장 먼저 확보하는 것이다. OOS는 모형 개발 과정 전체에서 한 번도 사용하지 않는, 최종 검증용 데이터다.
전체 데이터 → OOS(~20%) 분리 → 나머지(~80%)로 모형 개발
나머지 80%를 어떻게 활용하느냐에 따라 두 가지 방식이 있다.
방식 A: Hold-out
80% → Train(60%) / Valid(20%) / Test(20%) 분리 → 모형 학습 및 튜닝
방식 B: K-Fold CV
80% → K개 Fold로 나누어 Train/Valid를 교차 반복 → 모형 학습 및 튜닝
어느 방식이든 OOS는 모형 개발이 완전히 끝난 후 최종 1회 평가에만 사용한다.
왜 나누는가¶
모형의 목표는 학습에 사용하지 않은 데이터에서도 잘 작동하는 것이다. 그런데 학습 데이터의 성능만 보면, 과적합 모형이 가장 "잘하는 것처럼" 보인다. 이 착시를 깨기 위해 데이터를 분리한다.
| 데이터셋 | 역할 | 비유 |
|---|---|---|
| Train | 모형이 패턴을 학습하는 데이터 | 교과서로 공부 |
| Validation | 하이퍼파라미터를 조정하며 성능을 비교하는 데이터 | 모의고사 |
| Test | Hold-out 방식에서의 최종 평가 (CV 방식에서는 생략 가능) | 전국 모의고사 |
| OOS | 모형 개발 전체와 격리된 최종 검증 데이터 | 수능 본시험 |
OOS는 마지막에 딱 한 번
OOS로 반복 평가하면서 모형을 수정하면, OOS에 과적합되는 "정보 누수(Data Leakage)"가 발생한다. 모의고사 답을 미리 알고 공부하면, 수능에서 실력이 나오지 않는 것과 같다.
층화추출 (Stratified Sampling)¶
데이터를 나눌 때 단순 랜덤 추출(Simple Random Sampling)을 하면, 우연히 특정 셋에 Bad가 몰리거나 빠질 수 있다. 불량률 2%인 데이터를 5등분할 때:
| Fold 1 | Fold 2 | Fold 3 | Fold 4 | Fold 5 | |
|---|---|---|---|---|---|
| 단순 랜덤 | 3.5% | 0.8% | 2.1% | 1.4% | 2.2% |
| 층화추출 | 2.0% | 2.0% | 2.0% | 2.0% | 2.0% |
층화추출은 각 층(Good/Bad) 안에서 랜덤 추출을 수행한다. 랜덤성 자체는 유지하되, 타겟 비율이 모든 셋에서 모집단과 동일하도록 제약을 거는 것이다.
이것은 randomness의 상실이 아니라 sampling variance의 감소다. 단순 랜덤이 "주사위를 던져 우연히 6이 7번 나오는" 상황을 허용한다면, 층화추출은 "각 눈이 공정하게 나오도록 보장하되, 그 안의 순서는 무작위"인 셈이다.
왜 층화추출이 기본인가
- 모집단 대표성: 각 데이터셋이 원본과 동일한 Good/Bad 비율을 가지므로, 어느 셋에서 평가하든 편향 없는 성능 추정이 가능하다
- 성능 평가 안정성: Fold 간 성능 편차가 줄어들어 CV Score의 분산이 낮아진다
- 희소 클래스 보호: 불량률 1% 미만인 포트폴리오에서 단순 랜덤 분할 시, 특정 Fold에 Bad가 수 건밖에 안 들어갈 수 있다. 층화추출은 이를 방지한다
OOS 분리, Hold-out 분할, K-Fold CV — 모든 데이터 분리 단계에서 층화추출을 기본으로 사용한다.
Bias-Variance 진단¶
데이터셋 간 성능 패턴으로 Bias-Variance 상태를 진단할 수 있다.
| 패턴 | Train | Valid/Test | 진단 | 처방 |
|---|---|---|---|---|
| 둘 다 낮음 | ✗ | ✗ | High Bias (멍청한 모형 ①) | 복잡도 ↑: 깊이 늘리기, 변수 추가, 부스팅 라운드 증가 |
| Train만 높음 | ✓ | ✗ | High Variance (멍청한 모형 ②) | 복잡도 ↓: 깊이 제한, 정규화 강화, Early Stopping |
| 둘 다 낮고 불안정 | ✗ | ✗ (흔들림) | Both Bad (멍청한 모형 ③) | 데이터 품질·변수 선택부터 재점검 |
| 둘 다 높음 | ✓ | ✓ | Sweet Spot (똑똑한 모형) | 현재 설정 유지 |
| 둘 다 보통, 갭 약간 | △ | △ | 개선 여지 있음 | 하이퍼파라미터 미세 조정 |
5.2 Cross-Validation (CV)¶
Hold-out 방식에서는 데이터를 한 번만 Train/Valid로 나누기 때문에, 어떤 데이터가 Valid에 들어가느냐에 따라 성능 평가가 달라질 수 있다. 특히 데이터가 적을 때 이 문제가 심하다. Cross-Validation은 이 불안정성을 해결한다.
K-Fold CV¶
OOS를 떼어놓은 나머지 데이터를 \(K\)개 동일 크기 조각(Fold)으로 나눈 뒤, 각 Fold를 한 번씩 Validation으로 사용하고 나머지 \(K-1\)개로 학습한다. 이를 \(K\)번 반복하여 성능의 평균과 분산을 모두 얻는다.
| Fold | Train | Valid |
|---|---|---|
| 1회차 | Fold 2, 3, 4, 5 | Fold 1 |
| 2회차 | Fold 1, 3, 4, 5 | Fold 2 |
| 3회차 | Fold 1, 2, 4, 5 | Fold 3 |
| 4회차 | Fold 1, 2, 3, 5 | Fold 4 |
| 5회차 | Fold 1, 2, 3, 4 | Fold 5 |
K의 선택
실무에서는 5-Fold 또는 10-Fold가 표준이다. K가 너무 크면 연산 비용이 증가하고, 너무 작으면 분산이 커진다. \(K = N\) (Leave-One-Out)은 Variance가 높아 일반적으로 권장하지 않는다.
Stratified K-Fold¶
앞서 다룬 층화추출 원칙이 K-Fold CV에도 그대로 적용된다. scikit-learn의 StratifiedKFold는 각 Fold의 Good/Bad 비율이 원본과 동일하도록 보장한다. 불균형 분류에서는 반드시 Stratified를 사용한다.
5.3 Out-of-Sample: 왜 필수인가¶
앞서 OOS를 먼저 떼어놓는다고 했다. 왜 CV나 Hold-out Test만으로는 부족한가?
Out-of-Time (OOT)¶
가장 중요한 OOS는 시간축 분리다.
- 학습: 2023년 1월 ~ 12월 데이터
- OOT 검증: 2024년 1월 ~ 6월 데이터
시간이 흐르면 차주의 행동 패턴, 경제 상황, 상품 구조가 바뀐다. 동일 시점 데이터를 아무리 잘 나눠도(Random Split, CV 포함) 이 시간 변화(Temporal Shift)를 포착할 수 없다. OOT 검증은 모형이 미래에도 유효한지를 가늠하는 유일한 방법이다.
OOT 없는 모형은 실전 투입할 수 없다
Kaggle 대회에서는 Random Split만으로 리더보드 순위가 결정되지만, 신용평가 실무에서는 OOT 성능이 모형 승인의 필수 조건이다. Train/Valid에서 AUC 0.85를 달성해도 OOT에서 0.70이면 그 모형은 쓸 수 없다.
Out-of-Segment¶
시간뿐 아니라 모집단의 구성이 달라질 수도 있다. 예를 들어:
- 학습 데이터에 없던 신규 고객군 유입
- 특정 채널(비대면)의 급격한 비중 증가
- 상품 구조 변경 (한도 체계 개편 등)
이런 경우 OOT에서조차 성능이 과대평가될 수 있다. 모형 개발 시 학습 데이터의 모집단 대표성을 반드시 점검하고, 주요 세그먼트별 성능을 분리하여 확인해야 한다.
다음 섹션
데이터 분리 전략을 이해했으니, 다음으로 피처 전처리에서 트리 모형에서의 변수 처리 방법을 다룬다.