勾配ブースティング シミュレーター 戻る
機械学習

勾配ブースティング シミュレーター

浅い回帰木という「弱い学習器」を1本ずつ残差に当てはめ、足し合わせて強い予測器を組み立てるのが勾配ブースティングです。木の本数・学習率・深さ・ノイズを変えると、訓練誤差がどう下がり、どこから過学習に入るかをリアルタイムで体感できます。

パラメータ設定
ブースティング木の本数
逐次的に追加する弱学習器の数 M
学習率(縮小率)η
各木の寄与をどれだけ縮めて足すか
各木の深さ
1本の回帰木の段数(深いほど表現力が高い)
データのノイズ標準偏差
観測値に加わるガウスノイズの大きさ σ
データ点数
学習に使う 1 次元データ点の数
計算結果
訓練誤差 MSE
木の本数
学習率 η
訓練誤差の低減率 (%)
ノイズフロア σ²
状態
アンサンブル構築の可視化 — 木を1本ずつ追加

ノイズを含む訓練点(青)に対し、真の関数(薄い曲線)と勾配ブースティング予測(太い階段曲線)を表示。木を1本ずつ足してアニメーション再生し、階段がデータに寄り添っていく様子をループします。

訓練誤差 vs 木の本数
アンサンブル予測(真の関数・最終予測・データ)
理論・主要公式

$$F_m(x)=F_{m-1}(x)+\eta\,h_m(x),\qquad h_m\ \text{fits}\ r_i=y_i-F_{m-1}(x_i)$$

第 m 段のアンサンブル $F_m$ は、前段 $F_{m-1}$ に学習率 $\eta$ で縮小した新しい木 $h_m$ を足して作る。各木 $h_m$ は残差 $r_i$ にフィットし、二乗誤差損失ではこの残差が損失の負の勾配にあたる。

$$r_i=y_i-F_{m-1}(x_i)=-\left.\frac{\partial L}{\partial F}\right|_{F=F_{m-1}},\qquad L=\tfrac12\,(y-F)^2$$

残差は二乗誤差損失 $L$ の予測値 $F$ に関する負の勾配。だから「残差に木を当ててから足す」操作は関数空間での勾配降下の 1 ステップに等しい。

$$\text{MSE}=\frac1N\sum_{i=1}^{N}\bigl(y_i-F_M(x_i)\bigr)^2,\qquad \text{低減率}=\Bigl(1-\frac{\text{MSE}_M}{\text{MSE}_0}\Bigr)\times100$$

訓練 MSE は全 M 本適用後の平均二乗誤差。低減率は定数(平均)予測の MSE₀ からの改善割合。MSE がノイズフロア σ² を大きく割り込むと過学習。

勾配ブースティングとは

