決定木とランダムフォレスト — 質問を重ねて分け、森で束ねる

「x は 0.5 より大きい?」— そんな単純な質問の連鎖が、データ空間を長方形に切り分けていきます。木が1段育つと空間が1回切れるこの対応を動かして確かめ、1本の木の弱点(過学習)を森の多数決がどう克服するかまでを見ていきます。

1. 「はい/いいえ」の連鎖 — 決定木とは

決定木は、if (x < 0.52) { … } else { … } のような質問の入れ子でデータを仕分けるモデルです。プログラマにとっては最も読みやすい機械学習モデルと言えます。

幾何学的に見ると、質問1つ=軸に平行な直線で空間を2つに切ること。木にノードが1つ増えるたび、対応する領域が1回分割されます。下のデモで、左の空間分割と右の木が同時に育つ様子を確かめてください。

空間分割と木の成長 — 1分割ずつ追いかける
左=データ空間(青とオレンジの2クラス、20点)、右=対応する決定木。白い線が最新の分割、点線の丸が「次に分割される葉」。各分割はジニ不純度の減少(情報利得)が最大になる位置を貪欲に選んでいます。深さ制限を4に上げると、ノイズ点の周りに小さな「専用部屋」ができる=過学習の芽が見えます。
POINT — 決定木 = 空間の再帰的分割 葉ノード1枚 = 軸に平行な長方形領域1つ。予測はその領域内の多数決。だから決定木の境界は必ずカクカクした階段状になる。

2. 「良い質問」の選び方 — ジニ不純度

木は各ステップで「どの位置で切るのが一番良いか」をすべての候補について試し、貪欲に最良の1つを選びます。その「良さ」を測るものさしがジニ不純度 — 領域の中でクラスがどれだけ混ざっているかの指標です。

Gini(S) = 1 − Σk pk2 pk = 領域 S 内でクラス k が占める割合。2クラスなら 0(完全に純粋)〜 0.5(半々=最悪)

分割の良さは情報利得 = 分割前のジニ − 分割後の左右の重み付き平均ジニ。下のデモで分割線を左右にスライドさせ、利得が最大になる位置を探してみてください。

不純度の直感 — 分割線を動かしてジニの変化を見る
白い線=あなたの分割、緑の点線=計算上の最良位置。線を動かすと左右のジニ不純度と重み付き平均がバーで変わります。重なり領域のせいで不純度は0にできませんが、それでも「一番マシな位置」が明確に存在します。
POINT — 貪欲法で育つ 木はその場その場で最良の分割を選ぶだけで、全体として最適な木になる保証はない。それでも計算が速く実用上は十分よく働く。これが CART アルゴリズムの基本設計。

3. 切れ味の代償 — 決定木は過学習しやすい

深さを制限しなければ、決定木は訓練データを完全に暗記するまで切り続けられます。たった1つのノイズ点のために専用の小部屋を作ってしまう — 最初のデモで深さ制限を最大にすると、その様子が観察できます。

さらに厄介なのは不安定さです。データが少し変わるだけで最初の分割位置が変わり、そこから先の木全体がガラッと入れ替わります。つまり1本の木は分散が大きいモデルなのです。

注意 — 深い木は「暗記マシン」 訓練データでの正解率100%は簡単に達成できるが、それは汎化とは別物。深さ・葉の最小サンプル数などで刈り込む(剪定する)か、次に見る「森」で分散そのものを打ち消す。

4. 森で束ねる — ランダムフォレスト

不安定なら、たくさんの木を育てて多数決すればいい。ただし全員が同じ木では意味がないので、わざと木ごとに違いを作ります。

森の多数決 — 木を増やすと境界が滑らかになる
左=全データで育てた1本の深い木(過学習した境界)、右=ブートストラップした木を重ねた森。色の濃さ=票の割合で、各木の境界を薄く重ねたものに相当します。本数を1→25に増やすと、ギザギザの「暗記境界」が滑らかな境界に平均化されていきます。
Var森 ≈ ρσ2 + (1−ρ)σ2/B B = 木の本数、σ² = 1本の木の分散、ρ = 木同士の相関。B を増やすと第2項は消えるが第1項は残る — だから特徴量ランダム性で ρ を下げる工夫が効く
一歩先へ — ブースティングという別の束ね方 ランダムフォレストは木を並列に育てて平均するが、勾配ブースティング(XGBoost / LightGBM)は前の木の誤りを直すように木を直列に足していく。表形式データのコンペではいまだにこの「木の集団」が最強クラス。並列=頑健で調整が楽、直列=高精度だが過学習に注意、と覚えておこう。

5. まとめ