본문 바로가기

파이썬/모델 성능평가

그리드 서치로 최적화 하이퍼파라미터 찾기 (GridSearchCV)

머신러닝에서 모델의 성능을 높이기 위해서는 하이퍼파라미터를 적절하게 튜닝하는 것이 중요하다.

이 때 파라미터를 직접 하나하나 조정해가면서 최적의 성능을 찾을 수도 있겠지만 다소 무식한 방법이고 어떤 것이 최적화된 매개변수 값인지 알 수 없다.

 

 

그래서 사용하는 것이 그리드 서치나 랜덤서치, 베이지안 최적화와 같은 방법이다. 이번 포스팅에서는 가장 기초인 그리드 서치에 대해서 알아보자.

 

 

우선 데이터 셋은 단순히 훈련/테스트 셋으로만 나누면 새로운 데이터를 모델에 넣었을 때 맞지 않을 수 있기 때문에 중간에 모델의 성능을 평가하는 검증 셋도 반드시 필요하다. 보통 6:2:2의 비율로 훈련/검증/테스트 셋을 나눈다.

 

자세한 내용은 아래 포스팅을 참고

validation set이란 무엇일까?

 

 

그리드 서치란?

 

그리드 서치는 모델 하이퍼 파라미터에 넣을 수 있는 값들을 모두 입력하고, 모든 경우의 수에 대해 모델을 만들고 성능을 평가해 그 중 모델 성능을 가장 높게 만드는 파라미터 값을 찾아준다.

 

 

이 때 가능한 경우의 수를 직접 일일이 적어줘야 한다는 번거로움은 있다. 또 모든 경우의 수에 대해 모델을 만들고 성능을 평가하다보니 파라미터 값이 많으면 많을수록 시간도 오래 걸린다는 단점이 있다.

 

 

코드 구현

 

사이킷런의 model_selection에서 GridSearchCV를 제공한다. GridSearchCV를 사용하기 위해서는 먼저 딕셔너리 형태로 매개변수를 지정해야 한다.

 

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

data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.4, random_state=42)
X_test, X_val, y_test, y_val = train_test_split(X_test, y_test, test_size=0.5, random_state=42)

dt = DecisionTreeClassifier()

 

 

DecisionTreeClassifier의 파라미터는 위와 같다. 다만 이때 모든 파라미터에 대해서 다 그리드 서치를 해 줄 필요는 없고 중요한 파라미터에 대해서만 그리드 서치를 진행하면 된다. 

 

출처: scikit-learn

 

중요한 매개변수인 max_depth와 min_samples_split에 대해서만 그리드 서치를 진행해보자.

params = {'max_depth': [2, 3, 4, 5], 'min_samples_split' : [2,3]}

grid_search = GridSearchCV(dt, params, cv=5)
grid_search.fit(X_train, y_train)
grid_search.score(X_val, y_val)
>>>0.9666666666666667

 

GridSearchCV는 분류기와 비슷하게 fit, predict, score 메서드를 제공한다. 이때 fit메서드는 단순히 최적의 매개변수만 찾는 것이 아니라 교차 검증 성능이 가장 좋은 매개변수로 전체 훈련 세트에 대해 새로운 모델을 자동으로 만들어준다.

(refit=True로 설정된 경우/디폴트값임)

 

 

여기서는 max_depth를 4개, min_samples_split을 2개 설정했으니 4*2=8개의 경우의 수에 대해 모델을 만들고, 각각의 성능을 평가해서 최적의 파라미터 값을 찾아주는 것이다.

 

#최적의 파라미터, 최상의 교차 검증 점수 확인
print(grid_search.best_params_)
print(grid_search.best_score_)
>>>{'max_depth': 2, 'min_samples_split': 3}
>>>0.9111111111111111


from sklearn.metrics import accuracy_score
#최적의 매개변수에서 전체 훈련 세트를 사용해 학습한 모델(최고 성능 모델)
estimator = grid_search.best_estimator_

#최고 성능 모델에 predict
y_pred = estimator.predict(X_val)
accuracy_score(y_val, y_pred)
>>>0.9666666666666667

 

최적의 파라미터 값과 최적의 교차검증 점수를 알고 싶다면 best_params_와 best_score_로 확인하면 된다.

 

best_estimator_속성은 최적의 매개변수로 튜닝된 모델이다. 이 모델에 X_val로 predict를 해준 후 검증세트의 정확도로 성능을 평가하면 된다.