JA EN
体系機械学習の基礎
·無料·論文·14分で読めます

決定木と勾配ブースティング — 表データ最強の座は今も

行と列でできた「表」のデータでは、いまも決定木を束ねた勾配ブースティングが第一候補です。分岐の直感からアンサンブル、XGBoost/LightGBMの中身、そしてニューラルネットが表データで勝ちきれない理由までを、前提知識ゼロから積み上げます。

対象textタスクtabular

XGBoost: A Scalable Tree Boosting System


世界のデータの大半は、まだ「表」でできている

画像や文章を扱うAIの話ばかりが目立ちますが、企業の中で毎日動いているデータの多くは、いまも行と列でできた表です。1行が1件の申込み・1回の取引・1台の設備で、列は年齢・金額・稼働時間・エラーコード…と、意味も単位もバラバラに並んでいます。

そして驚くべきことに、この領域では深層学習が王座を取れていません。与信審査も、不正検知も、需要予測も、広告のクリック率予測も、現場の第一候補は「決定木をたくさん束ねたモデル」です。KaggleのようなコンペでもGBDT(Gradient Boosted Decision Trees)系は定番であり続けています。

なぜ、Transformerを積み上げた最新モデルが、20世紀からある「木」に負けるのか。この記事は、木の分岐という一番素朴な仕組みから始めて、その理由まで一本道でたどります。機械学習とは何かを読んでいれば十分で、それ以外の前提は置きません。

比喩: 20の質問

決定木は「20の質問」ゲームそのものです。相手が思い浮かべたものを、はい/いいえの質問だけで当てにいく、あの遊びです。

融資の審査に置き換えてみます。「年収は500万円以上か?」→ はい →「勤続年数は3年以上か?」→ いいえ →「他社借入は2件以下か?」→ はい → 返済できる見込みが高い

これが決定木です。上から順に質問(分岐)をたどり、行き着いた先の箱()に答えが書いてある。ルールが目に見えるので、なぜその判定になったのかを人に説明できます。この「説明できる」という性質は、金融や医療のように理由の提示が求められる場面で決定的な意味を持ちます。

うまい質問と下手な質問があるのも、ゲームと同じです。「名前は田中か?」のように、めったに当たらない質問では候補がほとんど絞れません。良い質問とは、聞いた後に候補が大きく偏る質問です。木の学習とは、この「良い質問」を自動で見つけ続ける作業にほかなりません。

仕組み: 「良い分岐」を数式で決める

では、良い質問をどう測るのか。使うのは不純度(impurity)という考え方です。箱の中身が混ざっているほど値が大きく、1種類に揃うほど0に近づく指標です。最もよく使われるジニ不純度は、こう書けます。

G(S)=1kpk2G(S) = 1 - \sum_{k} p_k^2
(1)

SS はいま見ている行の集まり、pkp_k はその中でクラス kk が占める割合です。言い換えると、「この箱から2回続けて引いたとき、違う種類が出る確率」。全部同じ種類なら必ず同じものが出るので0、半々に混ざっていれば0.5になります。混ざり具合の目盛りだと思ってください。

分岐の良さは、質問の前後で不純度がどれだけ減ったかで測ります。

Δ=G(S)nLnG(SL)nRnG(SR)\Delta = G(S) - \frac{n_L}{n}G(S_L) - \frac{n_R}{n}G(S_R)
(2)

SL,SRS_L, S_R は質問で左右に分かれた行の集まり、nL,nRn_L, n_R はその件数、nn は分ける前の件数です。つまり「分ける前の混ざり具合から、分けた後の混ざり具合(件数で重みを付けた平均)を引いた値」。これが大きいほど、その質問はよく効いています。

学習アルゴリズムがやることは単純です。すべての列 × すべての区切り位置を試し、式(2)が最大になる組み合わせを選ぶ。それを子ノードで再帰的に繰り返す。これがCARTと呼ばれる古典的な手法の骨格で、scikit-learnの決定木も基本はこれです。

ここで、木の重要な性質が2つ出てきます。1つは、列ごとに独立して区切り位置を探しているので、年収(円)と勤続年数(年)のように単位がまるで違っても平気なこと。標準化は要りません。もう1つは、大小関係しか見ていないので、外れ値の影響を受けにくいことです。年収を10倍に書き間違えた行があっても、「500万円以上か?」の答えは変わりません。

木は1本だと、賢すぎて壊れる

質問を重ねれば重ねるほど、葉に残る行は少なくなります。極端まで進めれば、1つの葉に1行という状態にできます。このとき訓練データの正解率は100%です。そして、新しいデータではまるで役に立ちません。

