GridSearchCV란? 어떻게 사용할까?

GridSearchCV

안녕하세요. 이번에 소개해드릴거는 GridSearchCV라는 모듈에 대해 설명해 드리고자 합니다. GridSearchCV는 머신러닝에서 모델의 성능향상을 위해 쓰이는 기법중 하나입니다.

사용자가 직접 모델의 하이퍼 파라미터의 값을 가진 리스트를 입력하면 값에 대한 경우의 수마다 예측 성능을 측정 평가하여 비교하면서 최적의 하이퍼 파라미터 값을 찾는 과정을 진행합니다.

시간이 오래걸린다는 단점이 있으니 알아두세요!

어떻게 사용하는지 바로 보여드리도록 하겠습니다.

예시는 제가 직접 썼던 모델로 보여드리겠습니다.

  • 전처리 이후 train, val셋을 구성하신 후 사용해주세요.
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from lightgbm import LGBMClassifier
from xgboost import XGBClassifier
from catboost import CatBoostClassifier

xgb = XGBClassifier()
lgb = LGBMClassifier()
gbm = GradientBoostingClassifier()
cat = CatBoostClassifier()

lreg = LogisticRegression()
# 최적의 파라미터 값 찾아보기
from sklearn.model_selection import GridSearchCV
# XGB
param_xgb = {"max_depth": [10,30,50],
              "min_child_weight" : [1,3,6,10],
              "n_estimators": [200,300,500,1000],
              }    
# LGB                        
param_lgb = {'learning_rate' : [0.01,0.1,0.2,0.3,0.4,0.5],
             "max_depth": [25, 50, 75],
             "num_leaves": [100,300,500,900,1200],
             'n_estimators' : [100, 200, 300,500,800,1000],
             'learning_rate' : [0.01,0.1,0.2,0.3,0.4,0.5]
              }
# GBM              
param_gbm = {'max_depth'         : [4,5,6,7,8,9,10],
             'learning_rate' : [0.01,0.1,0.2,0.3,0.4,0.5],
             'n_estimators'    : [100,200,300,500],
              }
# CAT
param_cat = {'depth':[6,4,5,7,8,9,10],
          'iterations':[250,100,500,1000],
          'learning_rate':[0.001,0.01,0.1,0.2,0.3], 
          'l2_leaf_reg':[2,5,10,20,30],
          'border_count':[254],
          }

# Logistic
param_lreg = { 'C' : [1.0, 3, 5, 7, 10],
              'max_iter': [50, 200, 100, 300, 500,700, 800]
              }
gscv_xgb = GridSearchCV (estimator = xgb, param_grid = param_xgb, scoring ='accuracy', cv = 3, refit=True, n_jobs=1, verbose=2)
gscv_lgb = GridSearchCV (estimator = lgb, param_grid = param_lgb, scoring ='accuracy', cv = 3, refit=True, n_jobs=1, verbose=2)
gscv_gbm = GridSearchCV (estimator = gbm, param_grid = param_gbm, scoring ='accuracy', cv = 3, refit=True, n_jobs=1, verbose=2)
gscv_cat = GridSearchCV (estimator = cat, param_grid = param_cat, scoring ='accuracy', cv = 3, refit=True, n_jobs=1, verbose=2)
gscv_lreg = GridSearchCV (estimator = lreg, param_grid = param_lreg, scoring ='accuracy', cv = 3, refit=True, n_jobs=1, verbose=2)
gscv_xgb.fit(trainX, trainY)
gscv_lgb.fit(trainX, trainY)
gscv_gbm.fit(trainX, trainY)
gscv_cat.fit(trainX, trainY)
gscv_lreg.fit(trainX, trainY)

# time : 49mins (학습시간이 49분이나 걸렸습니다. 파라미터 값을 더 많이 설정한다면 더 오래 걸리겠죠?)
  • n_jobs = -1로 설정 하시면 모든 코어사용이 가능합니다. Default값은 1 입니다.
  • cv = 교차검증을 위한 fold 횟수 입니다. KFold를 쓰고 싶으신 분은 KFold를 설정해주셔도 됩니다.
    Ex) cv = StratifiedKFold(n_splits=5, shuffle = True, random_state=42)
  • refit : True면 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 해당 하이퍼 파라미터로 재학습시킨다는 의미 입니다 . Default 값은 True입니다.
  • scoring : 찾으시는 다른 값으로 변경 가능합니다.
print("="*30)
print('XGB 파라미터: ', gscv_xgb.best_params_)
print('XGB 예측 정확도: {:.4f}'.format(gscv_xgb.best_score_))
print("="*30)
print('LGB 파라미터: ', gscv_lgb.best_params_)
print('LGB 예측 정확도: {:.4f}'.format(gscv_lgb.best_score_))
print("="*30)
print('GBM 파라미터: ', gscv_gbm.best_params_)
print('GBM 예측 정확도: {:.4f}'.format(gscv_gbm.best_score_))
print("="*30)
print('CAT 파라미터: ', gscv_cat.best_params_)
print('CAT 예측 정확도: {:.4f}'.format(gscv_cat.best_score_))
print("="*30)
print('Lreg 파라미터: ', gscv_lreg.best_params_)
print('Lreg 예측 정확도: {:.4f}'.format(gscv_lreg.best_score_))
print("="*30)
  • 모델.bestparams : 최적의 파라미터 값을 보여줍니다.
  • 모델.bestscore : 예측 정확도를 보여줍니다.
# 아래와 같은 결과값을 보여줍니다.
==============================
XGB 파라미터:  {'max_depth': 10, 'min_child_weight': 3, 'n_estimators': 200}
XGB 예측 정확도: 0.9279
==============================
LGB 파라미터:  {'learning_rate': 0.1, 'max_depth': 25, 'n_estimators': 1000, 'num_leaves': 100}
LGB 예측 정확도: 0.9308
==============================
GBM 파라미터:  {'learning_rate': 0.2, 'max_depth': 4, 'n_estimators': 200}
GMB 예측 정확도: 0.9308
==============================
CAT 파라미터:  {'border_count': 254, 'depth': 5, 'iterations': 500, 'l2_leaf_reg': 5, 'learning_rate': 0.1}
CAT 예측 정확도: 0.9350
==============================
Lreg 파라미터:  {'C': 10, 'max_iter': 100}
Lreg 예측 정확도: 0.8400
==============================

GridSearchCV는 모델성능향상을 위한 방법중 하나입니다. 모델 성능이 잘 나오지 않는다면 GridSearchCV도 한번 생각해주세요 :)

좀 더 디테일한 정보를 원하시는분을 위한 링크

좋은 웹페이지 즐겨찾기