LoginSignup
56
44

More than 3 years have passed since last update.

LightGBM Tunerを用いたハイパーパラメーターのチューニング

Posted at

はじめに

前回、kaggleをやった時のデータを用いて、optunaのハイパーパラメータのチューニングを試してみたいと思います。
データに関しては前回記事に記載してあります。

optunaはPreferred Networksが開発したもので、ハイパーパラメーターを自動でチューニングしてくれるものです。
特に、LightGBMのチューニングに関しては、グリッドサーチの掛け算的な探索に対して、足し算的に探索をしてくれます。
どういう事かと言うと、例えば、n_estimators=[50, 100, 150]、mad_depth=[10, 15, 20]で
最適なパラメータを探索するとします。
グリッドサーチなら3×3で9回の試行を繰り返します。それに対し、optunaのLightGBM tunerでは3+3の6回の試行を繰り返します。
試行回数が少ない代わりに、optunaは、精度に重要と考えられるパラメーターから優先して調整を行います。そうすることにより、より少ない回数で最適なパラメーターを探索してくれます。
より詳細なことに関しては、[Optuna の拡張機能 LightGBM Tuner によるハイパーパラメータ自動最適化]を参照してください。LightGBM Tinerの優位性について色々実験した結果が書いてあります。

では、早速やっていきたいと思います。

lightgbm tunerによるハイパーパラメーターのチューニング

LightGBM Tunerを使う場合、普通にlightgbmをimportするのではなく、optunaを通してimportします。

# import lightbgm as lab (こっちの代わりに下のやり方でimportします)
from optuna.integration import lightgbm as lgb


# optuna.__version__  1.3.0

この方法で普通に学習させると自動でチューニングをしてくれます。

ts = time.time()

dtrain = lgb.Dataset(x_train, label=y_train)
eval_data = lgb.Dataset(x_val, label=y_val)

param = {
        'objective': 'regression',
        'metric': 'rmse',
        'verbosity': -1,
        'boosting_type': 'gbdt',
    }

best = lgb.train(param, 
                 dtrain,
                 valid_sets=eval_data,
                 early_stopping_rounds=100)

time.time() - ts

# time: 2945.9576

"""
###実際にチューニングしてくれているパラメータ###

param = {
        'lambda_l1': trial.suggest_loguniform('lambda_l1', 1e-8, 10.0),
        'lambda_l2': trial.suggest_loguniform('lambda_l2', 1e-8, 10.0),
        'num_leaves': trial.suggest_int('num_leaves', 2, 256),
        'feature_fraction': trial.suggest_uniform('feature_fraction', 0.4, 1.0),
        'bagging_fraction': trial.suggest_uniform('bagging_fraction', 0.4, 1.0),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 7),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
    }
"""

ちなみにtrialのデフォルト値は1000となっています。
なんで、early_stopping_roundsを100に設定しています。

実行時間は約50分かかりました。結構時間かかりましたが、普段あまりチューニングしない
パラメータまで細かく探索してくれるなら、1時間ぐらい費やしてもいいのかなって個人的には思っています。

チューニング後のパラメーターは以下のようになりました。

best.params
best.best_iteration
best.best_score

"""
     {'objective': 'regression',
      'metric': 'rmse',
      'verbosity': -1,
      'boosting_type': 'gbdt',
      'lambda_l1': 0.0005523588106120283,
      'lambda_l2': 6.72929973145413e-07,
      'num_leaves': 6,
      'feature_fraction': 0.8,
      'bagging_fraction': 1.0,
      'bagging_freq': 0,
      'min_child_samples': 20}

      best.best_iteration: 555

      best.best_score(rmse): 0.93714
"""

このパラメータを使ったモデルで予測したところ、kaggleのスコアで0.94293が出ました。
前回の時よりも少し伸びました。

これ以上は、チューニングでもあまり変化はしないと思うので、他でfeature engineeringしていかないといけないですね。

難しい、、、

終わりに

今回は、LightGBM Tunerを使ったハイパーパラメーターのチューニングを行いました。

他のチューニング手法との精度の比較はしていないのですが、上記に貼ったリンクには、
共通ベンチマークを使って他のチューニング手法と比較もしており、その結果、LightGBM Tunerが最も優れていると言う結果がでています。まだ、できたばっかりの手法ですので、改善の余地はあるそうなのですが、色々試行錯誤しながらチューニングするよりも、だいぶ楽な気がします。
また、グリッドサーチのように大雑把な値でチューニングするのでは無く、細かくチューニングしてくれるので、kaggleで、後少しだけスコアを伸ばしたいと言うときにオススメです。

56
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
44