본문 바로가기
개발 Tools/파이썬_Deep learning & ML

머신러닝 GridSearch(그리드 서치) (cv_results_, best_params_ , best_score_, estimator, param_grid, scoring, cv, refit)

by 전컴반 2021. 7. 15.
반응형

그리드 서치는 최적의 파라미터를 찾아준다.

여러 모델에는 각각의 파라미터가 있는데 어떤 조합일 때 제일 좋은 점수가 나오는지 비교해주는 것이다.

 

이번엔, 2개 파라미터의 조합을 볼 것이고, 결정 트리로 사용할 것이다.

 

라이브러리

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
import pandas as pd

 

훈련데이터 검증 데이터 분류

 

iris = load_iris()

data = iris.data
target = iris.target
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=999)

 

붓꽃 데이터를 가져와서 한다.

data와 target을 훈련 데이터와 검증 데이터를 분류하는데 검증 데이터의 비율을 20% 로 한다.

random_state=999는 한번 뽑은 랜덤의 데이터를 계속 쓰겠단 소리다. 꼭 999가 아니고 다른 숫자여도 상관없다.

 

그리드 서치

 

dtree = DecisionTreeClassifier()

grid_parameters = {"max_depth": [1, 2, 3],
                   "min_samples_split": [2, 3]
                   }

grid_dtree = GridSearchCV(dtree, param_grid=grid_parameters, cv=3, refit=True)

grid_dtree.fit(X_train, y_train)

 

결정트리 모델을 먼저 만들고,

내가 궁금한 파라미터의 값을 딕셔너리 형태로 저장하여 넘겨준다. cv는 교차 검증을 위해 분할되는 학습 데이터의 세트 수이다. refit=True는 최적의 파라미터를 찾으면 이걸 기준으로 다음 학습을 한다.

 

원래 fit 을 시키기 전에 한 단계 추가됐다고 보면 된다.

 

결과를 데이터 프레임으로 변환

 

위에서 fit 시킨 결과를 보려면 cv_results_ 를 사용한다.

그러면 여러 지표들이 나온다.

 

scores_df = pd.DataFrame(grid_dtree.cv_results_)
print(scores_df)


출력
mean_fit_time  std_fit_time  mean_score_time  std_score_time param_max_depth param_min_samples_split                                    params  split0_test_score  split1_test_score  split2_test_score  mean_test_score  std_test_score  rank_test_score
0       0.001321  4.587829e-04         0.000997    3.893359e-07               1                       2  {'max_depth': 1, 'min_samples_split': 2}              0.675              0.675              0.700         0.683333        0.011785                5
1       0.001676  4.799690e-04         0.001196    2.498432e-04               1                       3  {'max_depth': 1, 'min_samples_split': 3}              0.675              0.675              0.700         0.683333        0.011785                5
2       0.002052  8.137361e-05         0.000613    4.378794e-04               2                       2  {'max_depth': 2, 'min_samples_split': 2}              0.925              0.925              0.975         0.941667        0.023570                3
3       0.000998  8.104673e-07         0.000332    4.694597e-04               2                       3  {'max_depth': 2, 'min_samples_split': 3}              0.925              0.925              0.975         0.941667        0.023570                3
4       0.001271  2.113806e-04         0.000563    4.170978e-04               3                       2  {'max_depth': 3, 'min_samples_split': 2}              0.975              0.950              0.975         0.966667        0.011785                1
5       0.001044  4.221438e-05         0.000665    4.699172e-04               3                       3  {'max_depth': 3, 'min_samples_split': 3}              0.975              0.950              0.975         0.966667        0.011785                1

 

이렇게 많은 지표중에 우린 원하는 지표만 뽑아서 볼 것이다. 

 

원하는 결과만 출력

 

최적의 파라미터까지 출력해보겠다.

이때 최적의 파라미터와 최고 점수를 내는 함수가 있다. best_params_ , best_score_이다.

 

scores_df = scores_df[["params", "mean_test_score", "rank_test_score", "split0_test_score", "split1_test_score", "split2_test_score"]]
print(scores_df)

# 최고의 파라미터 저장해줌
print(f"최적의 파라미터: {grid_dtree.best_params_}")
print(f"최고 정확도: {grid_dtree.best_score_}")

출력
                                    params  mean_test_score  rank_test_score  split0_test_score  split1_test_score  split2_test_score
0  {'max_depth': 1, 'min_samples_split': 2}         0.683333                5              0.675              0.675              0.700
1  {'max_depth': 1, 'min_samples_split': 3}         0.683333                5              0.675              0.675              0.700
2  {'max_depth': 2, 'min_samples_split': 2}         0.941667                3              0.925              0.925              0.975
3  {'max_depth': 2, 'min_samples_split': 3}         0.941667                3              0.925              0.925              0.975
4  {'max_depth': 3, 'min_samples_split': 2}         0.966667                1              0.975              0.950              0.975
5  {'max_depth': 3, 'min_samples_split': 3}         0.966667                1              0.975              0.950              0.975
최적의 파라미터: {'max_depth': 3, 'min_samples_split': 2}
최고 정확도: 0.9666666666666667

 

최적의 파라미터는 max_depth': 3, 'min_samples_split': 2이다. 이때 점수는 0.96이다.

 

이처럼 최적의 파라미터를 찾을 땐 GridSearchCV를 사용한다.

반응형

댓글