본문 바로가기
Python (Linux)

13. Python - 모델 선택과 훈련

by #Glacier 2018. 11. 25.
반응형

여태 데이터를 읽고, 탐색하고, 훈련세트와 테스트 세트로 나누며 준비를 해왔습니다.

이제, 모델 선택과 훈련을 해보겠습니다.



sklearn의 LinearRegression을 통해 파이프라인을 적용합니다.



레이블을 살펴보면, 첫 번째 예측은 40%도 넘게 빗나간 것을 알 수 있습니다.

그래서, 사이킷런의 mean_square_error 함수를 이용해 전체 훈련 세트에 대해 이 회귀모델의 RMSE를 측정해봅니다.



대부분의 중간 주택 가격은 $120,000에서, $265,000인데, 예측 오차가 $68,628이란 것은 문제가 있죠.


이 모델은 훈련 데이터에 과소 적합된 사례입니다. 

이런 상황은, 특성들이 좋은 예측을 만들만큼 충분한 정보를 제공하지 못했거나 모델이 충분이 강력하지 않다는 것입니다.


과소적합을 해결하는 주요 방법은, 

1) 더 강력한 모델을 선택하거나, 

2) 훈련 알고리즘에 더 좋은 특성을 주입하거나, 

3) 모델 규제를 감소시키는 것입니다.


이 모델은 규제를 적용한 게 없으므로 1,2번에 해당하겠죠. 

먼저, 더 복잡한 모델을 시도해봅니다.


의사결정나무로 훈련시키고, 평가해본 결과, 오차가 0.0 이 나왔습니다. 말이 안되겠죠...

모델이 심하게 과대적합되었습니다. 


이번엔 교차 검증을 사용한 평가를 합니다.

의사결정나무 모델을 평가하는 방법을 생각하면, train_test_split 함수를 사용하여 훈련 세트를 더 작은 훈련 세트와

검증 세트로 나누고, 더 작은 훈련세트에서 모델을 훈련시키고 검증 세트로 모델을 평가하는 방법이 있습니다.

조금 수고스럽지만 어렵지 않고 잘 작동합니다.


훌륭한 대안으로, 사이킷런의 교차 검증 기능을 사용하는 방법도 있습니다.

다음 코드는 K-겹교차 검증(K-fold cross-validation)을 수행합니다. 

훈련 세트를 폴드(fold)라 불리는 10개의 서브셋으로 무작위로 분할합니다.

그런 다음, 의사결정나무 모델을 10번 훈련하고 평가하는데, 매번 다른 폴드를 선택해 평가에 사용하고

나머지 9개 폴드는 훈련에 사용합니다. 그래서, 10개의 평가 점수가 담긴 배열이 결과가 됩니다.


** 사이킷런의 교차검증은 scoring 매개변수에 (낮을수록 좋은) 비용 함수가 아니라 (클 수록 좋은) 효용 함수를 기대합니다.

** 그래서 평균 제곱 오차(MSE)의 반댓값(즉, 음숫값)을 계산하는 neg_mean_squared_error 함수를 사용합니다. 

** 이런 이유로, 앞선 코드에서 제곱근을 계산하기 전에 -scores로 부호를 바꿉니다.


결과가 좋지 않습니다. 실제로 선형 회귀 모델보다도 나쁩니다. 교차 검증으로 모델의 성능을 추정하는 것 뿐만 아니라,

이 추정이 얼마나 정확한지(표준편차) 측정할 수 있습니다. 결정 트리 점수의 평균은 71,465 +- 2702.8 정도 되는 것 같네요.

검증 세트를 하나만 사용했다면 이런 정보는 얻지 못했을 것입니다. 하지만 모델을 여러 번 훈련시켜야 해서 비용이 비싸므로,

교차 검증을 언제나 쓸 수 있는 것은 아닙니다.


비교를 위해 선형 회귀 모델의 점수를 계산합니다.



확실히 의사결정나무 모델이 과대적합되어 선형 회귀모델보다 성능이 나쁩니다.

마지막으로, RandomForestRegressor 모델을 하나 더 시도해봅니다.

랜덤 포레스트는 특성을 무작위로 선택해서 많은 결정 트리를 만들고 그 예측을 평균 내는 방식으로 작동합니다.

여러 다른 모델을 모아서 하나의 모델을 만드는 것으로 앙상블 학습이라고 하며, 

머신러닝 알고리즘의 성능을 극대화하는 방법 중 하나입니다.



좋은 결과가 나왔습니다. 하지만, 위 훈련 세트에 대한 점수가 검증 세트에 대한 점수보다 훨씬 적으므로 

여전히 훈련 세트에 과대 적합되어있음을 알 수 있습니다. 과대적합을 해결하는 방법은,


1) 모델을 간단히 하거나,

2) 제한을 하거나(규제)

3) 여러 종류의 머신러닝 알고리즘으로 하이퍼파라미터 조정에 너무 많은 시간을 들이지 않으면서

   다양한 모델(다양한 커널의 서포트 벡터 머신, 신경망 등)을 시도해봐야 합니다.


그래서 가능성 있는 2~5개 정도의 모델을 선정하는 것이 목적입니다.


** 실험한 모델들을 모두 저장해두면 쉽게 모델을 복원할 수 있습니다. 

** 교차 검증 점수와 실제 예측값은 물론 하이퍼파라미터와 훈련된 모델 파라미터 모두 저장해야 합니다.

** 이렇게 하면 여러 모델의 점수와 모델이 만든 오차를 쉽게 비교할 수 있습니다.

** 파이썬의 Pickle 패키지나 (넘파이 배열을 저장하는 데 아주 효율적인) sklearn.extenals.joblib을 사용하여 

** 사이킷런 모델을 간단하게 저장할 수 있습니다.

ex)

from sklearn.externals import joblib


#저장과 로드

joblib.dump(my_model, "my_model.pk1")

my_model_loaded = joblib.load("my_model.pk1")


 블로그 

출처


이 글의 상당 부분은  [핸즈온 머신러닝, 한빛미디어/오렐리앙 제롱/박해선] 서적을 참고하였습니다.


나머지는 부수적인 함수나 메서드에 대해 부족한 설명을 적어두었습니다.

학습용으로 포스팅 하는 것이기 때문에 복제보다는 머신러닝에 관심이 있다면 구매해보시길 추천합니다.


도움이 되셨다면 로그인 없이 가능한

아래 하트♥공감 버튼을 꾹 눌러주세요! 



반응형