← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:決定木アンサンブルの原理 | 関連:訓練・検証・テストと交差検証(OOB)

要点(BLUF)

1. バギング:ブートストラップして平均する

決定木(決定木)の最大の弱点は「不安定」、つまり高バリアンスでした。データがちょっと変わるだけで木の形がガラッと変わります。アンサンブルの原理 で見たとおり、散らばるものは平均すれば散らばりが減る——これを決定木に適用したのがバギングです。

バギングの手順はとてもシンプルです。

flowchart TB
    D["元の訓練データ(n件)"]
    D --> B1["ブートストラップ標本1<br/>復元抽出でn件"]
    D --> B2["ブートストラップ標本2<br/>復元抽出でn件"]
    D --> Bdots["..."]
    D --> BM["ブートストラップ標本M<br/>復元抽出でn件"]
    B1 --> T1["木1を育てる"]
    B2 --> T2["木2を育てる"]
    Bdots --> Tdots["..."]
    BM --> TM["木Mを育てる"]
    T1 --> Agg["集約:回帰は平均 / 分類は多数決"]
    T2 --> Agg
    Tdots --> Agg
    TM --> Agg
    Agg --> Pred["最終予測"]

ここで ブートストラップ標本 とは、元のデータ(nn 件)から1件取っては戻し、また取っては戻しnn 回くりかえして作った nn 件のデータです(=復元抽出による再標本化)。同じデータが何度も選ばれることもあれば、一度も選ばれないこともあります。これを MM セット作り、それぞれで木を1本ずつ育てます。

なぜ平均でバリアンスが下がるのか

回帰を例にします。bb 番目のブートストラップ標本で育てた木の予測を f^b(x)\hat f_b(x) とすると、バギングの予測は

f^bag(x)=1Mb=1Mf^b(x)\hat f_{\text{bag}}(x) = \frac{1}{M}\sum_{b=1}^{M} \hat f_b(x)

です。各木の予測が分散 σ2\sigma^2 を持つとき、もし木どうしが完全に独立なら MM 個の平均の分散は

Var ⁣[f^bag(x)]=σ2M\operatorname{Var}\!\left[\hat f_{\text{bag}}(x)\right] = \frac{\sigma^2}{M}

となり、木を増やすほど 00 に近づきます。

要するに:似たような予測を何本も平均すれば、たまたま上振れ・下振れした木が打ち消し合い、予測が安定する(バリアンスが減る)ということです。一方でバイアスはほとんど変わりません(各木が低バイアスなら平均も低バイアスのまま)。だからバギングは「低バイアス・高バリアンス」な決定木と相性が抜群なのです。

⚠️ ただし「完全に独立なら」は理想論です。実際の木どうしは同じ元データから作るので相関します。この相関こそがランダムフォレストの出発点で、3節で正面から扱います。

2. OOB(Out-of-Bag)誤差:タダで手に入る検証

バギングには「おまけ」があります。各ブートストラップ標本には、元データの一部が選ばれずに余るのです。この余り(袋の外=Out-of-Bag)を使うと、別途データを取り分けなくても汎化性能を見積もれます。

約37%が余る理由

データ1件が、nn 回の復元抽出で一度も選ばれない確率を考えます。1回の抽選で「選ばれない」確率は 11n1 - \frac{1}{n}。これが nn 回連続で起きる確率は

(11n)nn1e0.368\left(1 - \frac{1}{n}\right)^{n} \xrightarrow[n\to\infty]{} \frac{1}{e} \approx 0.368

です。(11n)ne1\bigl(1-\frac1n\bigr)^n \to e^{-1} は指数関数の定義そのものから来ます。

要するに:データが十分大きいと、各ブートストラップ標本には元データの約 63.2% しか入らず、残り約 36.8% はその木の学習に使われません。この「使われなかった約37%」が、その木にとっての未知データとして使えるわけです。

flowchart LR
    D["元データ(n件)"] -->|"復元抽出 n回"| B["ブートストラップ標本<br/>≒ 63.2% が学習に使われる"]
    D -->|"選ばれず余る"| OOB["OOBサンプル<br/>≒ 36.8%(その木には未知)"]
    OOB --> Eval["その木の予測精度を評価"]

OOB誤差の作り方

各データ点 ii について、「ii を学習に使わなかった木だけ」を集めて予測させ、その集約とラベルを比べます。全データ点でこれを集計したものが OOB誤差 です。

