一般社団法人 全国個人事業主支援協会

COLUMN コラム

前回に引き続き、今回も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じゃなかったりするのでとっつきにくいかもしれないですが、

一度覚えると結構便利です。

 

The following two tabs change content below.

東 健太朗

最新記事 by 東 健太朗 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア