본문 바로가기

Lecture ML

머신러닝 강좌 #3] GridSearchCV - 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에

반응형

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

 

사이킷런은 GridSearchCV API를 이용해 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공합니다. 예를 들어 DecisionTree 알고리즘의 여러 하이퍼 파라미터를 순차적으로 변경하면서 최고 성능을 가지는 파라미터 조합을 찾고자 한다면 다음과 같이 파라미터의 집합을 만들고 이를 순차적으로 적용하면서 최적화를 수행할 수 있습니다. 

 

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

 

이럴경우 조합으로 3*2인 6개의 조합으로 파라미터를 바꾸어가며 알고리즘의 파라미터를 바꾸어가며 실행을 하게 됩니다.

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

 

  • estimator: classifier, regressor, pipeline이 사용될 수 있습니다.
  • param_grid: key+ 리스트 값을 가지는 딕셔너리가 주어집니다. estimator의 튜닝을 위해 파라미터명과 사용될 여러 파라미터 값을 지정합니다.
  • scooring: 예측 성능을 측정할 평가 방법을 지정합니다. 보통은 사이킷런의 성능 평가 지표를 지정하는 문자열(예: 정확도의 경우 'accuracy')로 지정하나 별도의 성능 평가 지표 함수도 지정할 수 있습니다.
  • cv: 교차 검증을 위해 분할되는 학습/테스트 세트의 개수를 지정합니다.
  • refit: 디폴트가 True이며 True로 생성 시 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator객체를 해당 하이퍼 파라미터로 재학습 시킵니다.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split

iris = load_iris()
iris_data = iris.data
x_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=121)
dtree = DecisionTreeClassifier()

parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}
import pandas as pd
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)
grid_dtree.fit(x_train, y_train)
score_df = pd.DataFrame(grid_dtree.cv_results_)
print(score_df[['params','mean_test_score','rank_test_score']])

 

Rank Score, 1위는 Max Depth는 3, Min Sample Split 3이 1위임을 알 수 있다.

                                     params  mean_test_score  rank_test_score
0  {'max_depth': 1, 'min_samples_split': 2}         0.700000                5
1  {'max_depth': 1, 'min_samples_split': 3}         0.700000                5
2  {'max_depth': 2, 'min_samples_split': 2}         0.958333                3
3  {'max_depth': 2, 'min_samples_split': 3}         0.958333                3
4  {'max_depth': 3, 'min_samples_split': 2}         0.975000                1
5  {'max_depth': 3, 'min_samples_split': 3}         0.975000                1

 

결과 파라미터 중 중요 내용은 아래와 같습니다.

  • param칼럼에는 수행할 때마다 적용된 개별 하이퍼 파라미터 값을 나타냅니다.
  • rank_test_score는 하나의 파라미터별로 성능이 좋은 score순위를 나타냅니다. 1이 가장 뛰어난 순위이며 이때의 파라미터가 최적의 하이퍼 파라미터입니다.
  • mean_test_score는 개별 하이처 파라미터별로 CV의 폴딩 테스트 세트에 대해 총 수행한 평가 평균값입니다.
print('최적 파라미터:', grid_dtree.best_params_)
print('최고 정확도:', grid_dtree.best_score_)

#최적 파라미터: {'max_depth': 3, 'min_samples_split': 2}
#최고 정확도: 0.975

최적 파라미터가 max_depth가 3이고, min_samples_split가 2일 때 검증용 폴드 세트에서 평균 최고 정확도가 97.5%로 측정됐습니다. GridSearchCV객체의 생성 파라미터로 refit=True가 디폴트입니다. 

 

#GridSearchCV의 refit으로 이미 학습된 estimator 반환
estimator = grid_dtree.best_estimator_
pred = estimator.predict(X_test)

#GridSearchCV의 best_estimator_는 이미 최적 학습이 됐으므로 별도 학습이 필요 없음
from sklearn.metrics import accuracy_score
print('예측 정확도', accuracy_score(y_test, pred))

 

예측 정확도 0.9666666666666667

반응형