flowchart TB
    Start["データ点 i を選ぶ"] --> Find["i が OOB だった木だけ集める"]
    Find --> Vote["それらの木で i を予測(平均 / 多数決)"]
    Vote --> Comp["真のラベル y_i と比較"]
    Comp --> Loop["全データ点で集計 → OOB誤差"]

要するに:OOB誤差は「各点を、その点を見ていない木たちだけで予測した誤差」なので、実質的にホールドアウト検証や交差検証の代わりになります(訓練・検証・テストと交差検証)。MM が十分大きければ各点を平均 37% の木で評価でき、K分割交差検証のようにモデルを何度も作り直す必要がないのが利点です。木を1セット育てるだけで検証用スコアまで付いてくる、という効率の良さです。

3. ランダムフォレスト:木を脱相関させる

ここがこのノートの核心です。バギングだけでは不十分で、ランダムフォレストは「各分割で特徴をランダムに絞る」というひと工夫を加えます。なぜそれが必要かは、2節で保留した「木どうしの相関」を式で見ると一目瞭然です。

相関があると平均は効かない(04-01の式の具体化)

アンサンブルの原理 で導いた、相関を含む平均の分散の式を思い出します。各木の分散を σ2\sigma^2、木どうしのペア相関ρ\rho とすると、MM 本の平均の分散は

Var ⁣[f^bag(x)]=ρσ2+1ρMσ2\operatorname{Var}\!\left[\hat f_{\text{bag}}(x)\right] = \rho\,\sigma^2 + \frac{1-\rho}{M}\,\sigma^2

になります。MM \to \infty の極限で第2項は消え、

VarMρσ2\operatorname{Var} \xrightarrow[M\to\infty]{} \rho\,\sigma^2

が残ります。

要するに:木をいくら増やしても(MM\to\infty)、バリアンスは 00 ではなく ρσ2\rho\sigma^2 で頭打ちになります。下限を決めているのは木どうしの相関 ρ\rhoρ\rho が大きければ、何本平均しても下がりません。だからバリアンスを本気で下げたいなら、ρ\rho を下げる=木どうしを似させない(脱相関させる) しかないのです。

xychart-beta
    title "木の本数Mとアンサンブルのバリアンス(相関ρの効果)"
    x-axis "木の本数 M" [1, 10, 50, 100, 300]
    y-axis "バリアンス(相対値)" 0 --> 1.0
    line "相関 高(ρ=0.6)" [1.0, 0.64, 0.61, 0.61, 0.60]
    line "相関 低(ρ=0.1)" [1.0, 0.19, 0.12, 0.11, 0.10]

上のグラフが示すとおり、相関が高い(ρ=0.6\rho=0.6)と木を増やしても約 0.60.6 で止まりますが、脱相関できている(ρ=0.1\rho=0.1)と約 0.10.1 まで下がります。同じ本数でも下がり方がまったく違う、というのが要点です。

なぜ特徴をランダムに絞ると脱相関するのか

バギングの木が相関する元凶は、強い特徴(予測に効く特徴) の存在です。とても効く特徴が1つあると、どのブートストラップ標本で育ててもほぼ全部の木が根のところでその特徴を使って分割します。結果、木の上の方の構造がそっくりになり、予測が相関します(ρ\rho が高い)。

ランダムフォレストはこれを断ち切ります。各ノードの分割を決めるとき、全 pp 個の特徴ではなく、ランダムに選んだ mm 個(m<pm < p)の中からだけ分割を探すのです。

graph TB
    Bag["バギング(特徴は全部使える)"] --> Strong["強い特徴を全木が根で使う"]
    Strong --> HiCorr["木が似る → 相関ρが高い"]
    HiCorr --> NoGain["平均してもρσ²で頭打ち"]

    RF["ランダムフォレスト(各分割で m 個に絞る)"] --> Vary["強い特徴が候補に入らない木もある"]
    Vary --> Diverse["木の構造がばらける → 相関ρが低い"]
    Diverse --> Gain["平均でバリアンスが大きく下がる"]

特徴を絞ると、ある分割では強い特徴が候補に入らず、別の特徴で切らざるをえません。これで木ごとに構造がばらけ、ρ\rho が下がります。多少バイアスが上がる(各木が最適でない分割を強いられる)代償はありますが、ρ\rho が下がることでバリアンスが大きく減り、トータルで誤差が改善する——これがランダムフォレストの取引です。