これが過学習の典型です。木は表現力が高いぶん、データに含まれる偶然のノイズまで「規則」として覚え込んでしまう。深さ制限をかければ今度は単純すぎて取りこぼす。1本の木は、深さという1つのつまみで「覚えすぎ」と「学べなさすぎ」の間を綱渡りする、扱いにくいモデルなのです。

FIG 1次数スライダーを右へ動かすと、訓練誤差だけが下がり続けてテスト誤差が離れていきます。決定木では「次数」が「木の深さ」にあたります。深いほど訓練データには完璧に合い、未知のデータでは崩れる

アンサンブル: 平均するか、直すか

1本が不安定なら、たくさん作って束ねればいい。これがアンサンブルで、方向性は大きく2つあります。

バギング(並列に作って平均する)。データを毎回ランダムに選び直して深い木を何百本も作り、多数決を取ります。1本1本は暴れていても、暴れ方がバラバラなら平均すると打ち消し合う。ランダムフォレストはこれに「各分岐で使う列もランダムに絞る」を加えて、木同士の似すぎを防いだものです。手軽で頑丈ですが、精度の上限はそこそこで止まります。

ブースティング(直列に作って修正する)。こちらは発想が逆です。まず浅くて弱い木を1本作り、その木が外した分だけを次の木に学ばせる。さらに残った誤差を3本目に…と、前の失敗を後ろが埋めていきます。1本1本は「切り株」と呼ばれるほど浅くていい。弱い学習器を直列につないで強くする、この積み上げ方が勾配ブースティングです。

違いは覚え方が簡単です。バギングはばらつきを潰す(同じ問題を何度も解いて平均)、ブースティングは偏りを潰す(前回の間違いを次回の宿題にする)。

勾配ブースティング: 「残差」を追いかける

ブースティングの中身を式で見ます。mm 本目まで積んだモデルを FmF_m とすると、更新はこうです。

Fm(x)=Fm1(x)+νfm(x)F_m(x) = F_{m-1}(x) + \nu\, f_m(x)
(3)

fmf_m が新しく足す木、ν\nu(ニュー)は学習率で0.01〜0.3あたりの小さな値です。つまり「今までの予測に、新しい木の言い分を少しだけ混ぜる」。一気に全部混ぜないのが肝で、この控えめさが過学習を抑えます。

では fmf_m は何を学ぶのか。ここが「勾配」ブースティングと呼ばれる理由です。各行について、損失関数を現在の予測値で微分した値の符号を反転させたもの——

gi=L(yi,F(xi))F(xi)F=Fm1g_i = -\left.\frac{\partial L(y_i, F(x_i))}{\partial F(x_i)}\right|_{F=F_{m-1}}
(4)

——を計算し、新しい木にはこの値を当てさせますLL は損失、yiy_i は正解、F(xi)F(x_i) は現時点の予測です。言い換えると「この行の予測を、どっちへどれだけ動かせば損失が減るか」。二乗誤差の場合、この値はちょうど残差(正解 − 予測)そのものになります。だから直感的には「まだ外している分を次の木が学ぶ」で正しく、その一般形が勾配だ、という順序で理解すれば十分です。

つまり勾配ブースティングは、パラメータ空間ではなく関数空間で勾配降下をしているわけです。1ステップ進むかわりに木を1本足す。学習率 ν\nu は歩幅そのもので、大きすぎれば行き過ぎ、小さすぎれば進まない——この関係は普通の勾配降下と完全に同じです。

FIG 2学習率スライダーは、勾配ブースティングの n_estimators と learning_rate の関係そのものです。歩幅を小さくすると確実に谷へ近づく代わりに本数が要り、大きくすると跳ね回って落ち着かない

XGBoost・LightGBM・CatBoost は何が違うのか

理論は1990年代からありました。これを実用品に変えたのが2010年代のライブラリ群です。

XGBoost(2016)は、損失を2次まで展開して分岐を評価します。1次の勾配 gig_i に加えて2次微分 hih_i も使い、葉の値を解析的に決めます。

wj=iIjgiiIjhi+λw_j^* = -\frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda}
(5)

IjI_j は葉 jj に落ちた行の集合、λ\lambda は正則化の強さです。「その葉に集まった行の『動かしたい量』の合計を、『動かしやすさ』の合計で割る」——分母に λ\lambda を足しているので、行数の少ない葉ほど値が0側に引き戻されます。過学習対策が式の中に組み込まれているわけです。加えて、欠損値に対して「左右どちらへ送るか」を学習で決める仕組み(sparsity-aware split finding)を持ちます。欠損を埋めなくていいというのは、実務では地味に大きな利点です。