🙋
「勾配ブースティング」って名前はよく聞きますが、結局なにをしているんですか?1つの大きなモデルを学習するわけではないんですよね?
🎓
そう、1個の巨大モデルじゃない。ざっくり言うと「弱い予測器をたくさん作って足し合わせる」やり方なんだ。ここで言う弱い予測器は、たいてい段数が浅い回帰木——木の本数を1本、深さを1にしてみると分かるけど、入力をいくつかの区間に区切って各区間で定数を返すだけの、ものすごく単純なモデルだ。それを1本だけ使ってもデータには全然合わない。でも「前の木が外したぶん」を次の木が狙い撃ちして直す、というのを何十回も繰り返すと、足し合わせた全体(アンサンブル)はとても賢くなる。XGBoostやLightGBMの中身はこれだよ。
🙋
「前の木が外したぶんを次の木が直す」というのが、いまいちピンときません。具体的にはどう計算するんですか?
🎓
キーワードは「残差」だよ。まず全データの予測を、yの平均みたいな当たり障りのない値からスタートする。すると各点で「正解 y − いまの予測」というズレが残る。これが残差だ。次の木は、この残差そのものを正解だと思ってフィットする。つまり「いま足りていない分」だけを学習するんだ。その木を学習率ηで少し縮めて全体に足すと、予測がほんの少し正解に近づく。また残差を計算し直して次の木を作る——この繰り返し。上の階段アニメーションを見ると、木を足すたびに階段がデータへ寄っていくのが分かるはずだ。
🙋
なるほど。でも、なんで「勾配(gradient)」っていう名前なんですか?残差に木を当ててるだけに見えますけど。
🎓
いい質問。実は二乗誤差で測ると、残差 r = y − F は、損失関数 L = ½(y−F)² を予測値 F で微分した「負の勾配」とぴったり同じになるんだ。だから「残差に木を当てて足す」ことは、損失を関数空間で勾配降下している1ステップそのものなんだよ。学習率ηは勾配降下のステップ幅。ηを小さくすれば1本ずつの修正は小さく、慎重に下っていく。大きくすれば速く下るけど行き過ぎやすい。左のηスライダーを動かして、下の「訓練誤差 vs 木の本数」グラフの下がり方が変わるのを見てみて。
🙋
じゃあ木をどんどん足して訓練誤差をゼロまで下げれば、最強のモデルになりませんか?
🎓
そこが落とし穴なんだ。データには必ず観測ノイズが乗っていて、その分散が「ノイズフロア」——このツールだとσ²だ。木を足しすぎて訓練誤差がノイズフロアよりずっと下まで落ちると、モデルは真の関数じゃなくてノイズの形まで覚え込んでしまう。これが過学習。実際にデフォルト設定(木50本・η0.10)で動かすと、訓練誤差がノイズフロア0.04を割って状態が「過学習」と出るはずだ。木の本数を10本くらいまで減らすと逆に未学習になる。ちょうどいい本数で止めるのがコツで、実務では検証データの誤差が下げ止まったところで打ち切る「early stopping」を使う。
🙋
木の本数と学習率、どっちで調整するのが正解なんですか?両方いじれてしまうと迷います。
🎓
実は M·η(本数×学習率)がだいたい同じなら、似たような当てはまりになるんだ。だから定石は「ηを0.01〜0.1くらいの小さめに固定して、本数Mで調整する」。ηを小さくすると1本ずつ慎重に進むぶん汎化性能が上がりやすいけど、必要な本数が増えて学習時間は伸びる。深さは1本の木の表現力で、浅い木ほど弱学習器らしくなる。勾配ブースティングでは深さ2〜6くらいの浅い木を大量に使うのが普通で、深い木を少数使うランダムフォレストとは設計思想が逆なんだよ。

よくある質問

どちらも決定木のアンサンブルですが、木の作り方が正反対です。ランダムフォレストは深い木を互いに独立に並列で多数作り、その平均をとります(バギング)。勾配ブースティングは浅い木を「逐次」作り、各木は前段までのアンサンブルが取りこぼした残差(誤差)を学習します。前の木の結果が次の木に影響するため並列化しにくい一方、弱学習器を足し合わせて少しずつ誤差を削るので、同じデータに対してより高い精度を出しやすいのが特徴です。XGBoostやLightGBMはこの勾配ブースティングの高速実装です。
各木が学習する残差 r = y − F(x) が、二乗誤差損失 L = ½(y−F)² の予測値 F に関する負の勾配 −∂L/∂F に一致するからです。つまり「残差に木をフィットして足す」という操作は、損失関数を関数空間で勾配降下法する1ステップに相当します。学習率 η は勾配降下のステップ幅にあたり、小さくすると1本ずつの寄与が小さくなって慎重に降下し、大きくすると速く降下しますが行き過ぎ(過学習)のリスクが上がります。
木の本数 M と学習率 η はトレードオフの関係にあり、おおむね M·η が一定なら似た当てはまりになります。実務では η を 0.01〜0.1 程度の小さめに固定し、検証データの誤差が下げ止まる本数まで M を増やす「早期打ち切り(early stopping)」が定番です。η が小さいほど汎化性能は上がりやすいですが、必要な木の本数が増えて学習時間も伸びます。本ツールでは η を下げると訓練誤差の下がり方がなだらかになり、本数を増やすと訓練誤差がノイズフロアを割り込んで過学習に入る様子が見られます。
いいえ。訓練データには必ず観測ノイズが含まれており、その分散がノイズフロア(本ツールでは noiseLv²)です。訓練誤差をノイズフロアより大きく下回るまで木を足すと、モデルは真の関数ではなくノイズの形まで覚え込みます。これが過学習で、訓練誤差は良くても未知データでの誤差は悪化します。理想は訓練誤差がノイズフロア付近で下げ止まる状態で、本ツールは訓練誤差とノイズフロアを比較して未学習・良好・過学習を自動判定します。

実世界での応用

表形式データのコンペティションと実務予測:需要予測、与信スコアリング、広告のクリック率予測、不正検知など、行と列からなる表形式データの予測では、勾配ブースティング(XGBoost・LightGBM・CatBoost)が今なお第一選択肢です。Kaggleの表データコンペでは上位解法の大半がこの系統で、ディープラーニングよりも少ない調整で高精度かつ安定した結果を出します。

