ノーコードでハイパーパラメータを調整して過学習を改善する (LightGBM)

モデルのパフォーマンスにはデータだけではなく、ハイパーパラメータも影響します。

XGBoostやLightGBM,CatBoostなどの複雑なモデルは、その性能を最大限に活用するために、ハイパーパラメータを正しく調整する必要があります。
昨今ではVARISTAでもサポートしているOptunaやHyperoptなどの最適化ツールやAutoMLの登場により、自動でパラメータチューニングを行う事も可能になりました。

＊Optunaを使った自動チューニングはこちらの記事を参考にしてください。
[VARISTAでのハイパーパラメータの最適化と実験管理 Optuna編](https://www.varista.ai/blog/hyperparameter-optimization-with-optuna-and-experiments-with-varista/ "VARISTAでのハイパーパラメータの最適化と実験管理 Optuna編")

しかし、AutoMLなどが生成したモデルはパラメータを探索しきれていないケースもあり、データサイエンティストが手動で微調整すると更に優れたモデルになることもあります。

そこで、今回は過学習したモデルを例に、ハイパーパラメターのチューニングをVARISTAで行う方法を解説します。

今回利用するデータセットには、7000行、21の説明変数、および目的変数が含まれています。

![VARISTA Blog HyperParameterTuning LightGBM 011](//images.ctfassets.net/8qlu80sl3ynp/Ub7Dca1FdHbkE1urPLYaG/ac66113974aa5a545891f92c053c7708/VARISTA_Blog_HyperParameterTuning_LightGBM_011.png)
ターゲットは数値のため、回帰タスクになります。

この記事の目的はハイパーパラメータチューニングですので、データの前処理などは割愛します。

まずは、VARISTAに用意されているデフォルトのテンプレートをXGBoostからLightGBMに変更し、そのままのハイパーパラメータで学習します。

学習は20秒程度で完了しますので、結果を確認してみます。
複数のメトリクスが表示されていますが、今回はRMSEを基準にして進めます。

以下に表示されているのは、教師データをFold=3でクロスバリデーションを行った際の、学習時と検証時のRMSEです。
- train_neg_root_mean_squared_error: 学習時のRMSE
- test_neg_root_mean_squared_error: 検証時のRMSE

＊VARISTAではscikit-learnのクロスバリデーションを利用するため、RMSEはNegativeの値となります。
[3.3. Metrics and scoring: quantifying the quality of predictions](https://scikit-learn.org/stable/modules/model_evaluation.html "3.3. Metrics and scoring: quantifying the quality of predictions")

![VARISTA Blog HyperParameterTuning LightGBM 001](//images.ctfassets.net/8qlu80sl3ynp/5pv8AAYEmWwOB1UGOeyali/e456fbc0ee383240e38f3b01bd5e1ed7/VARISTA_Blog_HyperParameterTuning_LightGBM_001.png)

![VARISTA Blog HyperParameterTuning LightGBM 002](//images.ctfassets.net/8qlu80sl3ynp/1XECB2A1ZySz2vsRhkICgG/c9fd295d0185e6fa0a400343faf4b79c/VARISTA_Blog_HyperParameterTuning_LightGBM_002.png)

比較しやすいように今回着目するメトリクスを以下に抽出しました。
![VARISTA Blog HyperParameterTuning LightGBM 016](//images.ctfassets.net/8qlu80sl3ynp/4gdlFU0aBV2ZJKOgAcr2K7/51174ed45dbf5a765d0aa1d28c485158/VARISTA_Blog_HyperParameterTuning_LightGBM_016.png)
![VARISTA Blog HyperParameterTuning LightGBM 017](//images.ctfassets.net/8qlu80sl3ynp/wZcAMLs31V95D5jJtegOd/08190ad6a6c3952d109c8e4c3d9cf155/VARISTA_Blog_HyperParameterTuning_LightGBM_017.png)

学習時と検証時のRMSEはおよそ-5の差がありますので、出来上がったモデルは学習データに適合してしまっています。つまり過学習の状態です。

それでは、この状態からハイパーパラメータを調整してモデルの性能を改善していきます。

まず、min_data_in_leafを変更して、過学習を抑制する方法を試してみます。
min_data_in_leafは、決定木の葉の最小データ数を指定します。
値を大きくすると、決定木が深く育つのを抑えるため過学習を防ぐことができますが、逆に未学習となる場合もあります。

モデルが適合しすぎないように、各リーフのデータ数を調整します。
今回は、この値を100に変更して学習してみます。
![VARISTA Blog HyperParameterTuning LightGBM 012](//images.ctfassets.net/8qlu80sl3ynp/74222CU0uXHOPtN6ETTqmK/96a0663e0c163ac134563b7ba0694811/VARISTA_Blog_HyperParameterTuning_LightGBM_012.png)

この状態で出来上がったモデルを確認してみます。
![VARISTA_Blog_HyperParameterTuning_LightGBM_003](//images.ctfassets.net/8qlu80sl3ynp/2KdThfZLybgPRoFoJxk5m4/d699a7d2aee9d3e02aa3f8705c1c799e/varista-dev.web.app_project_7a91db34-059a-49ed-9328-85caf95ad543_training_models_fba0072d-bebf-4d10-a190-852e14a4dc3f_algori.png)![VARISTA Blog HyperParameterTuning LightGBM 004](//images.ctfassets.net/8qlu80sl3ynp/5IbpIJjxjsgXBzDbfqTweJ/2fff77f0d3bf8cabb0f18fcd99c59c55/VARISTA_Blog_HyperParameterTuning_LightGBM_004.png)
検証のRMSEは同じですが、学習のRMSE値が下がり検証の値に近くなりました。
これは、先程の結果よりも過学習を抑制できたことを意味します。

モデルが適合しすぎないようにするもう1つのパラメーターは、イテレーションごとにランダムに選択される特徴量の比率を調整するfeature_fractionです。
このfeature_fractionの値を0.8に変更してモデルを作成してみます。
![VARISTA Blog HyperParameterTuning LightGBM 013](//images.ctfassets.net/8qlu80sl3ynp/5uXSEnLHoitX6Uxv1obdGu/bd5189e109f204a9378c6a797689ce19/VARISTA_Blog_HyperParameterTuning_LightGBM_013.png)

この値にパラメータを設定すると、モデルは各イテレーションで特徴量を80％ほど使用します。
結果は以下のとおりです。
![VARISTA Blog HyperParameterTuning LightGBM 005](//images.ctfassets.net/8qlu80sl3ynp/1q1OgR28zXNpFdyr16SnPM/a4db8c66c6eac6d6bb8b522f17055b83/VARISTA_Blog_HyperParameterTuning_LightGBM_005.png)
![VARISTA Blog HyperParameterTuning LightGBM 006](//images.ctfassets.net/8qlu80sl3ynp/5VHI9IzKTK7o29fOOAHC4Q/0d5e2343f2bf5edbc3631cf58a78bfd2/VARISTA_Blog_HyperParameterTuning_LightGBM_006.png)
学習のRMSE値が更に改善されました。

次は、bagging_fractionとbagging_freqの値を調整します。
bagging_fractionは、学習データからランダムに行をサンプリングして、各イテレーションで使用する割合を指定します。feature_fractionに似ていますが、bagging_fractionは行に対して行います。bagging_freqは、サンプリングした行を更新する頻度を調整する際に設定するパラメータです。
![VARISTA Blog HyperParameterTuning LightGBM 014](//images.ctfassets.net/8qlu80sl3ynp/2oP5NPJNrD22qg016AHa4G/9f3767eb2c186d07db3d5b3a0c59faa8/VARISTA_Blog_HyperParameterTuning_LightGBM_014.png)
- bagging_fraction：0.8
- bagging_freq：10

![VARISTA Blog HyperParameterTuning LightGBM 007](//images.ctfassets.net/8qlu80sl3ynp/1vwqLMPom2NV1cebeP8p1H/680597ba3d5fbc1d5691aae7456fc7a9/VARISTA_Blog_HyperParameterTuning_LightGBM_007.png)
![VARISTA Blog HyperParameterTuning LightGBM 008](//images.ctfassets.net/8qlu80sl3ynp/1Zlpm7YbNfPU99WsdK3cTW/be24691825dc4aa34ea2f8a31af6cb1c/VARISTA_Blog_HyperParameterTuning_LightGBM_008.png)
学習のRMSEと検証のRMSEの差はさらに減少しました。

次に調整するパラメータは、max_depth, num_leaves, learning_lateです。
LightGBMは、ブースティング手法を用いて決定木を組み合わせ、アンサンブル学習を使うアルゴリズムです。ですので、個々のツリーの複雑さも過学習の原因になります。
ツリーの複雑さは、max_depthとnum_leavesで調整します。max_depthはツリーの最大深度を調整し、num_leavesはツリーが持つことができるリーフの最大数を調整します。

LightGBMでは、このmax_depthとnum_leavesの2つのパラメーターは一緒に調整します。

最後に、learning_rateです。一般的に、学習率は小さいほどパフォーマンスはよくなりますが、モデルの学習が遅くなりますので、データ量やマシンスペックを考慮して設定します。
今回の場合は、データ数もあまり多くないので0.001に設定しています。

![VARISTA Blog HyperParameterTuning LightGBM 015](//images.ctfassets.net/8qlu80sl3ynp/3qjJyQZ6nve9rd8LgrBTIR/03ab6650d1917bc85fb7890928416b10/VARISTA_Blog_HyperParameterTuning_LightGBM_015.png)
- max_depth：7
- num_leaves：70
- learning_rate：0.001

![VARISTA Blog HyperParameterTuning LightGBM 009](//images.ctfassets.net/8qlu80sl3ynp/5Dg6fu00NAq2q3903FEm5N/c8070e2581ef0bb3f849022a97a701ab/VARISTA_Blog_HyperParameterTuning_LightGBM_009.png)
![VARISTA Blog HyperParameterTuning LightGBM 010](//images.ctfassets.net/8qlu80sl3ynp/4PgetlyyQvjKIt5ItVhrvc/238a34fef20a7ae998b97d254c9ad932/VARISTA_Blog_HyperParameterTuning_LightGBM_010.png)
学習のRMSEと検証のRMSEの差はさらに減少しました。

このように、ハイパーパラメータを調整することで、モデルの過学習を防ぐことができます。

しかし、そもそものモデルのパフォーマンスが目標とする値に全く達していない場合は、ハイパーパラメータの調整では限界があります。
そのような場合は、まずはデータの量や質を見直して特徴量エンジニアリングなどを行い、モデルのパフォーマンスが目標値に近くなってきたらハイパーパラメータのチューニングを行う方が効果的です。