교차검증이란 모델 학습 시 train set을 train set + validation set으로 분리한 뒤, validation set을 사용해 검증하는 방식입니다.
보통은 train set 으로 모델을 훈련, test set으로 모델을 검증하는데, 고정된 test set을 통해 모델의 성능을 검증하고 수정하는 과정을 반복하면, 결국 내가 만든 모델은 test set 에만 잘 동작하는 모델이 되버립니다.
즉, test set에 과적합(overfitting)하게 되므로, 다른 실제 데이터를 가져와 예측을 수행하면 엉망인 결과가 나와버리게 됩니다.
이를 해결하기 위해 교차검증을 사용합니다.
장점
모든 데이터셋을 훈련에 활용할 수 있습니다.
모든 데이터셋을 평가에 활용할 수 있습니다.
단점
Iteration 횟수가 많기 때문에, 모델 훈련/평가 시간이 오래 걸립니다.
특정 비율로 train/test(validation) data를 한 번 분할하는 방법입니다. 정해진 건 없지만 보통 데이터셋을 8 : 2로 나누어 사용합니다.
전체 데이터셋을 K개의 fold로 나누어 fold 1개를 test data로, 나머지 (K-1)개의 fold를 train data로 분할하는 과정을 K번 반복함으로써 train 및 test data를 교차 변경하는 방법입니다.
가장 일반적으로 사용되는 교차 검증 방법입니다.
보통 회귀 모델에 사용되며, 데이터가 독립적이고 동일한 분포를 가진 경우에 사용합니다.
💡전체 과정
❗아래와 같은 경우에는 CV 수행 시 오히려 모델 성능이 악화될 수 있습니다
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