머신러닝 모델의 성능을 평가할 때, 단일한 학습/검증 데이터 분할만으로는 일반화 성능을 신뢰하기 어렵습니다. 이를 보완하기 위해 사용하는 대표적인 기법이 바로 K-Fold 교차 검증(K-Fold Cross Validation)입니다.
하지만 이 방법에도 숨겨진 한계가 있습니다. 이번 글에서는 K-Fold 교차 검증의 문제점과 이를 해결할 수 있는 Stratified K-Fold에 대해 알아보겠습니다.
✅ K-Fold 교차 검증이란?
K-Fold는 전체 데이터를 K개의 폴드(fold)로 나누고, 그 중 하나를 검증용으로, 나머지를 학습용으로 사용하여 모델을 K번 학습시키는 방식입니다. 이렇게 함으로써 전체 데이터를 고르게 활용하고, 보다 안정적인 모델 평가가 가능합니다.
from sklearn.model_selection import KFold
kf = KFold(n_splits=5)
for train_idx, valid_idx in kf.split(X):
X_train, X_valid = X[train_idx], X[valid_idx]
❗️K-Fold의 한계
K-Fold는 단순히 데이터를 동일한 크기로 분할할 뿐, 타겟 변수의 분포는 고려하지 않습니다. 이게 무슨 뜻일까요?
예를 들어, 타겟값이 0, 1, 2의 세 가지 클래스로 구성된 분류 문제를 가정해 봅시다. 전체 데이터에서는 이 세 클래스가 고르게 분포되어 있지만, K-Fold로 무작위 분할을 했을 때 특정 Fold에 2 클래스가 전혀 포함되지 않을 수도 있습니다.
이 경우, 해당 Fold에서 학습한 모델은 2라는 클래스를 전혀 예측할 수 없습니다. 이는 분류 모델의 성능 평가를 왜곡시키는 매우 중요한 문제입니다.
💡Stratified K-Fold: 계층적 분할로 문제 해결
이러한 문제를 해결하기 위한 방법이 바로 Stratified K-Fold입니다.
Stratified K-Fold는 데이터를 분할할 때 타겟 변수의 클래스 비율을 유지하도록 설계된 방식입니다. 즉, 각 Fold에 모든 클래스가 원래 비율에 가깝게 포함되도록 나누는 것입니다. 이렇게 하면 모든 Fold가 전체 데이터를 잘 대표할 수 있어, 더 신뢰성 있는 모델 평가가 가능합니다.
📌 사용 예시
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, valid_idx in skf.split(X, y):
train_df = train.iloc[train_idx]
valid_df = train.iloc[valid_idx]
여기서 y는 타겟값(레이블)입니다. 이 코드를 통해 각 Fold마다 클래스 비율이 비슷하게 유지된 학습/검증 데이터셋을 얻을 수 있습니다.
✅ 정리
구분 K-Fold Stratified K-Fold
분할 기준 | 단순한 균등 분할 | 타겟 비율을 유지한 분할 |
클래스 불균형 대응 | ❌ 불가능 | ✅ 가능 |
분류 문제 적합성 | 낮음 | 높음 |
Stratified K-Fold는 특히 클래스 불균형이 있는 분류 문제에서 매우 중요한 역할을 합니다. 단순한 K-Fold보다 더 정확하고 안정적인 검증이 가능하니, 분류 문제에서는 Stratified K-Fold를 기본값으로 사용하는 습관을 들이는 것이 좋습니다.
'빅데이터 관련 자료' 카테고리의 다른 글
구글 애널리틱스 이해 - 디지털마케팅과 구글애널리틱스 (0) | 2021.10.12 |
---|---|
랜딩페이지 UX/UI - A/B 테스트를 통한 최적화 실습 (0) | 2021.10.03 |
랜딩페이지 UX/UI - 사용자 경험 연구 (0) | 2021.10.02 |
랜딩페이지 UX/UI - 마케터는 왜 UX/UI를 알아야 할까? (0) | 2021.10.01 |
추천시스템 1회차 (0) | 2021.08.21 |