2.6.1 훈련 세트에서 훈련하고 평가하기
이전 단계의 작업 덕분에 생각보다 훨씬 간단해 졌습니다. 먼저 앞 장에서 했던 것처럼 선형회귀모델을 훈련시켜보겠습니다.
2.6.2 교차 검증을 사용한 평가
결정트리 모델을 평가하는 밥버을 생각해보겠습니다. 우선 train_test_split 함수를 사용해 훈련 세트를 더 작은 훈련 세트와 검증 세트로 나누어, 더 작은 훈련 세트에서 모델을 훈련시키고 검증 세트로 모델을 평가하는 방법이 있습니다. 조금 수고스럽지만 너무 어렵지 않으며 매우 잘 작동합니다.
훌륭한 대안으로 사이킷런의 교차 검증 기능을 사용하는 방법도 있습니다. 다음 코드는 K-겹교차 검증을 수행합니다. 훈련 세트를 폴드라 불리는 10개의 서브셋으로 무작위로 분할합니다. 그런 다음 결졍 트리 모델을 10번 훈련하고 평가하는데, 매번 다른 폴드를 선택해 평가에 사용하고 나머지 9개 폴드는 훈련에 사용합니다. 10개의 평가 점수가 담긴 배열이 결과가 됩니다.
CAUTION_ 사이킷런의 교차 검증 기능은 scoring 매개변수에 (낮을수록 좋은) 비용 함수가 아니라(클수록 좋은)효용 함수를 기대합니다. 그래서 평균 제곱오차(MSE)의 반댓값(즉, 음숫값)을 계산하는 neg_mean_squared_error 함수를 사용합니다. 이런 이유로 앞선 코드에서 제곱근을 계산하기 전에 -scores로 부호르 바꿨습니다.
결정 트리 결과가 이전만큼 좋아 보이지 않습니다. 실제로 선형 회귀모델보다 나쁩니다! 교차 검증으로 모델의 성능을 추정하는 것뿐만 아니라 이 추정이 얼마나 정확한지 측정할 수 있습니다. 결정 트리 점수가 대략 평균 71.379에서 +-2,458 사이입니다. 검증 세트를 하나만 사용했다면 이런 정보를 얻지 못했을 것입니다. 하지만 모델을 여러 번 훈련시켜야 해서 비용이 비싸므로 교차검증을 언제나 쓸 수 있는 것은 아닙니다.
비교를 위해 선형 회귀모델의 점수를 계산해 보겠습니다.
확실히 결정 트리 모델이 과대적합되어 선형 회귀모델보다 성능이 나쁩니다.
마지막으로 RandomForestRegressor 모델을 하나 더 시도해보겠습니다. 7장에서 보게 되겠지만 랜덤 포레스트 특성을 무작위로 선택해서 많은 결정 트리를 만들고 그 예측을 평균 내는 방식으로 작동합니다. 여러 다른 모델을모아서 하나의 모델을 만드는 것을 앙상블 학습이라고 하며 머신러닝 알고리즘의 성능을 극대화하는 방법 중 하나입니다. 다른 모델들과 기본적으로 비슷하므로 코드 설명은 대부분 건너뛰도록 하겠습니다.
훈련 세트에 대한 점수가 검증 세트에 대한 점수보다 훨씬 낮으므로 이 모델도 여전히 훈련세트에 과대적합되어 있습니다. 과대적합을 해결하는 방법은 모델을 간단히 하거나, 제한을 을 하거나(즉, 규제), 더 많은 훈련 데이터를 모드는 것이빈다. 그러나 랜덤 포레스트를 더 깊이 들어가기 전에, 여러 종류의 머신러닝 알고리즘으로 하이퍼파라미터 조정에 너무 많은 시간을 들이지 않으면서 다양한 모델(다양한 커널의 서프트 벡터머신, 신경망 등)을 시도해봐야 합니다. 가능성 있는 2~5개 정도의 모델을 선정하는 것이 목적입니다.
TIP 실험한 모델을 모두 저장해두면 필요할 때 쉽게 모델을 복원할 수 있습니다. 교차 검증 점수와 실제 예측값은 물론 하이퍼파라미터와 훈련된 모델 파라미터 모두 저장해야 합니다. 이렇게 하면 여러 모델의 점수와 모델이 만든 오차를 쉽게 비교할 수 있습니다. 파이썬의 pickle 패키지나( 넘파이 배열을 저장하는 데 아주 효율적인)sklearn.externals.joblib을 사용하여 사이킷런 모델을 간단하게 저장할 수 있습니다.
댓글 없음:
댓글 쓰기