LightGBMのチューニングガイド

LightGBMの公式ドキュメントにある下記のチューニングガイドを基に、チューニングの方法をまとめてみました。

重要なパラメーター

num_leaves

num_leavesはツリーのリーフの数を制御するパラメータです。多すぎるとモデルが複雑になり過剰適合の原因となります。一般的には、学習データのサイズや特徴量の数に応じて適切な値を設定します。

min_data_in_leaf

min_data_in_leafは各リーフに含まれる最小データ数を設定します。
最適値はサンプル数やnum_leavesに依存します。大きな値に設定するとツリーが深く成長しすぎるのを防げますが、アンダーフィッティングを引き起こす可能性があります。実際には、大規模なデータセットでは数百から数千に設定するのが一般的のようです。

max_depth

max_depthはツリーの深さを制限するパラメータです。過剰適合を防ぐために、ツリーの深さを制限することが重要です。max_depthを設定する場合、num_leavesも明示的に設定し、その値が2のmax_depth乗以下になるようにします。例えば、max_depthが7の場合、2の7乗で128となりますが、実際には過剰適合を避けるためにこれより小さな値(例えば70〜80)に設定するのが一般的のようです。

以下はOptunaでの最適化例です。

max_depth = trial.suggest_int('max_depth', 3, 7)
num_leaves = trial.suggest_int('num_leaves', 20, min(80, 2 ** max_depth))
min_data_in_leaf = trial.suggest_int('min_data_in_leaf', 100, 1000)

速度の向上

  • 並列処理

  • GPU対応版の使用

  • max_depthの減少

  • num_leavesの減少

  • min_gain_to_splitの増加

  • min_data_in_leafmin_sum_hessian_in_leafの増加

  • num_iterationsの減少

  • early_stopping_roundの使用

  • 特徴量の事前フィルタリングを有効にする

  • max_binまたはmax_bin_by_featureの減少

  • min_data_in_binの増加

  • feature_fractionの減少

  • max_cat_thresholdの減少

  • バギングの使用

  • save_binaryでデータセットを保存

精度の向上

  • 大きなmax_binを使用(遅くなる可能性あり)

  • 小さなlearning_rateと大きなnum_iterationsを使用

  • 大きなnum_leavesを使用(過剰適合の可能性あり)

  • 大規模なトレーニングデータを使用

  • DART(Dropouts meet Multiple Additive Regression Trees)を試す

DARTは、LightGBMのブースティング手法の一つで、各イテレーションで一部のツリーを無視(ドロップアウト)することで、過剰適合を防ぎ、汎化性能を向上させることを目的としています。この手法は、ニューラルネットワークにおけるドロップアウトを応用しています。

DARTの適用はboosting_typeにdartを指定します。

'boosting_type': 'dart'

過剰適合の防止

  • max_binnum_leavesを小さくする

  • min_data_in_leafmin_sum_hessian_in_leafを設定

  • バギングの使用:bagging_fractionbagging_freqを設定

  • 特徴量のサブサンプリング:feature_fractionを設定

  • 大規模なトレーニングデータを使用

  • 正則化の試行:lambda_l1lambda_l2min_gain_to_splitを設定

  • ツリーの深さの制限:max_depthを設定

  • エクストラツリーの試行:extra_treesを使用

  • パススムーズの増加:path_smoothを増やす