보통 머신러닝을 하면 데이터 셋을 train과 test로 나누어서 사용한다. 하지만 종종 대회(Kaggle,데이콘 등) 데잍를 사용하면 정답지가 존재하지 않아 내가 하고 있는 모델링이 제대로 되어가고 있는지 확인하기가 어렵다.
그런 경우 나는 보통 정답지가 이미 존재하는 학습용 데이터를 일정 비율로 쪼개서 사용하곤 하였다. train 데이터를 쪼개서 사용하면 대부분 과적합이 발생할 확률이 매우 높아진다. 하지만 이러한 문제를 해결해줄 수 있는 방법 중 하나가 바로 교차 검증이다. 교차 검증은 쉽게 생각해서 train set을 train set과 validation set으로 분리하여 validation set을 검증 용으로 사용하는 방법이라고 생각하면 된다.
교차 검증의 장점을 몇가지 적어보자면,
등등이 있을 것이다.
굳이 단점을 꼽자면 반복되는 횟수가 많아지기 때문에 모델을 학습하고 평가하는 시간이 늘어난다는 것 정도가 있을 것이다.
위의 사진을 보면 이해가 더 쉬울 것 같다.
보통 회귀 모델에 사용되고 데이터가 독립적이고 동일한 분포를 가진 경우에 사용된다.
K-Fold를 코드에서 몇몇 조정을 할 수 있는데 우선 불러오는 코드는 다음과 같다.
from sklearn.model_selection import cross_validate cross_validate(model, X_train, y_train, cv=5)
from sklearn.model_selection import cross_val_predict y_valid_predict = cross_val_predict(model, X_train, y_train, cv=5)
from sklearn.model_selection import cross_val_score y_valid_score = cross_val_score(model, X_train, y_train, cv=5)
우선 cv를 통해서 fold의 수를 조정할 수 있다. 또한 scoring을 통해서 내가 원하는 평가 지표를 지정할 수 있다.
나무 모델들에서 하이퍼파라미터를 튜닝하면서 교차 검증을 방법도 자주 사용해봤는데, GridSearchCV()와 RandomizedSearchCV를 사용해봤었다. 둘의 차이점은 Grid는 여러 하이퍼파라미터 종류들에서 내가 직접 시도할 파라미터들의 집합을 정의하고 이를 시행하면서 조합을 찾아가는 느낌이고, Random은 이름에서도 유추 가능하다 시피 임의의 값만 대입해서 찾아가는 방법이라고 생각하면 된다.