본문 바로가기

머신러닝, 딥러닝

Cross Validation vs Train/Validation/Train Set 나누기

CV를 할 거면 Train 데이터를 검증용 세트로 나눠줄 필요가 없다.

Train 데이터를 k개의 집단으로 나눠, 1개와 k-1개의 집단에 대해 교차검증을 실시하기 때문이다.

(그리고 k번에 대해 나온 스코어를 평균 낸다.)

이를 K-Fold Cross Validation이라고 하는데, random_state를 쓰지 않아도 스코어가 고정되는 장점이 있다.

K번에 대한 평균이기 때문이다.

K의 수는 자의적인데, 모든 샘플을 블록화 하여 모든 샘플을 검증하는 게 Leave One Out Cross Validation이다.

- 임의로 train / validation / test set을 나누는 것을 Hold-Out CV 방식이라고 한다.
 데이터셋의 크기가 충분히 클 때 사용한다.

데이터셋의 크기가 충분히 크지 않다면, K-Fold CV 방식을 사용한다. 훈련시키는 데이터로 검증도 할 수 있기 때문이다.

교차검증은 시계열 데이터에는 적합하지 않은데, k개의 그룹을 나눌 때 시간대가 섞여

미래의 데이터를 예측하기 어렵기 때문이다.

 

CV는 

1. 어떤 모델이 가장 좋은 성과를 내는지 비교할 때

2. 각 모델에서 파라미터를 튜닝하는 데 사용할 수 있다.

 

RandomizedSearchCV나, GridSearchCV에서 refit=True를 넣어주면

CV 한 파라미터 값을 다시 학습시켜 최적의 모델로 만들어준다.

 

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

clf = RandomForestClassifier() #Initialize with whatever parameters you want to

# 10-Fold Cross validation
np.mean(cross_val_score(clf, X_train, y_train, cv=10))

이런 식으로 cross_val_score에 cv를 파라미터로 넣어서도

스코어를 낼 때 cv를 할 수 있다. 검증 세트를 따로 훈련 세트에서 떼어놓지 않아도 된다!