LightGBM・XGBoostのパラメータを徹底解説 ― 数値を変えるとどうなる?

目次

はじめに

LightGBM や XGBoost でモデルを作るとき、learning_rate や num_leaves などのパラメータを「よく使われる値」のまま、意味を十分に理解しないまま設定しているケースは少なくありません。Optuna などで自動チューニングをしていても、各パラメータが何をしているのかが分からないと、結果を説明したり、探索範囲を決めたりすることができません。

この記事では、LightGBM と XGBoost の主要なパラメータについて、役割と数値を変えるとどうなるかを1つずつ整理して解説します。あわせて、2つのライブラリでのパラメータ名やデフォルト値の違いもまとめます。

なお、3つのライブラリをデフォルト設定で比較した結果は LightGBM・XGBoost・CatBoostをオープンデータで比較してみた で紹介しています。

チューニングの基本:過学習と学習不足

チューニングとは、モデルの複雑さを調整して、次の2つの状態のバランスを取る作業です。

状態意味見分け方
過学習学習データに合わせすぎて、未知のデータで精度が落ちる学習データの精度は高いが、検証データの精度が低い
学習不足モデルが単純すぎて、パターンを捉えきれていない学習データでも検証データでも精度が低い

ほぼすべてのパラメータは、「モデルを複雑にする方向」か「複雑さを抑える方向」のどちらかに効きます。この視点を持っておくと、各パラメータの意味が理解しやすくなります。

パラメータ一覧

この記事で解説するパラメータの一覧です。名前は LightGBM のネイティブ名を基本とし、カッコ内に scikit-learn API での名前を記載しています。

分類LightGBMXGBoost上げるとどうなるか
学習の進め方learning_rateeta(learning_rate)1本ごとの修正が大きくなる
学習の進め方num_iterations(n_estimators)num_boost_round(n_estimators)学習が進む。多すぎると過学習
木の複雑さnum_leavesmax_leaves複雑になる(過学習寄り)
木の複雑さmax_depthmax_depth複雑になる(過学習寄り)
木の複雑さmin_data_in_leaf(min_child_samples)なし単純になる(過学習を抑制)
木の複雑さmin_sum_hessian_in_leaf(min_child_weight)min_child_weight単純になる(過学習を抑制)
木の複雑さmin_gain_to_split(min_split_gain)gamma単純になる(過学習を抑制)
サンプリングbagging_fraction(subsample)subsample1.0に近づくほどランダム性が減る
サンプリングfeature_fraction(colsample_bytree)colsample_bytree1.0に近づくほどランダム性が減る
正則化lambda_l1(reg_alpha)alpha(reg_alpha)予測が控えめになる(過学習を抑制)
正則化lambda_l2(reg_lambda)lambda(reg_lambda)予測が控えめになる(過学習を抑制)

以降では、分類ごとに詳しく見ていきます。

学習の進め方

learning_rate(学習率)

勾配ブースティングは、決定木を1本ずつ追加しながら予測を修正していく手法です。learning_rate は、木を1本追加するごとに予測をどれだけ修正するかを決めます。

設定動き
小さくする(例 0.01)少しずつ慎重に学習する。精度は上がりやすいが、木が多く必要になり時間がかかる
大きくする(例 0.3)速く学習するが、修正が粗くなり過学習しやすい

実務では 0.01〜0.1 程度がよく使われます。

num_iterations / n_estimators(木の本数)

作成する決定木の本数です。learning_rate とセットで考えます。learning_rate を小さくした場合は、その分だけ木の本数を増やす必要があります。

  • 増やす:学習が進むが、多すぎると過学習する
  • 減らす:学習不足になる

early_stopping(早期終了)

適切な木の本数を手作業で探すのは手間がかかります。そこで実務では、木の本数を大きめ(例 5000)に設定したうえで、early_stopping を使うのが定番です。

early_stopping は、検証データのスコアが一定回数(例 100回)連続で改善しなかった時点で学習を止め、最も良かった時点の木の本数を採用する仕組みです。木の本数は「チューニングするもの」ではなく、early_stopping で「自動的に決めるもの」と考えると分かりやすくなります。

木の複雑さ

num_leaves(葉の数)

1本の木が持つ葉(最終的な分岐先)の数の上限です。LightGBM で最も重要なパラメータの一つです。

