본문 바로가기
Machine-Learning/Basic

[ML] GirdSearchCV

by AteN 2022. 11. 30.

GridSearchCV 

- 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에 

 

하이퍼 파라미터는 머신러닝 알고리즘을 구성하는 주요 구성 요소이며, 이값을 조정해 알고리즘의 예측 성능을 개선할 수 있다. 

 

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

Grid는 격자라는 뜻으로, 촘촘하게 파라미터를 입력하면서 테스트를 하는 방식이다. 예를 들어 결정 트리 알고리즘의 여러 하이퍼 파라미터를 순차적으로 변경하면서 최고 성능을 가지는 파라미터 조합을 찾고자 한다면 다음과 같이 파라미터의 집합을 만들고 이를 순차적으로 적용하면서 최적화를 수행할 수 있다. 

 

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

하이퍼 파라미터는 다음과 같은 순차적으로 적용되며, 총 6회의 파라미터를 순차적으로 바꿔 실행하면서 최적의 파라미터와 수행 결과를 도출할 수 있다. for 루프로 모든 파라미터를 번갈아 입력하면서 학습시키는 방법을 좀더 유연하게 API레벨에서 제공하는 것이다 

 

GridSearchCV는 교차 검증을 기반으로 하이퍼 파라미터의 최적 값을 찾게 해준다. 즉 데이터 세트를 cross-Validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤에 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾을 수 있게 해준다. 

GridSearchCV는 사용자가 튜닝하고자 하는 여러 종류의 하이퍼 파라미터를 다양하게 테스트하면서 최적의 파라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸리는 것에 유념해야 한다. 

 

GridSearchCV 클래스의 생성자로 들어가는 주요 파라미터는 다음과 같다

  • estimator : Classifier, regressor, pipeline
  • param_grid : key + 리스트 값을 가지는 딕셔너리가 주어진다. estimator의 튜닝을 위해 파라미터명과 사용되 여러 파라미터 값을 지정 
  • scoring : 예측 성능을 측정할 평가 방법을 지정 
  • cv : 교차 검증을 위해 분할되는 학습/테스트 세트의 개수를 지정
  • refit : 디폴드가 True이며 True로 생성 시 가장 최적의 하이퍼 파라미터를 찾을 뒤 입력된 estimator 객체를 해당 하이퍼 파라미터로 재학습시킨다. 

 

실습 예제

- 결정 트리 알고리즘의 여러가지 최적화 파라미터를 순차적으로 적용해 붓꽃 데이터를 예측 분석하는데 GridSearchCV를 이용

- max_depth와 min_samples_split의 값을 변화시키면서 최적화를 진행 

import pandas as pd

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

iris_data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target,
                                                   test_size=0.2, random_state=42
                                                   )
dtree = DecisionTreeClassifier()

# 파라미터를 딕셔너리 형태로 설정
parameters = {'max_depth': [1,2,3], 'min_samples_split':[2,3]}

# param_grid의 하이퍼 파라미터를 3개의 train, test set fold로 나누어 테스트 수행 설정 
# refit=True가 default이며, True이면 가장 좋은 파라미터 설정으로 재학습시킨
grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)

# 붗꽃 학습 데이터로 param_grid의 하이퍼 파라미터를 순차적으로 학습/평가
grid_dtree.fit(X_train, y_train)

# GridSearchCV 결과를 추출해 Dataframe으로 변환
scores_df = pd.DataFrame(grid_dtree.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score',
          'split0_test_score', 'split1_test_score', 'split2_test_score'
          ]]

 

주요 칼럼 설명 

  • params :칼럼에는 수행할 때마다 적용된 개별 하이퍼 파라미터 값을 나타낸다
  • rank_test_score : 하이퍼 파라미터별로 성능이 좋은 score 순위를 나타낸다. 1이 가장 뛰어난 순위이며 이때의 파라미터가 최적의 파이퍼 파라미터
  • mean_test_score : 개별 하이퍼 파라미터 별로 CV의 폴딩 테스트 세트에 대해 총 수행한 평가 평균값

 

 총 6개의 결과를 볼 수 있으며, rank_test_score이 1이라고 되어있는 idx 4, 5이 가장 좋은 결과를 나타내는 것을 확인 할 수 있을 것이다. 

print('GridSearchCV 최적 파라미터:', grid_dtree.best_params_)
print('GridSearchCV 최고 정확도 : {0:.4f}'.format(grid_dtree.best_score_))
GridSearchCV 최적 파라미터: {'max_depth': 3, 'min_samples_split': 2}
GridSearchCV 최고 정확도 : 0.9667

GridSearchCV 객체의 fit()을 수행하면 최고 성능을 나태낸 하이퍼 파라미터의 갑소가 그대의 평가 결과 값이 각각 best_params_, best_score_ 속성으로 기록된다. 즉, cv_result_의 rank_test_score가 1일 때의 값이다. 

 

# GridSearchCV의 refit으로 이미 학습되 esimator 변환
estimator = grid_dtree.best_estimator_

from sklearn.metrics import accuracy_score

# GridSearchCV의 best_estimator_는 이미 최적 합슥이 됐으므로 별도 학습이 필요 없음 
pred = estimator.predict(X_test)
print('테스트 데이터 세트 정확도 : {0:.4f}'.format(accuracy_score(y_test, pred)))
테스트 데이터 세트 정확도 : 0.9667

 

refit=True이면 GridSearchCV가 최적 성능을 나타내는 하이퍼 파라미터로 Estimator를 학습해 best_estimator_로 저장한다. 이미 학습된 best_estimator_를 이용해 분리된 테스트 데이터 세트에 대해 예측하고 성능 평가하를 할수 있다. 

댓글