BLOG
Python

베이지안 최적화로 하이퍼파라미터 튜닝하기 (BayesianOptimization)


Dec. 8, 2022, 10:54 p.m.



하이퍼 파라미터를 튜닝하는 것은 좋은 모델을 사용하는 것 만큼 중요하다. 사실 어떤 하이퍼 파라미터가 결과를 예측하는데 어떻게 영향을 끼치는 지 우리는 직관적으로 알기 어렵다. 그렇기 때문에 경험적으로 파라미터를 튜닝해야한다.

.

그러나 이 값, 저 값 하나씩 넣어보면서 모델의 성능을 비교하면서 하는 것은 힘들다. 각각 학습 하는데도 시간이 오래걸리기 때문이다. 그래서 이것을 자동화 하는 방법이 있는데 그것이 그리드서치이다.

.

그리드 서치는 내가 직접 파라미터를 하나하나 넣어보는 대신, 내가 미리 지정해놓은 파라미터 매트릭스를 입력받아 가능한 모든 파라미터 조합에 대해서 모델을 학습, 검증해보고 가장 성능이 좋았던 파라미터를 결정하는 방식이다.

.

이것은 사이킷런에 구현이 되어있고, 내 블로그에서도 정리를 한번 해 둔 적이 있다.

.

그러나 이것도 그렇게 효율적인 방법은 아니다.

.

일단 내가 성능을 평가해볼 파라미터들을 각각 지정해 주어야 한다는 점인데 내가 애초에 이상한 파라미터들을 검사했다면 그 중에서 가장 좋은 파라미터 조합을 찾았다고 해도 좋은 결과를 얻지 못할 것이다.

.

또한 만약에 내가 learning_rate라는 값을 [0.1, 0.01, 0.001] 로 그리드서치를 돌렸는데 0.01이 제일 좋은 성능이 나왔다. 그렇다고 해서 0.01이라는 값이 가장 좋은 값인가? 그렇지 않다. 만약에 0.025 같은 값이 가장 좋은 값일 수도 있는 것이다. 즉, 연속적으로 값을 탐색할 필요가 있다는 것이다.

.

이러한 그리드서치의 단점을 보완하는 알고리즘이 바로 베이지안 최적화 이다. 베이지안 최적화는 최적화 할 파라미터의 범위만 지정해주면 그 안에서 연속적으로 최적의 파라미터를 찾는다.

.

나는 단지 파라미터의 범위를 적당하게 설정해주기만 하면 된다. 베이지안 최적화를 사용하는 방법에 대해서 알아보자.

1. 설치


설치는 pip로 설치하면 된다.

pip install bayesian-optimization

2. 파라미터 범위 설정


나는 XGBoost 모델을 위한 파라미터의 범위를 설정할 것이다. 범위는 딕셔너리 형식으로 만들어주면 된다.

param_bounds = {'max_depth': (4, 8),
'subsample': (0.6, 0.9),
'colsample_bytree': (0.7, 1.0),
'min_child_weight': (5, 7),
'gamma': (8, 11),
'reg_alpha': (7, 9),
'reg_lambda': (1.1, 1.5)}

3. 평가 함수 작성


그 다음 베이지안 최적화기에 넣을 평가 함수를 만들어 주어야 한다. 이 함수는 각 파라미터를 인수로 받아서 모델의 검증 점수를 반환한다.

from sklearn.metrics import roc_auc_score

def eval_function(max_depth, subsample, colsample_bytree, min_child_weight, gamma, reg_alpha, reg_lambda):
  param_bounds = {'max_depth': max_depth,
                  'subsample': subsample,
                  'colsample_bytree': colsample_bytree,
                  'min_child_weight': min_child_weight,
                  'gamma': gamma,
                  'reg_alpha': reg_alpha,
                  'reg_lambda': reg_lambda}
  xgb_model = xgb.train(params=params, dtrain=train, num_boost_round=2000, evals=[(valid, 'valid')], maximize=True, early_stopping_round=200)
  best_iter = xgb_model.best_iteration
  preds = xgb_model.predict(valid, iteration_range=(0, best_iter))
  score = roc_auc_score(y_valid, preds)

  return score

보면 파라미터를 받아서 모델에 넣어주고 학습 시킨 후 검증 데이터셋으로 사이킷런 metrics의 roc_auc_score를 이용해 점수를 계산, 반환한다.

4. 최적화 수행하기


이제 최적화를 수행하기만 하면 된다.

from bayes_opt import BayesianOptimization

optimizer = BayesianOptimization(f=eval_function, pbounds=param_bounds)

optimizer.maximize(init_points=3, n_iter=10)

이렇게 하면 이전에 작성해둔 파라미터 범위 내에서 베이지안 최적화를 진행하게 된다.

최적화가 다 끝나게 되면 optimizer로 부터 최적화된 파라미터를 받아올 수 있다.

max_params = optimzier.max['params']

이상으로 베이지안 최적화를 파이썬에서 사용하는 법에 대해서 알아보았다.

python sklearn bayes_opt



Search