반응형
그리드 서치는 최적의 파라미터를 찾아준다.
여러 모델에는 각각의 파라미터가 있는데 어떤 조합일 때 제일 좋은 점수가 나오는지 비교해주는 것이다.
이번엔, 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를 사용한다.
반응형
'개발 Tools > 파이썬_Deep learning & ML' 카테고리의 다른 글
머신러닝 MinMaxScaler(정규화) (0) | 2021.07.15 |
---|---|
머신러닝 StandardScaler(표준화) (0) | 2021.07.15 |
머신러닝 cross_val_score (estimator, scoring) (0) | 2021.07.13 |
머신러닝 Stratified KFold (0) | 2021.07.13 |
머신러닝 KFold (n_splits) (0) | 2021.07.13 |
댓글