LightGBM(2017)は速度に振りました。連続値をあらかじめヒストグラムの箱に丸めて候補点を減らし、木をleaf-wise(誤差が最も減る葉から優先的に伸ばす)で育てます。同じ葉数ならXGBoostのlevel-wiseより損失が下がりやすい反面、いびつに深い木ができて過学習しやすい。だからnum_leavesmin_data_in_leafの調整が要になります。勾配の大きい行を優先的に残すサンプリング(GOSS)と、同時に非ゼロにならない疎な列を束ねる圧縮(EFB)も速度に効いています。

CatBoost(2018)はカテゴリ列に強い設計です。カテゴリを目的変数の平均で数値化する「ターゲットエンコーディング」は強力ですが、その行自身の正解を使ってしまうと答えを盗み見ることになります。CatBoostは行に順序を入れて「自分より前の行だけ」で統計を作ることで、この漏れを構造的に防いでいます。

コードで書く

scikit-learn互換のAPIなら、骨格はこれだけです。

import lightgbm as lgb

model = lgb.LGBMClassifier(
    n_estimators=2000,      # 木の本数(多めに置いて早期終了で止める)
    learning_rate=0.05,     # 式(3)のν。小さいほど本数が要る
    num_leaves=31,          # leaf-wiseの複雑さ。まずここを触る
    min_child_samples=20,   # 葉に最低これだけ行が要る=過学習の歯止め
)
model.fit(
    X_train, y_train,
    eval_set=[(X_valid, y_valid)],
    callbacks=[lgb.early_stopping(100)],   # 100本改善しなければ打ち切り
)

ポイントはearly_stoppingです。ブースティングは木を足すほど訓練誤差が下がり続けるので、どこで止めるかは検証データにしか決められません。本数を固定するのではなく、多めに置いて自動で止めるのが定石です。

なぜニューラルネットは表データで勝ちきれないのか

理由は1つではありませんが、比較研究(Grinsztajn らのベンチマーク、Shwartz-Ziv らの検証)が繰り返し指摘するのは次の点です。

1. 表データの正解は、なめらかではない。「年収500万円」を境に判断が切り替わる、といった段差のある関係が普通に存在します。木は分岐そのものが段差なので一発で表現できますが、ニューラルネットはなめらかな関数を好むため、段差を再現するのに苦労します。

2. 役に立たない列に弱い。実務の表には、無関係な列や重複した列が大量に混ざります。木は分岐のたびに「効く列」だけを選ぶので無関係な列を自然に無視しますが、全結合層は入力を全部混ぜてしまうため、ノイズを引きずり込みやすい。

3. 列の意味が固定されている。画像なら隣り合うピクセルに意味がありますが、表の列は順番を入れ替えても意味が変わらない一方、列そのものには固有の意味があります。全結合層の最初の層は入力を回転させても等価な処理をするため、この「列ごとの個性」を活かしにくいのです。

加えて、表データのデータセットは数千〜数万行と小さいことが多く、事前学習で他所から知識を持ち込む文化も育っていませんでした。近年はTabPFNのように「小さな表を文脈として読み込む」方向の研究が出てきており、小規模な表では有力な選択肢になりつつあります。ただし現時点で、規模の大きい実務データの標準は依然としてGBDTです。

現場ではこう使う

誰が、いつ触るか。与信スコア、不正検知、解約予測、需要予測、広告のCTR予測、製造の歩留まり分析——表が出てくる案件では、データサイエンティストやMLエンジニアがまずGBDTでベースラインを作ります。「深層学習を試す前に、まずLightGBMを回す」は業界の作法に近い手順です。ベースラインが弱ければ問題設計か特徴量が疑わしい、という切り分けにも使えます。

最初に触るパラメータ。LightGBMならlearning_ratenum_leavesmin_child_samplesfeature_fractionlambda_l2、XGBoostならetamax_depthmin_child_weightsubsamplecolsample_bytree。順番としては、学習率を0.05程度に下げて本数を早期終了に任せ、次に複雑さ(num_leaves/max_depth)、最後に正則化とサンプリングです。木の本数を手で調整するのは最後の手段です。

事故になる落とし穴

面接で問われる形。「なぜ表データではGBDTが強いのか」「バギングとブースティングの違いは」「学習率と木の本数の関係は」——いずれもこの記事の内容がそのまま答えです。特に最後の問いは、「学習率を半分にしたら本数はおおよそ倍要る。歩幅と歩数の関係と同じ」と答えられれば十分です。

まとめ

表が出てきたら、まずLightGBM。深層学習を持ち出すのは、それを超えられなかったときで遅くありません。

参考文献

  1. XGBoost: A Scalable Tree Boosting System. arXiv:1603.02754論文ページ·PDF
  2. Why do tree-based models still outperform deep learning on typical tabular data?. arXiv:2207.08815論文ページ·PDF
  3. Tabular Data: Deep Learning is Not All You Need. arXiv:2106.03253論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です