페이지

2018년 8월 1일 수요일

2.7 모델 세부 튜닝

가능성 있는 모델들을 추렸다고 가정하겠습니ㅏㄷ. 이제 이 모델들을 세뷰 튜닝해야 합니다. 그 방법을 몇 개 살펴 봅시다.

2.7.1 그리드 탐색
가장 단순한 방법은 만족할 만한 하이퍼파라미터 조합을 찾을 때까지 수동으로 하이퍼파라미터를 조정하는 것입니ㅏㄷ. 이는 매우 지루한 작업이고 많은 경우의 수를 탐색하기에는 시간이 부족할 수도 있습니다.

대신 사이킷런의 GridSearchCVㄹ르 사용하는 것이 좋습니다. 탐색하고자 하는 하이퍼파라미터와 시도해볼 값을 지정하기만 하면 됩니다. 그러면 가능한 모든 하이퍼파라미터 조합에 대해 교차 검증을 사용해 평가하게 됩니다. 예를 들어 다음 코드 RandomForestRegressor에 대한 최적의 하이퍼파라미터 조합을 탐색합니다.

TIP 어떤 하이퍼파라미터 값을 지정해야 할지 모를 때는 연속된 10의 거듭 제곱 수로 시도해 보는 것도 좋습니다.(더 세밀하게 탐색하려면 위 예제의 n_estimators 하이퍼파라미터처럼 더 작은 값을 지정합니다.)

param_grid 설정에 따라 사아킷런이 먼저 첫 번째 dict에 있는 n_estimators와 max_features 하이퍼파라미터의 조합인 3*4=12개를 평가하고(지금은 이 하이퍼파라미터가 무엇을 의미하는지 걱정하지 않아도 됩니다. 7장에서 설명하겠습니다), 그런 다음 두 번째 dict에 있는 하이퍼파라미터의 조합인 2*3=6개를 시도합니다. 하지만 두 번째 bootstrap하이퍼파라미터를 True(기본값)가 아니라 False로 설정합니다.

모두 합하면 그리드 탐색의 RandomForestRegressor하이퍼파라미터 값의 12 + 6 = 18개 조합을 탐색하고, 각각 다섯 번 모델을 훈련시킵니다(5-겹 교차 검증을 사용하기 때문에). 다시 말해 전체 훈련 횟수는 18*5 = 90이 됩니다.

NOTE_ GridSearchCV가 (기본값인)refit=True로 초기화되었다면 교차 검증으로 최저의 추정기를 찾은 다음 전체 훈련 세트로 다시 훈련시킵니다. 일반적으로 데이터가 많을수록 성능이 향상되므로 좋은 방법입니다.

이 예에서는 max_features하이퍼파라미터가 8, n_estimators 하이퍼파라미터가 30일때 최적의 솔류션입니다. 이때 RMSE 점수가 49,694로 앞서 기본 하이퍼파라미터 설정으로 얻은 52,564 점 보다 조금 더 좋습니다.

2.7.2 랜덤 탐색
그리드 탐색 방법은 이전 예제와 같이 비교적 적은 수의 조합을 탐구할 때 괜찮습니다. 하지만 하이퍼파라미터 탐색 공간이 커지면 RandomizedSearchCV를 사용하는 편이 더 좋습니다.
RandomizedSearchCV는 GridSEarchCV와 거의 같은 방식으로 사용하지만 가능한 모든 조합을 시도하는 대신 각 반복마다 하이퍼파라미터의 임의의 수를 대입하여 지정한 횟수만큼 평가합니다. 이 방식의 주요 장점은 다음 두 가지 입니다.
- 랜덤 탐색을 1,000회 반복하도록 실행하면 하이퍼파라미터마다 각기 다른 1,000개의 값을 탐색합니다(그르드 탐색에서는 하이퍼파라미터마다 몇 개의 값만탐색합니다).
- 단순히 반복 횟수를 조절하는것만으로 하이퍼파라미터 탐색에 투입할 컴퓨팅 자원을 제어할 수 있습니다.

2.7.3 양상블 방법
모델을 세밀하게 튜닝하는 또 다른 방법은 최상의 모델을 연결해 보는 것입니다.(결정 트리의 앙상블인 랜덤 포레스트가 결정 트리 하나보다 더 성능이 좋은 것처럼) 모델의그룹(또는 앙상블)이 최상의 단일 모델보다 더 나은 성능을 발휘할 때가 많습니다. 특히 개개의 모델이 각기 다른 형태의 오차를 만들 때 그렇습니다. 이 주제는 7장에서 자세히 살펴보겠습니다.

2.7.4 최상의 모델과 오차 분석
최상의 모델을 분석하면 문제에 대한 좋은 통찰을 얻는 경우가 많습니다. 예를 들어 RandomRorestRegressor가 정확한 예측을 만들기 위한 각 특성의 상대적인 중요도를 알려줍니다.
중요도 다음에 그에 대응하는 특성 이름을 표시해보겠습니다.
이 정보를 바탕으로 덜 중요한 특성들을 제외할 수 있습니다.(예를 들어 ocean_proximity 카테고리 중 하나만 실제로 유용하므로 다른 카테고리는제외할 수 있습니다).

시스템이 특정한 오차를 만들었다면 왜 그런 문제가 생겼는지 이해하고 문제를 해결하는 방법이 무엇인지 찾아야 합니다(추가 특성을 포함시키거나, 반대로 불필요한 특성을 제거하거나, 이상치를 제외하는 등).

2.7.5 테스트 세트로 시스템 평가하기
어느정도 모델을 튜닝하면 마침내 만족할 만한 모델을 얻게 됩니다. 그럼 이제 테스트 세트에서 최종 모델을 평가할 차례입니다. 이 과정에 특별히 다른 점은 없습니다. 테스트 세트에서 예측 변수와 레이블을 얻은 후 full_pipeline을 사용해 데이터를 변환하고(fit_transform()이 아니라 transfor()을 호출해야 합니다) 테스트 세트에서 최종 모델을 평가합니다.

하이퍼파라미터 튜닝을 많이 했다면 교차 검증을 사용해 측정한 것보다 조금 성능이 낮은 것이 보통입니다(우리 시스템이 검증 데이터에서 좋은 성능을 내도록 세밀하게 튜닝되었기 때문에 새로운 데이터셋에는 잘 작동하지 않을 가능성이 큽니다). 이 예제에서는 성능이 낮아지진 않았지만, 이런 경우가 생기더라도 테스트 세트에서 성능 수치를 좋게 하려고 하이퍼파라미터를 튜닝하려 시도해서는 안됩니다. 그렇게 향상된 성능은 새로운 데이터에 일반화됙 어렵습니다.

이제 프로젝트 론칭 직전 단계에 왔습니다. (학습한 것, 한일과 하지 않은 일, 수립한 가정, 시스템 제한 사항 등을 가종하면서) 솔루션과 문서를 출시하고, 깔끔한 도표와 기억하기 쉬운 제목으로(예를 들면'수입의 중간값이 주택 가격 예측의 가장 중요한 지표다') 멋진 발표자료를 만들어야 합니다.

댓글 없음: