Pythonで機械学習『LightGBM ハイパーパラメータ まとめ 』
LightGBMを、チュートリアル見ながら使うことはできたけど、パラメータチューニングって一体なにをチューニングしているのだろう、調べてみたけど、いっぱいあって全部は無理!
と思ったので、重要なパラメータを調べ、意味をまとめた。自分のリファレンス用として、また、同じような思いの初心者の方にも参考になれば幸いです。
全部で20個。
公式ドキュメント順に行きます。
Core Parameters
"objective"
予測の目的。
回帰ならregression。デフォルトもregression。
分類ならbinary。
regressionにはL1,L2と2種類ある。
L1は誤差平均を最小にしようとする。
L2は平均二乗誤差を最小にしようとする。L2がデフォルト。
その他にもmulticlass分類、Huber loss、 Fair loss、Poisson regression、 Quantile regression。
"boosting"
モデル選択。4種ある。gbdt,rf,dart,goss.デフォルトはgbdt.
"num_iterations"
学習回数の指定。整数を指定する。デフォルトは100。100本、植樹するってことですね。
num_tree, num_trees, num_round, num_rounds, num_boost_round, n_estimators, は全部意味一緒。ややこしや〜。
"learning_rate"
学習率。次の学習で、前の学習をどれくらい更新するか。
デフォルトは0.1。etaは同義。
ネットでは0.01固定派や0.05固定派などが存在する。
"num_leaves"
一つの決定木につく葉の数。学習するデータをどれくらい細かく分けるか。
デフォルトは31。なんでだろ。最大は、131072。2の17乗。
大きくすれば、正確になるかもしれないが、過学習になるかもしれない。ちょうどいいところを狙いたい。
2^(max_depth)より小さくする。たとえばmax_depthが7だったら、128以下に。
"random_seed"
seed,random_stateは同義。機械学習は乱数を使う。固定しておかないと再現性が担保できない。デフォルトでは指定されないので、指定しておくのが無難。
好きな数字を使う。僕は777を使う。運勢上がりそうだから。頭いい人は素数を使う。
Learning Parameters
'max_depth'
モデルの深さの最大値を指定。デフォルトは−1。(<= 0は上限なし、つまりデフォルトは上限なし)
上限なし状態から、上限をつけることで過学習にならないよう設定する。ほかのパラメータとバランスをとりながら調整する。
'min_data_in_leaf'
一つの葉に入る最小データ数。デフォルトは20。
学習用データの量やnum _leavesの影響を受ける。
'min_sum_hessian_in_leaf'
一つの葉に入るhessian合計値を制限する。設定値未満であればそれ以上分割されない(過学習を防ぐ)。デフォルトは、1e-3。(0.001。)min_data_in_leaf同様、過学習対策に使う。
hessianがわからん、損失(正解値と予測との誤差)のことみたい。なるほど、だから過学習対策なのか。
'bagging_fraction'
バギングの際、訓練用データの何%を使うかを指定。デフォルトは1.0で、100%。0〜1までの範囲内で指定する。100%以下を指定した場合、ランダムでデータを使う。計算速度向上に用いる。リサンプリングはしない。
bagging_freqもあわせて設定しないといけない。
'bagging_freq'
バギングの間隔指定。デフォルトは0。(つまりバギングしない。)整数で指定する。たとえば5を指定すると、学習5回するたびに、データをランダムに選び直す(bagging_fractionで指定したパーセンテージの訓練データで。)
'feature_fraction'
特徴量を何%使うか指定。木を作る毎に、特徴量を指定した%分、ランダムに抽出し学習に使う。デフォルトは1.0。(つまり100%使う)0〜1までの範囲内で指定する。0.8なら, 特徴量の80%を選択する。学習速度向上に使える。
後日追記
bagging_fractionとfeature_fractionの違いが理解できなかったが、下記サイトでようやくわかった。bagging_fractionでは学習データを横方向(行)でランダムサンプリングし、feature_fractionでは縦方向(列)でランダムに抽出する。
’early_stopping_round'
ひとつのmetric(測定基準)で、指定した回数学習を進めても改善が見られなかったら、学習を打ち切る。デフォルトは0(無効である)。
これをするには、valid_setsで評価用データを渡す必要がある。(※本来学習時にバリデーションデータを使ってはいけないのだけれども、earlystoppingでは参考に使ってしまうため、若干精度が良くなってしまう(フェアではない)リークの一種ってことかな?)
early_stopping_roundsを使った場合、もっとも成績の良かった学習は、best_iterationに入る。
num_iterationsの10%がとりあえずの値。
'lambda_l1'
L1正則化。デフォルトは0。
'lambda_l2'
L2正則化。デフォルトは0。
正則化とはなんぞや。(セイソクカ)
極端なデータの値(複雑さが増すこと)にペナルティを与える。モデルの複雑さを、正則化項という。
L1正則化、L2正則化の違い。
上述のペナルティに、L1ノルム、L2ノルムを使う(損失関数に加算する)ことによる違い。
L1は、学習モデルのパラメータの絶対値の総和を用いる。特定のデータの重みを0にすることで、不要データを削除。(つまり特徴選択をしていることになる。ほほう。)
L2は、学習モデルのパラメータの2乗の総和を用いる。データの大きさに応じて0に近づける。なめらかなモデルにする。過学習を抑えるために使われる。
Tips: leave it alone unless you know what you are doing.
'min_gain_to_split'
葉を分割する条件として設定するロス改善度の最小値。この値以上の改善が無ければ葉を分割しない。デフォルトは0(制限なし)過学習を抑えるために使う。
'verbosity'
学習途中の中継的な情報を表示するかしないか。デフォルトでは1(表示)
データ分析する時はデフォルトで良くて、製品とかに入れる時に非表示・エラー時に表示とする。
IO Parameters
'max_bin'
デフォルトは255。ヒストグラムベースのアルゴリズムを使うlightgbm特有。
区切る時のbin最大数。
大きすぎると過学習。小さくすると精度は下がるが汎化性能が上がる。
'categorical_feature'
どの特徴量(列)がカテゴリー変数なのかをLightGBMに教えなければならない。
Metric Parameters
'metric'
モデル構築の損失関数の指定。非常に重要。
objectiveが、
binaryの場合、binary_loglossかauc。
regressionの場合、rmseやmae。
など調整する。
(一応デフォルトで合わせてくれるみたいだけど、objectiveが4種なのに、metric20種くらいあるので、ちゃんと理解して指定したい。)
以上
この記事が気に入ったらサポートをしてみませんか?