設定動き
増やす(例 127)細かいパターンまで捉えられるが、過学習しやすい
減らす(例 15)単純なモデルになり汎化しやすいが、学習不足の可能性がある

LightGBM のデフォルトは 31 です。

max_depth(木の深さ)

木の分岐の段数の上限です。num_leaves と役割が近く、深くするほど複雑なモデルになります。

  • LightGBM:デフォルトは -1(無制限)。num_leaves で複雑さを制御することが多い
  • XGBoost:デフォルトは 6。XGBoost ではこちらが主な調整対象

なぜ主な調整対象が異なるのかは、「LightGBM と XGBoost の違い」で説明します。

min_data_in_leaf / min_child_samples(葉の最小データ数)

1つの葉に最低何件のデータが必要かを決めます。

  • 大きくする(例 50〜100):少数の特殊なデータに引っ張られにくくなり、過学習を抑える
  • 小さくする:数件しかない例外的なデータまで覚えてしまう

LightGBM のデフォルトは 20 です。データ件数が少ない場合に特に効果があります。

min_child_weight(葉の最小重み)

葉に必要な「重み」の合計の最小値です。回帰で二乗誤差を使う場合は、各データの重みが1になるため、実質的に「葉の最小データ数」と同じ意味になります。

  • 大きくする:過学習を抑える
  • デフォルト:LightGBM は 0.001、XGBoost は 1

min_gain_to_split / gamma(分岐に必要な最小改善量)

分岐によって誤差がどれだけ減るかを計算し、その改善量がこの値に満たない場合は分岐しません。

  • 大きくする:効果の薄い分岐をしなくなり、木が単純になる
  • デフォルト:どちらも 0(改善があれば分岐する)

ランダムサンプリング

bagging_fraction / subsample(行のサンプリング)

木を1本作るごとに、学習データの何割をランダムに使うかを決めます。

  • 下げる(例 0.7〜0.8):毎回少しずつ違うデータで学習するため、特定のデータへの依存が減り、過学習を抑える
  • 1.0:毎回すべてのデータを使う(デフォルト)

なお、LightGBM では bagging_freq を1以上にしないと bagging_fraction が有効になりません(bagging_freq のデフォルトは 0)。XGBoost にはこの設定はなく、subsample だけで有効になります。

feature_fraction / colsample_bytree(特徴量のサンプリング)

木を1本作るごとに、特徴量(曜日・天気・祝日フラグなど)の何割をランダムに使うかを決めます。

  • 下げる(例 0.6〜0.8):特定の特徴量に頼りすぎることを防ぎ、過学習を抑える
  • 1.0:毎回すべての特徴量を使う(デフォルト)

正則化(L1・L2)

正則化は、言葉だけでは分かりにくいパラメータです。ここでは具体的な数値で説明します。

前提:葉の値はどう決まるか

勾配ブースティングでは、木を1本追加するたびに、各葉に入ったデータの誤差(予測のズレ)をもとに、その葉の補正値を決めます。

たとえば客数を予測していて、ある葉にデータが3件入り、3件とも予測より実際の客数が30人多かったとします。正則化がない場合、補正値は誤差の平均になります。

$$
補正値 = \frac{誤差の合計}{件数} = \frac{90}{3} = +30
$$

正則化は、この計算式に手を加えて補正を控えめにする仕組みです。

L2正則化(lambda_l2 / reg_lambda)

L2正則化は、計算式の分母に λ を足します。

$$
補正値 = \frac{誤差の合計}{件数 + \lambda}
$$

ケースλ = 0λ = 3
葉に3件(誤差合計 90)90 ÷ 3 = +3090 ÷ 6 = +15(半分になる)
葉に300件(誤差合計 9000)9000 ÷ 300 = +309000 ÷ 303 ≒ +29.7(ほぼ変わらない)

同じ λ でも、データが少ない葉ほど強く抑えられ、データが多い葉はほとんど影響を受けません。偶然数件だけ外れたデータに過剰反応することを防ぎます。

L1正則化(lambda_l1 / reg_alpha)

L1正則化は、誤差の合計から α を差し引きます。差し引いた結果が0以下になる場合、補正値は0になります。

α計算補正値
090 ÷ 3+30
60(90 − 60) ÷ 3+10
10090 が α を下回る0(この葉は何も補正しない)

小さなズレはまるごと無視し、根拠が十分に大きいときだけ補正するのが L1 正則化です。補正値を0にできる点が L2 との違いです。

