본문 바로가기
파이썬/머신러닝-지도학습

파이썬 머신러닝 지도학습 - 하이퍼파라미터 튜닝 (grid search, random search)

by 큰고양2 2023. 9. 17.

하이퍼파라미터 튜닝

하이퍼파라미터란 앞의 여러 모델에 설명한 여러 파라미터를 직접 사용자가 설정하는 것을 말하며

하이퍼파라미터 튜닝은 성능을 최적화 하기 위해 파라미터를 조정하는 것을 말한다

 

Grid Search & Random Search

Grid Search는 파라미터의 범위를 지정하고 해당 범위의 모든 파라미터를 입력하여

범위 내에서 가장 결과가 좋은 파라미터를 자동으로 학습한다

 

Random Search 는 Grid Search에서 범위 내의 모든 파라미터를 사용하는 것이 아니라 지정한 수 만큼의 파라미터를 범위 내에서 랜덤으로 가져와 그 중에서 가장 결과가 좋은 파라미터를 자동으로 학습한다

 

당연하지만 grid search를 사용하는 것이 더욱 정확한 결과를 얻을 수 있겠지만 그 만큼 시간이 더 걸린다는 단점이 있다

 

 

사용방법

import

#random search
from sklearn.model_selection import RandomizedSearchCV
#grid search
from sklearn.model_selection import GridSearchCV

코드로 임포트를 한다

 

파라미터 선언

다음으로는 파라미터를 선언해주어야 하는데

선언은 딕셔너리 형태로 선언을 하며, 파라미터이름 : 범위, 로 지정해주면 된다

 

ex) 결정 트리의 max_depth 튜닝용 파라미터

param = {'max_depth' : range(1,10)}

모델 선언

grid search와 random search를 사용하기 위해서는 당연하지만

튜닝을 할 모델을 선언해 주어야 한다

이 게시글에서는 결정 트리를 선언해서 사용해보겠다

from sklearn.tree import DecisionTreeClassifier

#학습할 모델
model_base = DecisionTreeClassifier()

#random search 모델
model_rs = RandomizedSearchCV( model_dt, #모델
                          param,  #파라미터
                          cv=5,  # 검증할 k-fold
                          n_iter=20, # 시도 횟수
                          scoring='accuracy' #기준
                          )
                          
#grid search 모델                          
model_gs = GridSearchCV( model_dt, #모델
                          param,  #파라미터
                          cv=5,  # 검증할 k-fold
                          scoring='accuracy' #기준
                          )

형태로 선언해주면 된다

grid search와 random search는 n_iter 을 빼면 옵션이 똑같다

 

모델학습

model_rs.fit(x_train, y_train)
model_gs.fit(x_train, y_train)

코드로 학습을 시킬 수 있다

 

학습 결과와 성능 평가

#최적 파라미터
print(model_rs.best_params_)
print(model_gs.best_params_)
#최고 점수
print(model_rs.best_score_)
print(model_gs.best_score_)
#변수 중요도
print(model_rs.best_estimator_.feature_importances_)
print(model_gs.best_estimator_.feature_importances_)

위 코드를 사용해 최적의 파라미터와 해당 파라미터에 해당하는 점수, 그리고 변수의 중요도를 볼 수 있다

또한 모델에 학습이 적용되었으므로

별도의 모델 선언 없이

 

y_pred = model_rs.predict(x_test)
y_pred = model_gs.predict(x_test)

코드로 y값을 예측하고 평가를 진행 할 수 있다

 

+ 하이퍼 파라미터별 결과 시각화

result = pd.DataFrame(model_gs.cv_results_)

코드로 결과를 데이터 프레임으로 저장 할 수 있다

이후 데이터에서 param_선택한 하이퍼 파라미터 이름으로 되어있는 인덱스와 mean_test_score으로 결과를 그릴 수 있다

ex)

sns.lineplot(x = 'param_max_depth', y = 'mean_test_score', data = result, marker = 'o')
plt.grid()

파라미터를 여러 개 넣었으면, hue를 추가하자