Optunaの拡張機能LightGBM Tunerのアルゴリズムを深掘りしてみた

LightGBMでモデルを実装した際に、LightGBM用に特化したハイパーパラメータ自動最適化のためのモジュールを見つけたので使用してみました。ここではどうやってLightGBM Tunerがパラメータチューニングしているのかを深く見てみます。
はじめに
LightGBMでモデルを実装した際に、LightGBM用に特化したハイパーパラメータ自動最適化のためのモジュールを見つけたので使用してみました。
LightGBM Tunerを使用することで、ハイパーパラメータを何も考えることなく手軽に 1 行の変更だけで試すことができ、精度改善に貢献してくれました。LightGBM のチューニングに慣れていないユーザーにとって、強力な助っ人となり得るのではないかと思います。
LightGBM Tunerの使い方はたくさん記事があるので、ここではどうやってLightGBM Tunerがパラメータチューニングしているのかを深く見てみます。
LightGBM Tunerの使い方参考サイト
・https://toukei-lab.com/hyper-para-tuning
・https://tech.preferred.jp/ja/blog/hyperparameter-tuning-with-optuna-integration-lightgbm-tuner/
LightGBM Tunerとは
Optunaというライブラリの、LightGBM用に特化したハイパーパラメータ自動最適化のためのモジュール
以下の7つのハイパーパラメータを段階的に最適化します。
・lambda_l1(L1正則化項の係数)
・lambda_l2(L2正則化項の係数)
・num_leaves(1本の木の最大葉枚数)
・feature_fraction(各決定木においてランダムに抽出される列の割合)
・bagging_fraction(各決定木においてランダムに抽出される標本の割合)
・bagging_freq(ここで指定したイテレーション毎にバギング実施)
・min_child_sample(1枚の葉に含まれる最小データ数)
Optuna
オープンソースのハイパーパラメータ自動最適化フレームワークです。
日本の東京大学発のAIベンチャーPreferred Networks社が開発しました。
目的関数の値を評価するために、パラメータの値をサンプリングして目的関数の値を取得し、その値を元にパラメータの推定値を更新するというプロセスを繰り返すベイズ最適化を実装することで、パラメータの探索を効率的に行うことができます。
簡単にいうと、試行錯誤をしながら最適なハイパーパラメータを探索していくイメージです。
主なアルゴリズムとその動作原理
LightGBM Tunerにおける主なアルゴリズムの一つはベイズ最適化です。ベイズ最適化は高効率でハイパーパラメータの最適な組み合わせを見つけ出す手法であり、特に複雑なモデルや大規模なデータセットにおけるチューニングにおいて有効です。
ベイズ最適化のプロセス
- 目的関数の定義
目的関数は最適化したい関数ですが、この関数は直接的には知られておらず、その評価は高価(計算コストが高い、時間がかかる等)です。 - 事前分布の設定
最初に、目的関数の形状に関して不確実性を表現するために、事前分布を設定します。これは通常、ガウス過程(Gaussian Process, GP)を使用して行われ、目的関数の可能な振る舞いをモデル化します。 - 獲得関数の選択
どのパラメータを次に評価するかを決定するために獲得関数を選択します。獲得関数は、現在のモデルの不確実性と既知の情報を考慮して、最大の期待改善を提供するパラメータを特定します。 - 最適なパラメータの選択と評価
獲得関数に基づき、次に評価すべきパラメータを選択し、目的関数を評価します。この結果は、モデルの更新に使用されます。 - 事後分布の更新
新たに得られた観測結果を用いて、ガウス過程モデルを更新し、目的関数の形状に関する不確実性を減らします。これは、ベイズの定理を使用して行われます。
パラメータの探索空間
今までのハイパーパラメータチューニング
例えば、基本的なハイパーパラメータが7つあるとします。最適な組み合わせを探索する場合、組み合わせの数は掛け算で決まるため、膨大な探索空間になります(下図)
LightGBM Tunerのパラメータチューニング
Step-wiseの「1つ1つハイパーパラメータを順番に振っていって、1つずついい値を見つける」のアルゴリズムと、「重要なハイパーパラメータから順に最適なハイパーパラメータをチューニングする」という経験則をLightGBM Tunerのコードには落とし込みしてあります。一言でまとめると、経験的に影響力が大きいと思われるハイパーパラメータから順次チューニングを行います。
順次ハイパーパラメータを決定していくため、探索の組み合わせは足し算で決まり探索空間を大きく狭めることができます。
上図では簡略化されていますが、相互作用の大きいハイパーパラメータは同時にチューニングを行います。
具体的には bootstrap aggregating を制御するハイパーパラメータであるbagging_fractionとbagging_freq、正則化項のハイパーパラメータであるreg_lambdaとreg_alphaは同時にチューニングを行います。
実践的な性能比較
最低限のパラメータを指定したとき
params = {
'objective': 'regression_l1',
'metric': 'l1'
}
チューニング後のパラメータ
best_params = {
'objective': 'regression_l1',
'metric': 'l1',
'feature_pre_filter': False,
'lambda_l1': 3.4454358294911687e-08,
'lambda_l2': 1.727786973750472e-08,
'num_leaves': 5,
'feature_fraction': 1.0,
'bagging_fraction': 0.6104147834376046,
'bagging_freq': 7,
'min_child_samples': 20,
'num_iterations': 1000
}
この時、
Weighted Average of MAPE(加重平均MAPE): 34.2%
Average of MAE(平均MAE): 51.9
次にある程度パラメータを指定した時
params = {
'objective': 'regression_l1',
'metric': 'mae',
'verbosity': -1,
# 'num_iterations': 400,
'verbose_eval':False,
'seed': 42,
'early_stopping_rounds':300,
'boosting': 'gbdt'
}
チューニング後のパラメータ
best_params = {
'objective': 'regression_l1',
'metric': 'l1',
'verbosity': -1,
'verbose_eval': False,
'seed': 42,
'boosting': 'gbdt',
'feature_pre_filter': False,
'lambda_l1': 1.7706872604573067e-07,
'lambda_l2': 3.2117428494439906e-05,
'num_leaves': 106,
'feature_fraction': 0.9840000000000001,
'bagging_fraction': 0.8245814154748217,
'bagging_freq': 1,
'min_child_samples': 20,
'num_iterations': 1000,
'early_stopping_round': 300
}
この時、
Weighted Average of MAPE(加重平均MAPE): 26.0%
Average of MAE: 38.1
最初に指定したパラメータは変更されずに、そのパラメータに合ったパラメータチューニングが実行されるので、いい感じにパラメータを指定すると精度が良くなります
まとめ
LightGBM Tunerは、LightGBMモデルの性能を手間をかけずに向上させる強力なツールです。
その効率的なパラメータチューニングプロセスは、ベイズ最適化に基づき、探索空間を狭めつつ最適なハイパーパラメータの組み合わせを見つけることが可能でした。
このツールの利用は、特にハイパーパラメータのチューニングに不慣れなユーザーにとって、モデル開発の負担を軽減し、精度の高いモデル構築を支援します。