본문 바로가기

[머신러닝] GridSearchCV 사용방법(예시)

hyunicecream 2023. 8. 6.

GridSearchCV

안녕하세요. 이번에 GridSearchCV라는 모듈에 대한 설명과 사용 방법에 대해 예시로 보여주고자 합니다.
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]
              }
# cv = StratifiedKFold(n_splits=5, shuffle = True, random_state=42)
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)
  • model.best_params_ : 최적의 파라미터 값을 보여줍니다.
    • 예시 : XGB.best_params_
  • model.best_score_ : 예측 정확도를 보여줍니다.
    • 예시 : XGB.best_score_
# 아래와 같은 결과값을 보여줍니다.
==============================
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를 사용해 보세요. :)

댓글