본문 바로가기
배움 기록

K겹 교차검증(K-fold cross validation)

by 작지만 중요한 것들을 발견하는 블로그. 2024. 6. 18.

 

K-fold CV(Cross validation)은 교차 검증기법으로, k회를 설정한 횟수만큼 데이터를 섞어서(Shuffle) Train 데이터 셋과 Valid data셋으로 분리한다.

 

머신러닝을 할 때, data Centric AI라는 말이 나올정도로 양질의 데이터가 훈련에 있어서 중요성이 높아졌다는 것과 같다.

예전의 머신러닝은 모델을 튜닝하는 것이라는 말이 있을정도로 모델 튜닝에 많은 집중을 가했지만, 이제는 데이터에 따라 결과가 천차만별로 달라지게 된다. 따라서 데이터 셋을 검증하는 것은 굉장히 중요한 일이다.

 

K겹 교차검증은 데이터를 섞어서 테스트 해서, validation data셋과 train data셋을 랜덤하게 나누어서 테스트하는 것이 중요하며, 모델을 튜닝할 때 정확도와 손실 값에 영향을 미치기도하며 데이터의 편중이 한쪽으로 쏠릴경우 훈련된 결과는 완전히 다를 수 있다.

 

 

k겹 교차 검증 활용 훈련의 장점은

  • 과적합을 방지하고 - k개의 모델을 훈련하고 평균 성능을 사용하므로 과적합을 줄일 수 있다.
  • K겹 교차검증과 함께 앙상블 모델을 사용하면 개별 모델보다 더 안정적이고 일반화 성능이 좋은 모델을 얻을 수 있다.

훈련에도 사용할 수 있지만, k겹 교차 검증의 주된 목적은 모델의 성능 평가이지, 모델 훈련은 아니라고한다.

이유는 k겹 교차 검증을 통해 얻은 모델은 각각 다른 데이터 fold로 훈련되었기 때문에 일반화 성능이 다를 수 있다는 것.

 

 

앙상블 모델을 생성할 때는 랜덤으로 데이터가 섞이기 때문에 앙상블 방법에 따라 성능이 달라질 수 있어서 적절한 방법을 선택해야 하고, 전체 데이터 재훈련이 항상 성능 향상을 보장하지는 않기에 모델 학습 & 훈련을 목적으로 보기보다는 모델 성능평가를 목적으로 하는 것이 타당하다고 생각된다.

 

K겹 교차검증의 방법으로는 Stratified K-Fold 방법과 일반 K-fold방법이 있다.

 

Stratified K-Fold

 

  • 각 폴드 내의 클래스 비율이 전체 데이터셋의 클래스 비율과 유사하도록 데이터를 분할
  • 불균형한 데이터셋(특정 클래스의 비율이 다른 클래스에 비해 현저히 높거나 낮은 경우)에 적합.
  • 주로 분류 모델에 사용

일반 K-fold

 

  • 가장 일반적인 교차 검증 방법-
  • 데이터셋을 k개의 폴드로 나누고, 각 폴드를 한 번씩 검증 세트로 사용하여 모델을 평가
  • 주로 회귀 모델에 사용되며, 데이터가 독립적이고 동일한 분포를 가질 때 사용

 

 

from sklearn.model_selection import StratifiedKFold

# KFOLD 설정
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# 데이터 분리
for train_idx, val_idx in kfold.split(X, y):
    X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
    y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
    
    print(X_train.shape, X_val.shape, y_train.shape, y_val.shape)
    # (712, 13) (179, 13) (712,) (179,)

# 모델 생성 및 예측

 

 

 

다음 번에는 앙상블 방법에 대해서 하나씩 다루어 봐야겠습니다.