前回に引き続き、今回もoptunaでハイパーパラメーターのチューニングを行います。
今回のアルゴリズムはXGBoost。
# 目的関数
def objective(trial):
# データセットの作成
dtrain = xgb.DMatrix(df_X_train, label=df_y_train)
dvalid = xgb.DMatrix(df_X_valid, label=df_y_valid)
param = {
# 固定しているパラメーター
"silent": 1,
"objective": "reg:squarederror",
"eval_metric": "rmse",
'subsample': 1.0,
# 固定したほうが良いかもしれないパラメーター
"booster": trial.suggest_categorical("booster", ["gbtree", "gblinear", "dart"]),
'learning_rate': trial.suggest_float('learning_rate',0.1, 1.0, step=0.1 ),
# 探索するパラメーター
'max_depth': trial.suggest_int('max_depth', 3, 10),
'min_child_weight': trial.suggest_int('min_child_weight', 1, 40),
'gamma': trial.suggest_int('gamma', 1, 10),
"lambda": trial.suggest_loguniform("lambda", 1e-4, 1.0),
"alpha": trial.suggest_loguniform("alpha", 1e-4, 1.0),
'seed': 0,
}
# Add a callback for pruning.
pruning_callback = optuna.integration.XGBoostPruningCallback(trial, "validation-rmse")
# training
model = xgb.train(param, dtrain, verbose_eval=False,
num_boost_round=2000,
evals=[(dvalid, "validation")],
callbacks=[pruning_callback])
# predict
preds = model.predict(dvalid)
# rmseを返す
return np.sqrt(mean_squared_error(df_y_valid, preds))
num_boost_roundは大きい方が精度が高くなる。
その分、計算に時間がかかるので、pruningを入れて余計な試行を減らす。
# studyの作成
study = optuna.create_study(sampler=optuna.samplers.TPESampler(seed=0),
pruner=optuna.pruners.MedianPruner(n_warmup_steps=400),
direction="minimize")
study.optimize(objective ,n_trials=20)
これで、studyの中に学習結果が作られる。
XgboostやLightGBMは学習に時間がかかるが、その分、他のアルゴリズムに比べると、
色々なデータセットに対して汎用性が高いことが多い。
パラメーターが多かったり、scikit-learnじゃなかったりするのでとっつきにくいかもしれないですが、
一度覚えると結構便利です。