본문 바로가기
데이터 사이언스

머신러닝 모델 적합을 할 때 cross-validation 을 적용한 사례

by 빛나는존재 2022. 5. 15.

cross_val_score 대신 사용한 RandomizedSearchCV 함수

training dataset을 나누어 validation dataset 만들기

2022년 5월 14일에 포스팅한 월급 예측 포트폴리오 작성 글에서는 포트폴리오를 작성하게 된 배경 및 전처리, 시각화 결과에 대해 설명했다. 이 포스팅은 그에 이어서 분석했는지를 다루고 있다. 내가 다운로드한 데이터에는 feature에 대한 training, test dataset, target에 대한 training data test은 있지만 target에 대한 test dataset은 존재하지 않는다. 즉, 하려고 하는 분석이 비지도 학습이 아닌 지도 학습임에도 불구하고 정답을 예측하더라도 그것이 얼마나 실제로 맞는지 알 수 없다는 것이다. 이런 경우에는 training dataset을 나누어 validation 할 수 있는 dataset을 일정 부분 남긴 후 validation을 test dataset처럼 사용할 수 있다. training dataset에는 이미 target에 대한 값이 다 나와있으므로 test dataset에 target 값이 없다고 하더라도 이것을 대신하여 사용할 수 있다. 사실 이 부분이 데이터 분석을 하는 데 있어 가장 어려운 부분이어서 다른 사람들은 어떻게 했는지 찾아보았다. 모범답안 예시로 제시된 코드에는 K-fold cross validation을 하여 cross validation마다의 mean squared error, 혹은 mean absolute error 등의 평균을 구하는 것이다. 예를 들어 10-fold cross validation을 한다면 training dataset을 10개의 구간으로 나누어 9개의 구간을 training dataset으로 사용하고 나머지 1개의 구간을 validation dataset으로 활용하며 이것을 자리를 바꿔가며 10번을 반복한다. 그렇게 하면 총 10개의 MSE 가 나오게 된다. 이의 평균을 내면 MSE를 10으로 나누면 MSE의 평균을 구할 수 있게 되어 현재 모델이 test data에서는 얼마나 잘 작동할지 가늠해 볼 수 있다.

 

cross validation 에 사용되는 함수

cross_val_score라는 함수를 사용하면 각 cross validation 했을 때마다의 MSE (혹은 다른 scoring 방법)을 배열로 저장할 수 있다. 그 함수에 사용되는 값으로는 모델의 종류 (예를 들어, random forest 나 linear model 등), training dataset 중 feature에 해당하는 부분, target에 해당하는 부분, cross validation 하는 방법 (예를 들어 MSE, MAE, RMSE 등), 몇 fold의 cross validation을 할 것인지 (예를 들어 10-fold 이면 10이라는 숫자를 입력) 등이 있다. 나는 이 점에 착안하여 다른 cross validation 함수를 사용했는데, 알고 보니 그 함수는 (내가 현재까지 알기로는) cross validation을 할 때 모델에 사용되는 다양한 hyperparameter 들의 조합을 이용하여 그중 최적의 조합을 사용하기 위한 목적을 갖고 있었다. 예를 들어 Random Forest의 경우 주로 tuning 되는 hyperparameter로는 number of estimators (tree의 수로, 많을수록 예측 정확도가 올라간다), maximum depth (최대 분기 수), maximum feature (node에서 최대 feature 수) 등이 있는데 이 hyperparameter마다의 최적의 값의 조합을 찾아야 모델의 예측 성능을 최대로 올릴 수 있다. train dataset을 random 하게 다시 train set과 test dataset으로 임의의 비율로 나누고 그 함수를 이용하여 best model로 train dataset을 적합하면 그때의 MSE 1개만 있음을 알 수 있다.

 

그래서 나는 이 함수를 사용하는 것이 괜찮은지 많은 고심을 했다. 물론 이것은 아직 내가 머신러닝을 배우는 초보적인 단계에 있기 때문에 그럴 것이고 다른 사람들은 너무나도 당연히 자신들이 자신있는 방법을 사용할 것이다. 그러던 중 다른 사람이 동일한 데이터로 포트폴리오를 작성한 것을 보게 되었는데 그 사람이 잘했는지는 확신이 서지 않지만 내가 사용하려고 했던 hyperparameter tuning을 위한 cross validation 함수를 사용한 것을 보게 되어 일단은 나도 이러한 방법을 사용했다.

반응형