데이터분석

scikit learn, GridSearchCV

still..epochs 2023. 8. 18. 16:36

데이터의 정제를 완료하면 모델을 통해 데이터를 학습하고 타겟 값을 예측한다. 머신러닝에 있어서 모델의 성능을 높이기 위해서 가장 중요한 작업은 데이터를 모델에 맞게 정제하는 과정이라고 생각한다. 그 다음으로는 모델의 파라미터 값을 조정하여 성능을 높이는 방법이 있다.

 

모델에 따라 수 많은 파라미터들이 존재하기 때문에, 사람이 모든 값을 하나씩 바꿔가며 실험하는 것은 많은 노력과 인력을 필요로 한다. 사이킷 런에서는 모델의 파라미터를 설정할 때, 사람이 일정 값을 설정해주면 모델이 그 조합들을 자동적으로 조합하여 실험을 실행시키는 메서드를 제공하는데 그것이 바로 GridSearchCV 이다.

 

greedy 알고리즘은 최적해를 구하는 데에 사용되는 근사적인 방법으로, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다.

 

이 아이디어를 착안하여 GridSearchCV 메서드가 나오게 되지 않았나 생각한다.(지극히 뇌피셜)

 

그렇다면 GridSearchCV에 대해 알아보자.

 

사이킷런의 공식 문서를 살펴보면 GridSearchCV는 다음과 같은 파라미터 값이 존재한다.

 

class sklearn.model_selection.GridSearchCV(estimator, param_grid, *, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score=nan, return_train_score=False)

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

그 중 몇 가지 파라미터에 대해 살펴보자.

 

estimator : estimator는 머신러닝의 모델을 의미한다.

param_grid : param_gird 에는 딕셔너리나 리스트 값을 넣어주어야 한다. 해당 파라미터에 우리가 실험할 값들을 설정하여 넣어주면 GridSearchCV 메서드가 실험 값을 조합하여 최적의 값을 찾아준다.

 

예제 코드

from sklearn.neighbors import RandomForesetClassifier
from sklearn.model_selection import GridSearchCV

# 실험할 파라미터 값, 본 예제에서는 RandomForestClassifier의 파라미터들을 실험한다.
param_gird = {'n_estimators' : np.arange(100, 1000, 200, dtype=int),
              'max_features' : [None, 'sqrt', 'log2'],
              'criterion' : ['gini', 'entropy'],
              'max_depth' : [None, 3, 5, 7]}

rf_clf = RandomForestClassifier()

param_gird 에는 사용할 모델의 파라미터 값(실험용)을 위의 예제처럼 딕셔너리 형태로 만들어주면 된다.

 

gs_rf = GridSearchCV(rf_clf, param_grid=param_grid)
gs_rf.fit(X_train, y_train)

print('Optimal n_estimators: {}  Optimal max_features: {}  Optimal max_depth: {}  Optimal criterion: {}'.format(gs_rf.best_params_['n_estimators'],
                                                                                                                gs_rf.best_params_['max_features'],
                                                                                                                gs_rf.best_params_['max_depth'],
                                                                                                                gs_rf.best_params_['criterion']))
>> Optimal n_estimators: 300  Optimal max_features: sqrt  Optimal max_depth: None  Optimal criterion: entropy

이제 GridSearchCV 를 사용하여 우리가 실험하고자 하는 파라미터 값을 학습해주면, 해당 gs_rf 객체에 저장된 가장 좋은 파라미터 값을 알아낼 수 있다.

 

내가 사용했던 데이터와 모델에서는 위 처럼 각각 최적의 파라미터를 찾아주는 것을 확인할 수 있다.

 

다른 모델에서도 비슷한 과정으로 실험을 진행하면 된다!