🐥
LightGBM(gbdt)のパラメータ/Tuningの個人的まとめ
はじめに
初手LightGBMは機械学習系だと割とやると思うんですが、いざobjectiveとかパラメータTuningをするたびにドキュメントを読むことになっているので、まとめようと思いました。
基本はドキュメントを抜粋した日本語訳に近くなると思います。
Objective
よく使うのだけにします。
- "regression" : mean_squared_errorを誤差関数として使う回帰です。
- "regression_l1" : mean_absolute_errorを誤差関数として使う回帰です。
- "binary" : 二値分類のloglossです。
- "multiclass" : 多クラス分類、softmaxです。"num_class"でクラス数も一緒に与えて上げる必要があります。
- "multiclassova" : 多クラス分類をOneVsAllでときます。同様に"num_class"でクラス数も一緒に与えて上げる必要があります。
- "cross_entropy" : クロスエントロピーです。
学習に関わるパラメータ
- "num_iterations" : 学習のイテレーション回数を指定します。defalut 100です。
- "learning_rate" : learning_rateです。default 0.1です。
- "num_leaves" : 木の複雑度をコントロールするメインパラメータです分岐の終着点の数を決めます。default 31です。
- "seed" : random seedです。これを決めれば色々ある他のseedがすべて決まります default Noneなのでか必ず設定しましょう。
- "max_depth" : 木の最大深さを決めます。defaultの-1は上限無しなので、ここも必ず設定したほうがいいと思います。
- "min_data_in_leaf" : 葉に行き着くデータがこれより少なくならない用になります。default 20です。
- "bagging_fraction" : baggingで選択されるサンプルの割合です。default 1.0で、baggingは無効化されています。また、baggingするには"bagging_freq"も正の値にしなくてはなりません。
- "bagging_freq" : 何回に一回baggingするかです。こちらだけセットしてもやはりbaggingは出来ず、baggingするには"bagging_fraction"が1未満である必要があります。
- "feature_fraction" : 1.0未満の値にすると、特徴量の一部を削減して学習を行う用になります。default 1.0です。
- "early_stopping_round" : early stoppingのpatienceです。するときは設定しましょう。
- "lambda_l1" : L1正則化です。
- "lambda_l2" : L2正則化です。
- "verbosity" : < 0: Fatal, = 0: Error (Warning), = 1: Info, > 1: Debug だそうです。default 1です。
parameter Tuning
おおよその探索範囲表です(まずはこのあたりをGridSearchする)
個人的な体感によるものですので、当然ベストではないですし、betterですらない可能性があることをご承知ください
個人的優先度順になってるので、計算時間が無いときはこの上からN個だけとかで探索します。
パラメータ名 | 探索範囲 | 備考 |
---|---|---|
num_leaves | 7,15,31 | 大ほどOverFit, 2^(mad_depth)* 0.7程度に決め打ちもあり。 |
max_depth | 5,7,9 | 大ほどOverFit |
min_data_in_leaf | 20,30,50 | 小ほどOverFit |
bagging_fraction | 0.8,0.9 | 大ほどOverFit? |
bagging_freq | 1,3 | 小ほどOverFit? |
feature_fraction | 0.9,1.0 | 大ほどOverFit? |
lambda_l1 | 0,2,5 | 小ほどOverFit。正直どのくらいがいいのか全くわからないので、下手に弄らないことも多し。 |
lambda_l2 | 0,2,5 | 小ほどOverFit。正直どのくらいがいいのか全くわからないので、下手に弄らないことも多し。 |
bagging_fractionや,feature_fractionを設定しないとrandom_stateを変えても結果が変わらなくなるので、パラメータTuningの時間が無い時+ensemble(or random seed average)する前提のときはこのあたりはtuning出来なくてもに0.8〜0.9にとりあえずしといた方が、混ぜた結果は強くなるのではという気がします。
その他learning_rateを下げてiterationを伸ばすと当然良くなると思われますが、自明なのでやるにしても最後です。
Discussion