My Data Story

[개요] 머신러닝 프로젝트 절차(6) - 모델 세부 튜닝 본문

Machine Learning/1. 머신러닝 프로젝트 절차

[개요] 머신러닝 프로젝트 절차(6) - 모델 세부 튜닝

Hwasss 2021. 8. 12. 15:14
728x90

◈  '머신러닝 프로젝트 절차' 목차 

1. 머신러닝 프로젝트 절차(1) - 큰 그림 보기

2. 머신러닝 프로젝트 절차(2) - 데이터 샘플링 및 훈련/테스트 세트 만들기

3. 머신러닝 프로젝트 절차(3) - 데이터 이해를 위한 탐색

4. 머신러닝 프로젝트 절차(4) - 머신러닝 알고리즘을 위한 데이터 준비

5. 머신러닝 프로젝트 절차(5) - 모델 훈련 및 검증

6. 머신러닝 프로젝트 절차(6) - 모델 세부 튜닝

     선정한 모델의 성능 향상을 위해 하이퍼파라미터 탐색하는 방법, 앙상블 방법, 오차 분석 등에 대해 살펴보자.

7. 머신러닝 프로젝트 절차(7) - 시스템 론칭


1. 하이퍼파라미터 탐색

1.1 그리드 탐색

탐색하고자 하는 하이퍼파라미터와 시도해볼만 한 값을 지정하여

가능한 모든 하이퍼파라미터 조합에 대해 교차 검증 사용하여 평가한다. 

from sklearn.model_selection improt GridSearchCV
param_grid = [{'n_estimators' : [3,10,30], 
               'max_features' : [2,4,6,8],
               'bootstrp' : [False],
               'n_estimators' : [3,10], 
               'max_features' : [2,3,4]}]
               
forest_reg = RandomForestRegressor()

grid_search = GridSearchCV(forest_reg, param_grid, cv=5, 
                           scoring='neg_mean_squared_error',
                           return_train_score=True)

grid_search.fit(x_train, y_train)

#최적의 하이퍼파라미터 조합
print(grid_search.best_params_)
#최적의 추정기
print(grid_search.best_estimator_)

#평가점수 확인하기
cvres = grid_search.cv_results_

for mean_score, params in zip(cvres['mean_test_scoe'], cvres['params']) :
    print(np.sqrt(-mean_score), params)

 

1.2 랜덤 탐색

하이퍼파라미터 탐색 공간이 커지면 RandomizedSearchCV를 사용하는 것이 좋다.

특히 설정값이 연속형일 경우, RandomizedSearchCV 권장한다. 

from scipy.stats import randint
from sklearn.model_selection import RandomizedSearchCV
#하이퍼파라미터 값 지정 대신 분포를 입력한다.
param_distribs = {'n_estimators' : randint(low=1, high=200),
                  'max_features' : randint(low=1, high=8)}
                  
forest_reg = RandomForestRegressor()

rmd_search = RandomizedSearchCV(forest_reg, 
                                param_distribution=param_distribs,
                                n_iters=10, #param_distribs의 분포에서 무작위로 10개 값 선정
                                cv=5, 
                                scoring='neg_mean_squared_error)

 

 

2. 앙상블 방법

모델을 세밀하게 튜닝하는 방법 중 하나가 최상의 모델을 연결하는 것이다. 

특히 개개의 모델이 각기 다른 형태의 오차를 만들 경우, 연결하면 더 나은 성능을 발휘한다. 

 

 

3. 최상의 모델과 오차 분석

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

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

 

 

4. 테스트 세트로 시스템 평가하기

테스트 세트에서 예측 변수에 대해 훈련 세트에 적용한 전처리를 동일하게 적용한 후, 예측한다. 

final_model = grid_search.best_estimator_

#full_pipeline은 이전 전처리단계에서 직접 생성해준 전처리파이프라인
#테스트세트에서는 fit_transform() 아니다.
X_test_prepared = full_pipeline.transform(X_test)

final_predictions = final_model.predict(X_test_prepared)
final_mse = mean_squared_error(y_test, final_predictions)
final_mse = np.sqrt(final_mse)

 

 

위에서 추정한 오차값이 얼마나 정확한 지 확인하기 위해서 일반화 오차의 95% 신뢰구간을 확인한다. 

from scipy import stats
confidence = 0.95
squared_error = (final_predictions - y_test)**2
np.sqrt(stats.interval(confidence, len(squared_error)-1, 
                       loc=sqaured_error.mean(), sacle=stats.seem(squared_errors)))

 

 

하이퍼파라미터 튜닝을 많이 했다면, 교차 검증의 성능보다 조금 낮은 것이 보통이다. 

이는 검증 데이터에서 좋은 성능을 내도록 세밀하게 튜닝되었기 때문이다. 

그렇다고 테스트 데이터에서 성능 수치 좋게 하려고 튜닝 시도할 필요는 없다.