머신러닝

scikit learn 의 GridSearchCV 로 여러 모델 중 최고 성능, 파라미터 뽑아내는 법

수만이 2021. 11. 29. 18:48

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html

 

sklearn.model_selection.GridSearchCV

Examples using sklearn.model_selection.GridSearchCV: Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.24, Feature agglomeration vs. univariate selection Feature agglom...

scikit-learn.org

 

머신러닝 라이브러리 중에서 Scikit Learn 라이브러리는 굉장히 많이 사용되고 있는 라이브러리입니다. 

또한 모델의 성능을 높이기 위한 방법 중 하이퍼 파라미터 튜닝은 효과적이지만, 일일이 입력하고 학습한다면 많은 노력과 시간이 필요한 작업입니다.

 

이를 위해 sklearn에서는 하이퍼 파라미터 튜닝과 함께, 교차검증을 지원하는 GridSearchCV라는 유용한 기능을 제공하고 있습니다. 

 

또한 GridSearchCV은 하나의 모델만 튜닝 가능한 것이 아니라 여러가지 모델을 한꺼번에 튜닝하고 그 중에서 최적의 모델을 선택할 수 있는 기능이 있습니다. 

 

from sklearn.ensemble import RandomForestClassifier
from sklearn import svm
from sklearn import tree
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

#원하는 모델의 개수 만큼 선언해주세요.
clf1=RandomForestClassifier()
clf2=tree.DecisionTreeClassifier()
clf3=svm.SVC(probability=True )
clf4=GaussianNB()

#각각의 순서 별로 테스트할 하이퍼 파라미터를 설정해주세요.
#주의할 점은 __로 구분된 하이퍼 파라미터 키는 분류기 단어로 시작해야 합니다.
param1 = {}
param1['classifier__n_estimators'] = [100, 200]
param1['classifier__max_depth'] = [8, 10, 12, 14]
param1['classifier__min_samples_split'] = [10, 12, 14, 16]
param1['classifier__min_samples_leaf'] = [2, 4, 6, 8]
param1['classifier'] = [clf1]

param2 = {}
param2['classifier__max_depth'] =  [6,8,10,12]
param2['classifier__min_samples_split'] = [8,10, 12, 14]
param2['classifier__min_samples_leaf'] = [4, 6 ,8]
param2['classifier'] = [clf2]

param3 = {}
param3['classifier__C'] = [1, 10, 100, 1000]
param3['classifier__gamma']=[0.1,0.01,0.001]
param3['classifier'] = [clf3]

param4 = {}
param4['classifier__var_smoothing'] = np.logspace(0,-9, num=100)
param4['classifier'] = [clf4]

#파이프라인을 설정하고, classifier로 적어둔뒤, 첫번째 모델인 clf1를 넣어주세요
pipeline = Pipeline([('classifier', clf1)])
params = [param1, param2, param3, param4]
gs = GridSearchCV(pipeline, params, cv=5, n_jobs=-1, scoring='f1_micro').fit(X_data, y_data)

 

교차검증은 5로, 4개의 모델을 학습 시켜보겠습니다~ 

scoring은 f1 score로 하겠습니다.

 

학습 뒤에 best_params_ 와 best_score_를 통해 선택한 score에서 가장 높은 점수를 낸 파라미터와 점수를 알 수 있습니다. ( 디폴트는 acc입니다.)

print('GridSearchCV 최적 파라미터 :', gs.best_params_ )
print('GridSearchCV 최고 f1 score : ' , gs.best_score_)

저는 svm 모델이 최고 성능으로 나왔네요.

 

모두 GridSearchCV 사용해서 빠르게 하이퍼 파라미터 조정하세요~