[ML] 교차검증 (Cross Validation, CV) 이란?

문종현·2022년 11월 22일
0

정보공유

목록 보기
4/11
post-custom-banner

교차검증의 정의

교차검증이란 모델 학습 시 train set을 train set + validation set으로 분리한 뒤, validation set을 사용해 검증하는 방식입니다.

  • 보통은 train set 으로 모델을 훈련, test set으로 모델을 검증하는데, 고정된 test set을 통해 모델의 성능을 검증하고 수정하는 과정을 반복하면, 결국 내가 만든 모델은 test set 에만 잘 동작하는 모델이 되버립니다.

  • 즉, test set에 과적합(overfitting)하게 되므로, 다른 실제 데이터를 가져와 예측을 수행하면 엉망인 결과가 나와버리게 됩니다.

  • 이를 해결하기 위해 교차검증을 사용합니다.

교차검증의 장단점

장점

  • 모든 데이터셋을 훈련에 활용할 수 있습니다.

    • 정확도를 향상시킬 수 있습니다.
    • 데이터 부족으로 인한 underfitting을 방지할 수 있습니다.
  • 모든 데이터셋을 평가에 활용할 수 있습니다.

    • 평가에 사용되는 데이터 편중을 막을 수 있습니다.
    • 평가 결과에 따라 좀 더 일반화된 모델을 만들 수 있습니다.

단점
Iteration 횟수가 많기 때문에, 모델 훈련/평가 시간이 오래 걸립니다.

교차검증의 종류

1. Hold-out Cross-Validation

특정 비율로 train/test(validation) data를 한 번 분할하는 방법입니다. 정해진 건 없지만 보통 데이터셋을 8 : 2로 나누어 사용합니다.

2. K-Fold Cross-Validation

전체 데이터셋을 K개의 fold로 나누어 fold 1개를 test data로, 나머지 (K-1)개의 fold를 train data로 분할하는 과정을 K번 반복함으로써 train 및 test data를 교차 변경하는 방법입니다.

  • 가장 일반적으로 사용되는 교차 검증 방법입니다.

  • 보통 회귀 모델에 사용되며, 데이터가 독립적이고 동일한 분포를 가진 경우에 사용합니다.

💡전체 과정

  1. 전체 데이터셋을 Training Set과 Test Set으로 나눕니다.
  2. Training Set를 Traing Set + Validation Set으로 사용하기 위해 k개의 폴드로 나눕니다.
  3. 첫 번째 폴드를 Validation Set으로 사용하고 나머지 폴드들을 Training Set으로 사용합니다.
  4. 모델을 Training한 뒤, 첫 번 째 Validation Set으로 평가합니다.
  5. 차례대로 다음 폴드를 Validation Set으로 사용하며 3번을 반복합니다.
  6. 총 k 개의 성능 결과가 나오며, 이 k개의 평균을 해당 학습 모델의 성능이라고 합니다.

❗아래와 같은 경우에는 CV 수행 시 오히려 모델 성능이 악화될 수 있습니다

  • 순서가 고려된 데이터가 shuffle 되어 있지 않은 경우
  • 데이터 불균형(Data Imbalance) → 층화 교차검증(Stratified K-fold CV)을 통해 보완합니다.
  • 각기 다른 fold에 중복 데이터가 존재할 경우
  • Natural Group(e.g. 같은 사용자/머신 데이터) 데이터가 여러 fold에 shuffle 된 경우

sklearn 예제

  • sklearn에서는 교차검증을 위해 cross_val_score 함수를 제공합니다.
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score

iris_data = load_iris()

# 모델
logreg = LogisticRegression()

# 파라미터는 (모델, Traingdata의 feature, Trainingdata의 target, 폴드수) 이다.
scores = cross_val_score(logreg , iris.data , iris.target ,cv=3)

# Training data에 대한 성능을 나타낸다.
print('교차 검증별 정확도:',np.round(scores, 4))
print('평균 검증 정확도:', np.round(np.mean(scores), 4))

💡KFold 상세 조정

  • 위 cross_val_score 함수에서는, cv로 폴드의 수를 조정할 수 있습니다.

  • 만약 검증함수의 매개변수를 디테일하게 제어하고 싶다면, 따로 검증함수 객체(KFold)를 만들고 매개변수를 조정한 다음, 해당 객체를 cross_val_score의 cv 매개변수에 넣을 수도 있습니다.

  • fold의 시드를 고정할 수도 있기 때문에 유용합니다.

  • 이를 '교차 검증 분할기' 라고도 합니다.

from sklearn.datasets import load_iris
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

iris_data = load_iris()

# 모델
logreg = LogisticRegression()

# n_split : 몇개로 분할할지
# shuffle : Fold를 나누기 전에 무작위로 섞을지
# random_state : 나눈 Fold를 그대로 사용할지
kfold = KFold(n_splits=6, shuffle = True, random_state=42)

# 파라미터는 (모델, Traingdata의 feature, Trainingdata의 target, 폴드수) 이다.
scores = cross_val_score(logreg , iris.data , iris.target ,cv=kfold)

# Training data에 대한 성능을 나타낸다.
print('교차 검증별 정확도:',np.round(scores, 4))
print('평균 검증 정확도:', np.round(np.mean(scores), 4))

참고자료

[ML] 교차검증 (CV, Cross Validation) 이란?
https://wooono.tistory.com/105

profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글