K-Fold 교차 검증의 한계와 Stratified K-Fold의 필요성
잡학다식의 지식공방

빅데이터 관련 자료

K-Fold 교차 검증의 한계와 Stratified K-Fold의 필요성

carpe08 2021. 9. 18. 19:50
320x100

머신러닝 모델의 성능을 평가할 때, 단일한 학습/검증 데이터 분할만으로는 일반화 성능을 신뢰하기 어렵습니다. 이를 보완하기 위해 사용하는 대표적인 기법이 바로 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를 기본값으로 사용하는 습관을 들이는 것이 좋습니다.

320x100
320x100