mm の目安

各分割で見る特徴数 mm(しばしば mtry と呼ぶ)の経験則は、pp を全特徴数として:

問題目安
分類mpm \approx \sqrt{p}
回帰mp/3m \approx p/3

要するに:ランダムフォレスト = バギング + 特徴ランダム化。前者でバリアンスを平均で削り、後者で「平均が効くように木を脱相関させる」。2段構えでバリアンスを徹底的に下げます。

4. 特徴量重要度:どの特徴が効いたか

ランダムフォレストは木を何百本も束ねるので1本の木のような可読性は失いますが、どの特徴がどれだけ効いたかを測る手段があります。代表的な2つを押さえます。

(a) 不純度減少ベース(MDI, Mean Decrease in Impurity)

学習中、ある特徴で分割するたびに不純度(ジニ等、決定木 参照)が減ります。その減少量を、その特徴が使われた全分割・全木にわたって合計し、重要度とします。学習時に副産物として計算できるので速いのが利点です。

(b) Permutation Importance(並べ替え重要度)

学習後に、ある特徴の値だけをランダムにシャッフルして壊し、予測精度がどれだけ落ちるかを測ります。落ち幅が大きいほどその特徴は重要、という考え方です(OOBデータや検証データ上で測れる)。

flowchart LR
    Trained["学習済みフォレスト"] --> Pick["特徴 j を選ぶ"]
    Pick --> Shuffle["特徴 j の列だけシャッフルして関係を破壊"]
    Shuffle --> Score["精度の低下幅を測る"]
    Score --> Imp["低下が大きい = 特徴 j は重要"]

MDIには偏りがある(重要な注意)

不純度減少ベース(MDI)にはよく知られた偏りがあります:

要するに:MDIは速い反面「種類の多い特徴をひいきする」クセがあります。特徴の性質(カーディナリティ)がバラバラなときや、重要度を真剣に解釈したいときは、偏りの小さい permutation importance を併用するのが安全です。

5. 長所と短所

graph TB
    RF["ランダムフォレスト"]
    RF --> Pros["長所"]
    RF --> Cons["短所"]
    Pros --> P1["チューニングが楽(既定値で強い)"]
    Pros --> P2["過学習に頑健(バリアンスを抑える)"]
    Pros --> P3["並列化できる(各木は独立に学習)"]
    Pros --> P4["OOBで検証がタダ/特徴量重要度が出る"]
    Cons --> C1["解釈性が低い(木1本のようには読めない)"]
    Cons --> C2["外挿できない(訓練範囲の外は苦手)"]
    Cons --> C3["木が多いとメモリ・推論が重い"]

長所

短所

要するに:ランダムフォレストは「とりあえず強い」万能寄りのモデル。チューニングと前処理が軽く頑健な一方、可読性と外挿は捨てています。

6. バギング系とブースティング系の違い

ランダムフォレスト(バギング系)と、次章の勾配ブースティング(勾配ブースティング)は、アンサンブルでも狙いと作り方が正反対です。

観点ランダムフォレスト(バギング)勾配ブースティング
主に下げるものバリアンスバイアス
木の作り方並列(独立に同時に育てる)逐次(前の木の誤りを次が補正)
個々の木深い木(低バイアス・高バリアンス)浅い木(高バイアス・低バリアンス)
木を増やすと頭打ちになるだけ(過学習しにくい)増やしすぎると過学習しうる
チューニング学習率・本数など要調整

要するに:ランダムフォレストは「暴れる木をたくさん平均して落ち着かせる(バリアンス退治)」、ブースティングは「弱い木を順に積み上げて賢くする(バイアス退治)」。同じ”木のアンサンブル”でも発想が逆です。詳しくは 勾配ブースティング で扱います。

⚠️ よくある誤解

対応するシミュレーション

simulations/bagging_variance.py:ノイズのある1次元回帰で、訓練セットを何度も作り直しながら「単一の深い決定木」と「100本のバギング」の予測を重ねて描きます。単一の木は訓練データのわずかな違いで予測曲線が大きくブレる(高バリアンス)のに対し、バギングは木どうしのブレが打ち消し合って予測が安定することを可視化します。バイアスを変えずバリアンスを下げるバギングの効果(アンサンブルの原理 の脱相関)が見て取れます。

バギングがバリアンスを下げる

関連ノート