なお、実際の補正値にはさらに learning_rate が掛けられます。

L2L1
効き方補正値を割合で縮める小さな補正を0にする
大きくすると少数データの葉が控えめになる効果の小さい葉が無効になる
デフォルトLightGBM:0、XGBoost:1どちらも 0

XGBoost はデフォルトで L2 正則化が効いている点に注意が必要です。

目的関数と再現性

objective(目的関数)

モデルが何を最小化するように学習するかを決めます。チューニング対象というより、予測したいものに合わせて選ぶパラメータです。

内容LightGBMXGBoost特徴
二乗誤差regressionreg:squarederror標準。外れ値に引っ張られやすい
絶対誤差regression_l1reg:absoluteerror外れ値に強い
Huber 系huberreg:pseudohubererror二乗誤差と絶対誤差の中間
ポアソンpoissoncount:poisson0以上のカウントデータ(客数・件数など)向け
Tweedietweediereg:tweedie0が多く含まれるデータ向け

seed(乱数の種)

サンプリングなどで使われる乱数を固定するためのパラメータです。

  • 固定すると、何度実行しても同じ結果になる。パラメータを変えたときの効果を正しく比較するために必須
  • seed を変えただけで結果が大きく変わる場合は、モデルが不安定なサイン
  • bagging_fraction や feature_fraction が 1.0 のままの場合は、seed の影響は小さい

LightGBM では seed から個別の seed(bagging_seed、feature_fraction_seed など)が生成されます。個別の seed を明示した場合はそちらが優先されます。また、マルチスレッド実行で結果を完全に一致させたい場合は、deterministic=true と force_row_wise(または force_col_wise)を併用します。

LightGBM と XGBoost の違い

考え方は共通ですが、2つのライブラリでは木の育て方とデフォルト値が異なります。

木の育て方

LightGBMXGBoost
成長方式leaf-wise(誤差が最も減る葉から優先的に分岐)depth-wise(同じ深さの段を揃えて分岐)
主な調整対象num_leavesmax_depth

LightGBM は深さを揃えずに成長するため、木の大きさを葉の数で制御します。一方、XGBoost は段ごとに成長するため、深さで制御するのが基本です。なお、XGBoost でも grow_policy=lossguide を指定すると、LightGBM に近い成長方式になります。

デフォルト値の違い

パラメータLightGBMXGBoost
学習率0.10.3
木の深さ-1(無制限)6
葉の数310(無制限)
葉の最小重み0.0011
L2正則化01
数値の区切り数(max_bin)255256

同じデータを「デフォルト設定」で学習させても、2つのライブラリの結果は一致しません。パラメータを移植する場合は、名前だけでなくデフォルト値の違いにも注意が必要です。

実務でのチューニング手順

すべてのパラメータを同時に調整すると、何が効いたのか分からなくなります。影響の大きいものから順に調整するのがおすすめです。

  1. seed を固定し、learning_rate を 0.05 程度にして、early_stopping で木の本数を決める
  2. 木の複雑さ(LightGBM は num_leaves、XGBoost は max_depth)と、葉の最小データ数を調整する
  3. サンプリング(bagging_fraction / subsample、feature_fraction / colsample_bytree)を調整する
  4. 必要に応じて正則化(L1・L2)を調整する
  5. 最後に learning_rate を下げて(例 0.01)仕上げる

手作業で試すのが大変な場合は、Optuna などのツールで自動探索するのも有効です。その場合も、この記事で紹介した各パラメータの意味を理解しておくと、探索範囲を適切に設定できます。

まとめ

パラメータは数が多いですが、ほとんどは「モデルを複雑にするか、抑えるか」のどちらかに効きます。

目的調整するパラメータ
学習の速さと精度のバランスlearning_rate と木の本数(early_stopping で決める)
木の複雑さnum_leaves(LightGBM)/max_depth(XGBoost)
少数データへの過剰反応を防ぐmin_data_in_leaf、L2正則化
特定のデータ・特徴量への依存を防ぐbagging_fraction、feature_fraction
結果の再現性seed

過学習していると感じたら「抑える方向」、学習不足なら「複雑にする方向」へ調整する、という基本を押さえておけば、どのパラメータをどちらに動かすべきかが判断できるようになります。

CTA
  • URLをコピーしました!
  • URLをコピーしました!
この記事を書いた人
目次