728x90

1. 그리드 서치를 사용하는 이유

GridSearchCV는 모델의 주요 하이퍼 파라미터 값을 일정 간격으로 조합하면서 최적 성능의 모델을 탐색하는 방법이다.

조금 더 세부적으로 Grid가 격자라는의미로 Grid SearchCV 격자 검색은 선택된 값들의 모든 조합을 평가해서 최적의 선택을 결정하는 것을 의미한다.

교차 검증을 기반으로 하이퍼 파라미터의 최적 값을 구한다.

사이킷런의 GridSearchCV를 이용하면 Classifier와 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할수 있는 방안을 제공한다.

 2. 그리드 서치의 특징

train / test data로 분리 후 모든 파라미터를 순차 적용할 수 있도록 GridSearchCV를 활용한다.

사용자가 원하는 여러 종류의 하이퍼 파라미터를 다양하게 테스트하므로 수행시간이 오래 걸리는 것을 생각해야 한다.

그래서 실행 소요 시간을 고려하여 상대적으로 조합의 수가 적을 때 많이 활용된다.

하이퍼 파라미터의 Search Space가 클 땐 RandomizedSearch(무작위 탐색 기법)을 사용한다.

3. GridSearchCV의 Parameter

Parameter 설명
estimator Classifier, Regressor, Pipeline
param_grid estimator 튜닝을 위한 Parameter와 사용될 값 또는 값의 범위를 지정 
scoring 예측 성능 평가 방법
n_jobs 병렬 처리를 위한 core 수 지정 ( default : -1 → 모든 core 사용)
cv 교차 검증을 위해 분리되는 train / test data 수
refit 최적의 파라미터 찾은 후 재학습 ( default : True )

4 .scoring 종류

자주 사용하는 scoring 종류는 아래와 같다.

scoring 설명
accuracy (분류) 모델 정분류율
f1 (분류) 정밀도와 재현율 지수를 이용한 정확도 지수
r2 (예측) 모델의 설명력

더 자세한 종류를 위해 아래의 사이트를 첨부한다.

https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter 

 

3.3. Metrics and scoring: quantifying the quality of predictions

There are 3 different APIs for evaluating the quality of a model’s predictions: Estimator score method: Estimators have a score method providing a default evaluation criterion for the problem they ...

scikit-learn.org

5. 그리드 서치 실습

패키지 불러오기
# 데이터 구성
import pandas as pd
import numpy as np
# seaborn
import seaborn as sns
# 데이터 분리
from sklearn.model_selection import train_test_split
# DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier as DTC
# GridSearchCV
from sklearn.model_selection import GridSearchCV
# 경고 메시지
import warnings
warnings.filterwarnings('ignore')
데이터 불러오기
# 데이터 불러오기
df_raw = sns.load_dataset('iris')
데이터 분리
# 설명변수, 목표변수 데이터 구분
df_raw_x = df_raw.drop('species', axis = 1, inplace = False)
df_raw_y = df_raw['species']
# 데이터 분리
df_train_x, df_test_x, df_train_y, df_test_y = train_test_split(df_raw_x, df_raw_y, test_size = 0.3, random_state = 1234)
print('train data X size :', df_train_x.shape)
print('train data Y size :', df_train_y.shape)
print('test data X size :', df_test_x.shape)
print('test data Y size :', df_test_y.shape)

기본 옵션으로 DecisionTreeClassifier 모델 생성
# 기본 옵션으로 모델 생성
dtc_basic = DTC()
dtc_basic.fit(df_train_x, df_train_y)
# train/test 데이터 설명력
print('Accuracy in train set :', dtc_basic.score(df_train_x, df_train_y).round(3))
print('Accuracy in test set :', dtc_basic.score(df_test_x, df_test_y).round(3))

GridSearchCV
estimator = DTC()
# parameter
param_grid = {'min_samples_leaf' : range(1,11),
              'min_samples_split' : range(2,11,2),
              'max_depth' : range(1,11)}
# 설명력이 높은 최적 parameter 찾기
grid_dtc = GridSearchCV(estimator,
                        param_grid,
                        scoring = 'accuracy',
                        n_jobs = -1)
grid_dtc.fit(df_train_x, df_train_y)
GridSearchCV 전체 결과 확인
score = pd.DataFrame(grid_dtc.cv_results_)
score[['params','mean_test_score','rank_test_score','split0_test_score','split1_test_score','split2_test_score']]

GridSearchCV 적용 모델 결과 확인
print('최적 하이퍼 파라미터 확인\n',grid_dtc.best_params_)
print('\n최고 정확도\n{:.4f}'.format(grid_dtc.best_score_))
# 테스트 데이터셋 정확도
estimator = grid_dtc.best_estimator_
pred = estimator.predict(df_test_x)
from sklearn.metrics import accuracy_score
print('\ntest data 정확도 : {:.4f}'.format(accuracy_score(df_test_y,pred)))

반응형