検索エンジンのランキング学習:検索結果やレコメンドの並べ替えは「ランキング学習(learning to rank)」と呼ばれ、勾配ブースティングが広く使われています。各クエリと文書の組に対する関連度スコアを、ペアワイズ/リストワイズの損失で勾配ブースティングが学習します。LambdaMARTはその代表的な手法です。

工学・センサーデータの代理モデル(サロゲート):CAEや実験で得た入力パラメータと応答(応力・温度・効率など)の対応関係を勾配ブースティングで学習し、重い数値解析の代わりに一瞬で予測する代理モデルとして使えます。設計空間の探索や最適化のループで、1回数時間かかるFEM解析を呼ぶ回数を大幅に減らせます。

特徴量の重要度分析:勾配ブースティングは各特徴量が分割にどれだけ寄与したかを集計でき、SHAP値と組み合わせれば「どの入力が予測をどう動かしたか」を説明できます。製造不良の要因分析や、医療・金融でのリスク要因の洗い出しなど、予測だけでなく解釈が求められる場面でも活躍します。

よくある誤解と注意点

まず多いのが、「木を増やせば増やすほど精度が上がる」という誤解です。本ツールで木の本数を最大の200本、学習率を1まで上げてみると、訓練誤差はほぼゼロまで落ちますが、それはノイズフロアを大きく割り込んだ過学習の状態です。訓練誤差はモデルがどれだけデータを「暗記」したかを示すだけで、未知データへの性能(汎化誤差)とは別物です。本数は検証データの誤差で決めるべきで、訓練誤差だけを見て本数を増やすのは典型的な失敗パターンです。

次に、「学習率は小さければ小さいほど良い」という思い込み。学習率を下げると確かに汎化性能は上がりやすいのですが、同じ当てはまりに到達するのに必要な木の本数が反比例で増えます。η を 1/10 にすれば、おおむね 10 倍の本数が要る計算です。学習時間とメモリは本数に比例するため、現実には「十分小さい η と、それに見合う本数」のバランス点を、計算資源と相談しながら early stopping で探すことになります。η だけを極端に下げて本数が足りなければ、ただの未学習です。

最後に、「勾配ブースティングは前処理が要らない万能ツール」という過信。決定木ベースなので特徴量のスケーリングは不要で欠損値にも比較的強い、という長所は本物です。しかし、外れ値が多いと二乗誤差損失では1点に引きずられやすく、ロバストな損失(Huber損失など)への切り替えが必要になります。また、訓練データに無い領域(外挿)では階段状の予測が端の値で平らになり、急に外れます。本ツールでも予測曲線が両端で水平になるのが見えます。時系列の将来予測など外挿が本質の課題には、この性質を理解したうえで使うべきです。

使い方ガイド

  1. 「木の本数」スライダーで1~500本の範囲を設定し、勾配ブースティングの積み上げ段数を制御します
  2. 「学習率 η」を0.01~0.5で調整して、各回帰木の寄与度を制御し、過学習と収束速度のバランスを観察します
  3. 「木の最大深さ」を1~10に設定してウィークラーナーの複雑度を変更し、訓練誤差MSEと一般化性能の変化をリアルタイムで追跡します
  4. 「ノイズレベル σ²」パラメータで0~0.5の範囲のデータノイズを加えて、アルゴリズムの頑健性を検証します

具体的な計算例

住宅価格予測タスク(訓練サンプル800件)でXGBoost型シミュレーションを実行した場合:初期予測値ベース50000円、木の本数100本・学習率η=0.1・最大深さ5で訓練を進行すると、第1~10イテレーション後の訓練MSEは480万→320万→220万と低減します。ノイズσ²=0.1を加えた検証では、木の本数200本時に訓練MSE=18万に収束し、さらに深さ7で過学習による検証誤差の悪化が顕著になります。学習率を0.05に低下させると低減率が毎イテレーション3.2%に抑制され、より安定した収束が確認できます。

実務での注意点

  1. LightGBM実装での学習率0.01以下はイテレーション数が増加(3000本超)し、計算コスト急増するため金融データ(特徴量100以上)では推奨されません
  2. Kaggle競技での過学習検知:訓練MSEが0.08を下回り検証MSEが上昇する場合、木の深さを即座に3~4に制限し、木の本数を段階的に増加させます
  3. 医療機器の品質管理データ(ノイズσ²=0.15以上)では学習率を最小0.05に設定し、深さ2の浅い木で積み上げて解釈性を確保してください