はじめに
LightGBM や XGBoost でモデルを作るとき、learning_rate や num_leaves などのパラメータを「よく使われる値」のまま、意味を十分に理解しないまま設定しているケースは少なくありません。Optuna などで自動チューニングをしていても、各パラメータが何をしているのかが分からないと、結果を説明したり、探索範囲を決めたりすることができません。
この記事では、LightGBM と XGBoost の主要なパラメータについて、役割と数値を変えるとどうなるかを1つずつ整理して解説します。あわせて、2つのライブラリでのパラメータ名やデフォルト値の違いもまとめます。
なお、3つのライブラリをデフォルト設定で比較した結果は LightGBM・XGBoost・CatBoostをオープンデータで比較してみた で紹介しています。
チューニングの基本:過学習と学習不足
チューニングとは、モデルの複雑さを調整して、次の2つの状態のバランスを取る作業です。
| 状態 | 意味 | 見分け方 |
|---|---|---|
| 過学習 | 学習データに合わせすぎて、未知のデータで精度が落ちる | 学習データの精度は高いが、検証データの精度が低い |
| 学習不足 | モデルが単純すぎて、パターンを捉えきれていない | 学習データでも検証データでも精度が低い |
ほぼすべてのパラメータは、「モデルを複雑にする方向」か「複雑さを抑える方向」のどちらかに効きます。この視点を持っておくと、各パラメータの意味が理解しやすくなります。
パラメータ一覧
この記事で解説するパラメータの一覧です。名前は LightGBM のネイティブ名を基本とし、カッコ内に scikit-learn API での名前を記載しています。
| 分類 | LightGBM | XGBoost | 上げるとどうなるか |
|---|---|---|---|
| 学習の進め方 | learning_rate | eta(learning_rate) | 1本ごとの修正が大きくなる |
| 学習の進め方 | num_iterations(n_estimators) | num_boost_round(n_estimators) | 学習が進む。多すぎると過学習 |
| 木の複雑さ | num_leaves | max_leaves | 複雑になる(過学習寄り) |
| 木の複雑さ | max_depth | max_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) | subsample | 1.0に近づくほどランダム性が減る |
| サンプリング | feature_fraction(colsample_bytree) | colsample_bytree | 1.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 = +30 | 90 ÷ 6 = +15(半分になる) |
| 葉に300件(誤差合計 9000) | 9000 ÷ 300 = +30 | 9000 ÷ 303 ≒ +29.7(ほぼ変わらない) |
同じ λ でも、データが少ない葉ほど強く抑えられ、データが多い葉はほとんど影響を受けません。偶然数件だけ外れたデータに過剰反応することを防ぎます。
L1正則化(lambda_l1 / reg_alpha)
L1正則化は、誤差の合計から α を差し引きます。差し引いた結果が0以下になる場合、補正値は0になります。
| α | 計算 | 補正値 |
|---|---|---|
| 0 | 90 ÷ 3 | +30 |
| 60 | (90 − 60) ÷ 3 | +10 |
| 100 | 90 が α を下回る | 0(この葉は何も補正しない) |
小さなズレはまるごと無視し、根拠が十分に大きいときだけ補正するのが L1 正則化です。補正値を0にできる点が L2 との違いです。
なお、実際の補正値にはさらに learning_rate が掛けられます。
| L2 | L1 | |
|---|---|---|
| 効き方 | 補正値を割合で縮める | 小さな補正を0にする |
| 大きくすると | 少数データの葉が控えめになる | 効果の小さい葉が無効になる |
| デフォルト | LightGBM:0、XGBoost:1 | どちらも 0 |
XGBoost はデフォルトで L2 正則化が効いている点に注意が必要です。
目的関数と再現性
objective(目的関数)
モデルが何を最小化するように学習するかを決めます。チューニング対象というより、予測したいものに合わせて選ぶパラメータです。
| 内容 | LightGBM | XGBoost | 特徴 |
|---|---|---|---|
| 二乗誤差 | regression | reg:squarederror | 標準。外れ値に引っ張られやすい |
| 絶対誤差 | regression_l1 | reg:absoluteerror | 外れ値に強い |
| Huber 系 | huber | reg:pseudohubererror | 二乗誤差と絶対誤差の中間 |
| ポアソン | poisson | count:poisson | 0以上のカウントデータ(客数・件数など)向け |
| Tweedie | tweedie | reg:tweedie | 0が多く含まれるデータ向け |
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つのライブラリでは木の育て方とデフォルト値が異なります。
木の育て方
| LightGBM | XGBoost | |
|---|---|---|
| 成長方式 | leaf-wise(誤差が最も減る葉から優先的に分岐) | depth-wise(同じ深さの段を揃えて分岐) |
| 主な調整対象 | num_leaves | max_depth |
LightGBM は深さを揃えずに成長するため、木の大きさを葉の数で制御します。一方、XGBoost は段ごとに成長するため、深さで制御するのが基本です。なお、XGBoost でも grow_policy=lossguide を指定すると、LightGBM に近い成長方式になります。
デフォルト値の違い
| パラメータ | LightGBM | XGBoost |
|---|---|---|
| 学習率 | 0.1 | 0.3 |
| 木の深さ | -1(無制限) | 6 |
| 葉の数 | 31 | 0(無制限) |
| 葉の最小重み | 0.001 | 1 |
| L2正則化 | 0 | 1 |
| 数値の区切り数(max_bin) | 255 | 256 |
同じデータを「デフォルト設定」で学習させても、2つのライブラリの結果は一致しません。パラメータを移植する場合は、名前だけでなくデフォルト値の違いにも注意が必要です。
実務でのチューニング手順
すべてのパラメータを同時に調整すると、何が効いたのか分からなくなります。影響の大きいものから順に調整するのがおすすめです。
- seed を固定し、learning_rate を 0.05 程度にして、early_stopping で木の本数を決める
- 木の複雑さ(LightGBM は num_leaves、XGBoost は max_depth)と、葉の最小データ数を調整する
- サンプリング(bagging_fraction / subsample、feature_fraction / colsample_bytree)を調整する
- 必要に応じて正則化(L1・L2)を調整する
- 最後に 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 |
過学習していると感じたら「抑える方向」、学習不足なら「複雑にする方向」へ調整する、という基本を押さえておけば、どのパラメータをどちらに動かすべきかが判断できるようになります。

