본문 바로가기
## 오래된 게시글 (미관리) ##/Python (Linux)

14. Python - 모델 세부 튜닝

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

여기서는 가능성 있는 모델들을 추렸다고 가정합니다. 이제 이 모델들의 세부 튜닝방법을 살펴봅니다.

가장 단순한 방법은, 만족할 만한 하이퍼파라미터 조합을 찾을 때까지 수동으로 조정하는 것입니다.

하지만 이는 매우 지루하고, 많은 경우의 수를 탐색하기에는 시간이 부족할 수 있습니다.


대신, 사이킷런의 GridSearchCV를 사용하는 것이 좋습니다. 탐색하고자 하는 하이퍼파라미터와 시도해볼만한 값을 

지정해주기만 하면 됩니다. 그러면 가능한 모든 하이퍼파라미터 조합에 대해 교차 검증을 사용해 평가하게 됩니다.

예를 들어 다음 코드는 우리가 저번에 했던 RandomForestRegressor에 대한 최적의 하이퍼파라미터 조합을 탐색합니다.



param_grid 설정에 따라 사이킷런이 먼저 첫 번째 dict에 있는 n_estimators와 max_features 하이퍼파라미터 조합인

3X4 =12개를 평가합니다.(지금은 이 하이퍼파라미터가 무엇인지 몰라도 후에 설명합니다.)


그런 다음 두 번째 dict에 있는 하이퍼파라미터 조합인 2X3=6개를 시도합니다. 

하지만 두 번째는 bootstrap 하이퍼파라미터를 True(기본값)가 아니라 False로 설정합니다.


모두 합하면 그리드 탐색이 RandomForestRegressor 하이퍼파라미터 값의 12+6=18개 조합을 탐색하고, 각각 다섯 번 모델을

훈련 시킵니다. (5-겹 교차 검증을 사용하기 때문에) 그래서 총 전체 훈련 횟수는 18*5인 90이 됩니다.

시간이 꽤 걸리지만 최적의 조합을 얻을 수 있습니다.


결과로 max_feature : 6, n_estimators : 30이 나왔습니다. 하지만 이는, 탐색 범위의 최댓값이기 때문에 계속 점수가

향상될 가능성이 있으므로 더 큰 값으로 검색해봐야 합니다.



이렇게 확인해볼 수 있죠.

이때의 RMSE 점수가 50,298로 앞서 기본 하이퍼파라미터 설정으로 얻은 52,583보다 좋음을 알 수 있습니다.


더 찾아봐야 하지만 여기서 최적의 모델을 찾았다고 가정합니다.


** 데이터 준비 단계를 하나의 하이퍼파라미터 단계로 다룰 수 있습니다.

** 예를 들면, 그리드 탐색이 확실하지 않은 특성을 추가할지 말지 자동으로 정할 수 있습니다. 

** (CombinedAttributesAdder 변환기의 add_bedrooms_per_room 하이퍼파라미터를 사용하여 특성을 추가할 지 결정합니다.)
** 비슷하게 이상치나 값이 빈 특성을 다루거나 특성 선택 등을 자동으로 처리하는 데 그리드 탐색을 사용합니다.


(데이터 준비 단계와 모델을 연결한 파이프라인을 그리드 탐색에 적용할 때, 데이터 준비 단계를 캐싱하면 탐색 시간을

 줄일 수 있습니다. 파이프라인 캐싱에 대해 간단한 예는 블로그 참고 https://goo.gl/cq9Nyb)


다른 방법으로는 랜덤 탐색과 앙상블 방법이 있습니다.


1. 랜덤 탐색


그리드 탐색 방법은 이전 예제와 같이 비교적 적은 수의 조합을 탐구할 때 좋습니다.

하지만 하이퍼파라미터 탐색 공간이 커지면, RandomizedSearchCV를 사용하는 편이 더 좋습니다.

RandomizedSearchCV는 GridSearchCV와 거의 같은 방식으로 사용하지만 가능한 모든 조합을 시도하는 대신

각 반복마다 하이퍼파라미터에 임의의 수를 대입하여 지정한 횟수만큼 평가합니다.


이 방식의 주요 장점은 다음 두 가지입니다.


1) 랜덤 탐색을 1,000회 반복하도록 설정하면 하이퍼파라미터마다 각기 다른 1,000개의 값을 탐색합니다.

  (그리드 탐색에서는 하이퍼파라미터마다 몇 개의 값만 탐색합니다.)

2) 단순히 반복 횟수를 조절하는 것만으로 하이퍼파라미터 탐색에 투입할 컴퓨팅 자원을 제어할 수 있습니다.


2. 앙상블 방법


모델을 세밀하게 튜닝하는 또 다른 방법은 최상의 모델을 연결해보는 것입니다. 

(결정 트리의 앙상블인 랜덤 포레스트가 결정 트리 하나보다 더 성능이 좋은 것처럼)

모델의 그룹(또는 앙상블)이 최상의 단일 모델보다 더 나은 성능을 발휘할 때가 많습니다.

특히 개개의 모델이 각기 다른 형태의 오차를 만들 때 그렇습니다.


자, 이제 최상의 모델과 오차 분석을 해보겠습니다.


최상의 모델을 분석하면 문제에 대한 좋은 통찰을 얻는 경우가 많습니다.

예를 들어, RandomForestRegressor가 정확한 예측을 만들기 위한 각 특성의 상대적인 중요도를 알려줍니다.


하다가 오류가 cat_encoder에 대해 오류가 나길래 뭔가 했더니..



여기서 제가 cat으로만 써두었더라구요.. ㅠㅠ


어쨌든, 이 방법으로 덜 중요한 특성을 제외할 수 있습니다. 

(예를 들어, ocean_proximity 카테고리 중 하나만 유용하므로 다른 카테고리는 제외할 수도 있습니다.)

시스템이 특정한 오차를 만들었다면, 왜 그런 문제가 생겼는지 이해하고 문제를 해결하는 방법이 무엇인지 찾아야 합니다.

(추가 특성을 포함시키거나, 반대로 불필요한 특성을 제거하거나, 이상치를 제외하는 등)


여기까지 모델 세부 튜닝에 대해 알아보았는데요. 다음에는 테스트 세트로 평가해보겠습니다.


 블로그 

출처


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


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

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


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

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



반응형