はじめに
アンサンブル学習は、複数の弱学習器を組み合わせることで、単体モデルより高い汎化性能を実現する手法です。Kaggle等のコンペティションでもトップソリューションの多くがアンサンブル手法を採用しています。
本記事では、基本構成要素である決定木から、バギング(ランダムフォレスト)、**ブースティング(GBDT)**までを体系的に解説します。
決定木
CART アルゴリズム
分類木ではジニ不純度を最小化する分割を再帰的に探索します。
\[\text{Gini}(t) = 1 - \sum_{k=1}^{K} p_k^2 \tag{1}\]ここで \(p_k\) はノード \(t\) におけるクラス \(k\) の割合です。
回帰木では二乗誤差を使います。
\[\text{MSE}(t) = \frac{1}{|t|} \sum_{i \in t} (y_i - \bar{y}_t)^2 \tag{2}\]不純度の導出的な意味:ジニ不純度とエントロピー
なぜ「不純度」を最小化するのか、その意味を明らかにします。ノード \(t\) の不純度関数 \(\varphi(p_1,\dots,p_K)\) に求められる性質は、(i) 純粋なノード(ある \(k\) で \(p_k=1\) )で最小値 \(0\) をとる、(ii) 一様分布 \(p_k=1/K\) で最大値をとる、(iii) \(p_k\) に関して凹関数である、の3つです。ジニ不純度(式(1))とエントロピーはいずれもこれを満たす代表例です。エントロピーは情報理論由来の不純度で、次のように定義されます。
\[ H(t) = -\sum_{k=1}^{K} p_k \log p_k \tag{3} \]分割基準=情報利得の最大化。 候補分割 \(s\) がノード \(t\) を、割合 \(w_L = n_L/n_t\) 、\(w_R = n_R/n_t\) の子ノード \(t_L, t_R\) に分けるとき、CART は次の情報利得を最大化する分割を貪欲に選びます。
\[ \Delta I(s, t) = \varphi(t) - \left[w_L \varphi(t_L) + w_R \varphi(t_R)\right] \tag{4} \]ここで重要なのは \(\Delta I(s,t) \ge 0\) が常に成り立つことです。\(t\) 内のクラス \(k\) の個数は \(t_L\) と \(t_R\) の個数の和なので、クラス割合も子の凸結合 \(p_k(t) = w_L p_k(t_L) + w_R p_k(t_R)\) になります。\(\varphi\) が凹関数であることから、Jensen の不等式より
\[ \varphi(t) = \varphi\big(w_L\, p(t_L) + w_R\, p(t_R)\big) \ge w_L \varphi(t_L) + w_R \varphi(t_R) \]が成り立ち、これがそのまま \(\Delta I(s,t)\ge 0\) を意味します。つまり凹な不純度関数を使う限り、どんな分割も訓練データ上の不純度を悪化させることはありません。決定木が「深く分割すれば訓練誤差はいくらでも下げられる」性質を持つのはこのためで、後述の実行検証で数値的にも確認します。
ジニとエントロピーの関係。 両者は独立な指標ではなく、近似の次数が異なるだけの同じ量です。\(\ln x \le x-1\) (等号は \(x=1\) )より \(-\ln p_k \ge 1-p_k\) が成り立つので、両辺に \(p_k\ge0\) を掛けて \(k\) について和を取ると
\[ H(t) = \sum_k p_k \ln\frac{1}{p_k} \;\ge\; \sum_k p_k(1-p_k) = 1 - \sum_k p_k^2 = \text{Gini}(t) \]すなわちエントロピーは常にジニ不純度以上です。差が縮むのは各 \(p_k\) が1に近い(ほぼ純粋な)ノードで、\(\ln(1/p_k) = (1-p_k) + \frac{(1-p_k)^2}{2} + \cdots\) という Taylor 展開の1次項がジニの被加数 \(1-p_k\) と一致するからです。つまりジニ不純度はエントロピーの1次(線形)近似であり、2次項 \((1-p_k)^2/2>0\) の分だけエントロピーの方が常に大きくなります。両者が実務上ほぼ同じ木を出すのは偶然ではなく、この近似関係に由来します。
回帰木のMSE分割基準の導出
回帰木でも同じ「凹関数と Jensen の不等式」の構造が、分散分解という完全に閉じた式になります。子ノードの平均を \(\bar y_L, \bar y_R\) 、\(n=n_L+n_R\) 、全体平均を \(\bar y = (n_L\bar y_L+n_R\bar y_R)/n\) とすると、平方和の恒等式
\[ \sum_{i \in t}(y_i - \bar y)^2 = \sum_{i \in t_L}(y_i - \bar y_L)^2 + \sum_{i \in t_R}(y_i - \bar y_R)^2 + \frac{n_L n_R}{n}(\bar y_L - \bar y_R)^2 \]が成り立ちます(左辺の各項に \(\bar y_L\) または \(\bar y_R\) を加減して展開すると、交差項が \(\sum_{i\in t_L}(y_i-\bar y_L)=0\) などにより消えることで確認できます)。両辺を \(n\) で割ると、MSE の分解式
\[ \text{MSE}(t) = w_L\,\text{MSE}(t_L) + w_R\,\text{MSE}(t_R) + w_L w_R (\bar y_L - \bar y_R)^2 \tag{5} \]を得ます(\(w_L=n_L/n,\ w_R=n_R/n\) )。したがって MSE 基準による情報利得は
\[ \Delta \text{MSE}(s, t) = \text{MSE}(t) - \left[w_L\,\text{MSE}(t_L) + w_R\,\text{MSE}(t_R)\right] = w_L w_R (\bar y_L - \bar y_R)^2 \tag{6} \]という完全な閉形式になり、2群の平均の差の2乗に比例することが分かります。分類のジニ不純度が「Jensen の不等式で非負性しか言えない」不等式評価だったのに対し、回帰の MSE は等号(厳密な恒等式)まで書き下せる点が対照的です。
決定木の長所と短所
| 長所 | 短所 |
|---|---|
| 解釈しやすい | 過学習しやすい |
| 前処理が不要 | 決定境界が軸に平行 |
| 非線形に対応 | 分散が大きい(不安定) |
実行検証:深さ制御と過学習
決定木は「分割すればするほど訓練不純度は下がる」ことを上で示しました。では実際に木を深くすると、訓練精度と検証精度はどう乖離するのでしょうか。make_classificationで生成した1,000サンプル・20特徴量のデータ(訓練700件・検証300件、random_state=42、本記事のPython実装コードと同一設定)に対し、max_depthを1から15まで変えてDecisionTreeClassifierを学習し、訓練精度と検証精度を記録しました。
depths = list(range(1, 16))
train_accs, test_accs = [], []
for d in depths:
clf = DecisionTreeClassifier(max_depth=d, random_state=42)
clf.fit(X_train, y_train)
train_accs.append(accuracy_score(y_train, clf.predict(X_train)))
test_accs.append(accuracy_score(y_test, clf.predict(X_test)))
実行結果は次の通りです(抜粋)。
max_depth | 訓練精度 | 検証精度 | 差(過学習度) |
|---|---|---|---|
| 1 | 0.677 | 0.697 | -0.020 |
| 3 | 0.830 | 0.773 | 0.057 |
| 5 | 0.910 | 0.827 | 0.083 |
| 6 | 0.934 | 0.830 | 0.104 |
| 8 | 0.980 | 0.803 | 0.177 |
| 10 | 0.996 | 0.797 | 0.199 |
| 15(実際の木の深さは11で飽和) | 1.000 | 0.817 | 0.183 |
検証精度は max_depth=6 の 0.830 でピークに達し、それ以降は訓練精度が1.0に張り付く一方で検証精度はむしろ0.80前後まで低下します(max_depth=10で最低の0.797)。訓練・検証の差は深さとともにほぼ単調に拡大し、max_depth=1では逆に検証精度が訓練精度を上回っていますが、これは検証セットが300件と小さいための統計的なノイズです。この結果は、「不純度は分割すればするほど下がる」という前段の定理(式(4))と、「テスト誤差はバイアス・バリアンス分解に従うため無条件には下がらない」という次章の議論とを、数値で橋渡しするものです。
図に示すと次のようになります。

バギング
バイアス・バリアンス分解
バギングがなぜ有効なのかを理解するには、まず期待二乗誤差の分解を導出する必要があります。真のモデルを \(y = f(\mathbf{x}) + \varepsilon\) (\(\mathbb{E}[\varepsilon]=0\) 、\(\text{Var}(\varepsilon)=\sigma^2\) 、\(\varepsilon\) は推定量と独立)とし、訓練データ \(D\) から得た推定量 \(\hat f_D(\mathbf x)\) の新規点 \((\mathbf x,y)\) に対する期待二乗誤差を、\(D\) と \(\varepsilon\) の両方について期待値評価します。\(\bar f(\mathbf x) := \mathbb{E}_D[\hat f_D(\mathbf x)]\) (複数の訓練データセットにわたる推定量の平均)とおくと、
\[ \mathbb{E}_{D,\varepsilon}\big[(y - \hat f_D(\mathbf x))^2\big] = \mathbb{E}\Big[\big((f(\mathbf x) - \bar f(\mathbf x)) + (\bar f(\mathbf x) - \hat f_D(\mathbf x)) + \varepsilon\big)^2\Big] \]と書けます。右辺を展開すると2乗項が3つ、交差項が3つ現れますが、交差項はすべて0になります。\((f-\bar f)\) は \(\mathbf x\) のみに依存する定数なので \(\mathbb{E}_D[\bar f(\mathbf x) - \hat f_D(\mathbf x)] = \bar f(\mathbf x)-\bar f(\mathbf x)=0\) より1項目と2項目の交差項が消え、\(\varepsilon\) は \(\hat f_D\) とも \(f\) とも独立で平均0なので \(\varepsilon\) を含む交差項も消えます。残るのは2乗項だけで、
$$ \mathbb{E}{D,\varepsilon}\big[(y - \hat f_D(\mathbf x))^2\big] = \underbrace{(f(\mathbf x)-\bar f(\mathbf x))^2}{\text{Bias}^2}
- \underbrace{\mathbb{E}D\big[(\bar f(\mathbf x) - \hat f_D(\mathbf x))^2\big]}{\text{Variance}}
- \sigma^2 \tag{7} $$
というバイアス・バリアンス分解を得ます。バギングが標的にするのはこのうちVariance項だけで、Bias と既約誤差 \(\sigma^2\) には(原理的には)手を出しません。
原理
**Bootstrap Aggregating(バギング)**は、ブートストラップサンプルで複数の決定木を独立に学習し、予測を平均化(回帰)または多数決(分類)します。
\[\hat{f}_{\text{bag}}(\mathbf{x}) = \frac{1}{B} \sum_{b=1}^{B} \hat{f}_b(\mathbf{x}) \tag{8}\]分散を削減する効果があります。
\[\text{Var}\left(\frac{1}{B}\sum_b f_b\right) = \frac{\sigma^2}{B} \quad (\text{独立な場合}) \tag{9}\]ブートストラップ相関と分散削減の限界
式(9)は \(B\) 本の木が完全に独立という非現実的な仮定を置いています。実際にはどの木も同じ \(n\) 件からのブートストラップサンプルで学習されるため、木同士には正の相関が生じます。各木の分散を \(\sigma_f^2 := \text{Var}(\hat f_b)\) 、任意の2本間の相関係数を \(\rho\) とおいて、平均予測 \(\hat f_{\text{bag}} = \frac1B\sum_b \hat f_b\) の分散を一般に計算すると、
\[ \text{Var}(\hat f_{\text{bag}}) = \frac{1}{B^2}\left[\sum_{b=1}^B \text{Var}(\hat f_b) + \sum_{b \ne b'} \text{Cov}(\hat f_b, \hat f_{b'})\right] = \frac{1}{B^2}\Big[B\sigma_f^2 + B(B-1)\rho\sigma_f^2\Big] = \rho\sigma_f^2 + \frac{1-\rho}{B}\sigma_f^2 \tag{10} \]となります(Hastie, Tibshirani & Friedman, The Elements of Statistical Learning, 式(15.1))。\(\rho=0\) の理想的な独立ケースでは式(9)の \(\sigma_f^2/B\) に一致しますが、ブートストラップサンプルは元データを重複して共有するため実際には \(\rho>0\) であり、\(B\to\infty\) としても分散は下限 \(\rho\sigma_f^2\) に張り付いて \(0\) には収束しません。ランダムフォレストが各分割で特徴量をランダムサブサンプリングするのは、この \(\rho\) 自体を引き下げて漸近分散の下限を小さくするための工夫です。
ランダムフォレスト
バギングに加えて、各分割で特徴量のランダムサブセット(\(m \approx \sqrt{p}\) )のみを候補にします。これにより木の間の相関 \(\rho\) を下げ(式(10))、さらに分散を削減します。
OOB(Out-of-Bag)誤差の導出
ブートストラップサンプルは \(n\) 個の訓練データから重複を許して \(n\) 回抽出します。特定のサンプル \(i\) が1回の抽出で選ばれない確率は \(1-1/n\) なので、独立な \(n\) 回の抽出すべてで選ばれない確率は
\[ P(\text{サンプル } i \text{ がOOB}) = \left(1 - \frac{1}{n}\right)^n \tag{11} \]です。\(n\to\infty\) の極限では、自然対数の底の定義 \(\lim_{n\to\infty}(1+x/n)^n = e^x\) に \(x=-1\) を代入した形そのものなので、
\[ \lim_{n\to\infty}\left(1-\frac1n\right)^n = e^{-1} \approx 0.368 \tag{12} \]に収束します。つまり1本の木は平均して元データの約63.2%だけで学習され、残り約36.8%はその木にとって「学習に使われなかったデータ」(Out-of-Bag)になります。\(B\) 本の木があれば、サンプル \(i\) を訓練に使わなかった木はおよそ \(0.368B\) 本存在し、それらだけを使ってサンプル \(i\) を予測すれば、そのサンプルにとって完全な held-out 予測が得られます。全サンプルについてこれを集計した誤差がOOB誤差です。交差検証のように何度も再学習する必要がなく、1回のバギング学習の副産物として汎化誤差の推定量が得られる点が実務上の利点です。
実行検証:OOB誤差と検証誤差の比較
まず、ブートストラップのOOB割合の理論値 \(e^{-1}\approx 0.368\) (式(12))が経験的に成立するかを確認します。訓練データ(\(n=700\) )から2,000回ブートストラップ抽出をシミュレートしたところ、平均OOB割合は0.3673となり、有限 \(n\) での理論値 \((1-1/700)^{700} = 0.3676\) (式(11))とほぼ完全に一致しました。
次にRandomForestClassifier(oob_score=True)で n_estimators を50〜500まで変化させ、OOBスコアと実際の検証セット精度を比較しました。
n_estimators | OOB精度 | 検証精度 | 差 |
|---|---|---|---|
| 50 | 0.9014 | 0.9100 | 0.0086 |
| 100 | 0.9171 | 0.9167 | 0.0005 |
| 200 | 0.9271 | 0.9200 | 0.0071 |
| 300 | 0.9343 | 0.9267 | 0.0076 |
| 500 | 0.9386 | 0.9233 | 0.0152 |
OOB精度と検証精度は常に1.5ポイント以内で一致し、n_estimators=100では差がわずか0.0005でした。これは交差検証や別途のホールドアウトセットを用意しなくても、OOBスコアだけで十分に信頼できる汎化性能の推定ができることを、式(11)(12)の理論と整合する形で裏付けています。
ブースティング
AdaBoost:指数損失の前向き段階的加法モデリング
ブースティングの起源である AdaBoost は天下り的なアルゴリズムに見えますが、実は「指数損失を貪欲に最小化する加法モデル」として導出できます(Friedman, Hastie & Tibshirani, 2000, Additive Logistic Regression)。ラベルを \(y_i \in \{-1, +1\}\) 、加法モデルを \(F_m(\mathbf x) = \sum_{t=1}^m \alpha_t h_t(\mathbf x)\) (\(h_t(\mathbf x)\in\{-1,+1\}\) は弱学習器)とし、次の指数損失を最小化することを考えます。
\[ L = \sum_{i=1}^n \exp\big(-y_i F_m(\mathbf x_i)\big) \tag{13} \]**前向き段階的加法モデリング(forward stagewise additive modeling)**では、既に決まった \(F_{t-1}\) を固定したまま、新しい項 \(\alpha_t h_t\) だけを追加して損失を最小化します。
\[ L_t = \sum_i \exp\big(-y_i F_{t-1}(\mathbf x_i)\big)\exp\big(-y_i \alpha_t h_t(\mathbf x_i)\big) = \sum_i w_i^{(t)} \exp\big(-\alpha_t y_i h_t(\mathbf x_i)\big) \]ここで \(w_i^{(t)} := \exp(-y_i F_{t-1}(\mathbf x_i))\) は前段までの累積損失から決まるサンプル重みです。\(y_i h_t(\mathbf x_i)\) は正しく分類できていれば \(+1\) 、誤分類なら \(-1\) の値しか取らないため、正解集合の重み和を \(W_{\text{correct}}\) 、誤分類集合の重み和を \(W_{\text{wrong}}\) 、\(W=W_{\text{correct}}+W_{\text{wrong}}\) 、加重誤り率を \(\epsilon_t := W_{\text{wrong}}/W\) とおくと、
\[ L_t = W_{\text{correct}}\, e^{-\alpha_t} + W_{\text{wrong}}\, e^{\alpha_t} = W\left[(1-\epsilon_t)e^{-\alpha_t} + \epsilon_t e^{\alpha_t}\right] \]とまとめられます。\(\alpha_t\) で微分して \(0\) と置くと \(-(1-\epsilon_t)e^{-\alpha_t} + \epsilon_t e^{\alpha_t} = 0\) 、すなわち \(e^{2\alpha_t} = (1-\epsilon_t)/\epsilon_t\) となるため、
\[ \alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t} \tag{14} \]という AdaBoost の重み更新式が導出されます。この \(\alpha_t\) によるサンプル重みの更新 \(w_i^{(t+1)} = w_i^{(t)} e^{-\alpha_t y_i h_t(\mathbf x_i)}\) は、誤分類サンプル(\(y_ih_t(\mathbf x_i)=-1\) )で重みが \(e^{\alpha_t}=\sqrt{(1-\epsilon_t)/\epsilon_t}\) 倍(\(\epsilon_t<0.5\) なら1より大)に増え、正解サンプルでは \(e^{-\alpha_t}\) 倍に減ります。「誤分類したサンプルの重みを増やして次の弱学習器に回す」という AdaBoost の操作は、指数損失の段階的最小化から自然に出てくる帰結であり、天下り的なヒューリスティックではありません。
勾配ブースティング(GBDT)
弱学習器を逐次的に追加し、前の学習器の残差(負の勾配)をフィッティングします。
ステップ \(m\) での更新:
\[F_m(\mathbf{x}) = F_{m-1}(\mathbf{x}) + \eta \cdot h_m(\mathbf{x}) \tag{15}\]ここで \(h_m\) は擬似残差 \(r_{im} = -\frac{\partial L(y_i, F_{m-1}(\mathbf{x}_i))}{\partial F_{m-1}(\mathbf{x}_i)}\) にフィットした決定木、\(\eta\) は学習率です。
GBDTは関数空間の勾配降下法
AdaBoost が指数損失に特化した手続きだったのに対し、勾配ブースティングは任意の微分可能な損失関数 \(L(y, F(\mathbf x))\) に一般化したものです。鍵となる見方は、\(F\) を「訓練点での値のベクトル \((F(\mathbf x_1),\dots,F(\mathbf x_n)) \in \mathbb{R}^n\) 」とみなし、パラメータ空間ではなく関数空間で最急降下法を行うことです。
通常の勾配降下法がパラメータ \(\theta\) を \(\theta \leftarrow \theta - \eta \nabla_\theta L\) と更新するのに対応して、関数空間での降下方向は各訓練点における負の勾配
\[ r_{im} = -\left[\frac{\partial L(y_i, F(\mathbf x_i))}{\partial F(\mathbf x_i)}\right]_{F=F_{m-1}} \tag{16} \]です。しかしこれは訓練点でしか定義されない「\(n\) 次元だけの」方向なので、そのままでは未知の \(\mathbf x\) に汎化できません。そこで弱学習器 \(h_m\) (回帰木)をこの擬似残差 \(r_{im}\) に回帰フィットさせ、「実現可能な関数のクラスの中で負の勾配に最も近い方向」として使うのが式(15)の更新です。
損失関数を変えると、この枠組みは次のように具体化されます。
- 二乗誤差 \(L=\frac12(y-F)^2\) :\(-\partial L/\partial F = y - F\) となり、負の勾配が普通の残差そのものになります。「残差に木をフィットする」という直感的な説明は、二乗誤差損失を選んだ場合の特殊ケースにすぎません。
- 指数損失 \(L = \exp(-yF)\) (\(y\in\{\pm1\}\) ):負の勾配は \(y\exp(-yF)\) となり、これに対する最適な弱学習器の選択と最適ステップ幅(前節で導出した式(14)の \(\alpha_t\) に対応するライン・サーチ)を組み合わせると、AdaBoost そのものが再導出されます(Friedman, 2001, Greedy Function Approximation: A Gradient Boosting Machine)。
つまりAdaBoost は指数損失を使った勾配ブースティングの特殊ケースであり、GBDT はこれを二乗誤差・対数損失(LogitBoost)・分位点損失など任意の微分可能損失に拡張した一般化として位置づけられます。
バギング vs ブースティング
| 特徴 | バギング | ブースティング |
|---|---|---|
| 学習方式 | 並列(独立) | 逐次(依存) |
| 主な効果 | 分散の削減 | バイアスの削減 |
| 過学習耐性 | 高い | 低い(要チューニング) |
| 代表手法 | ランダムフォレスト | GBDT, XGBoost, LightGBM |
Python実装
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import (RandomForestClassifier,
GradientBoostingClassifier)
from sklearn.metrics import accuracy_score
# --- データ生成 ---
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10,
n_redundant=5, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=42)
# --- モデル比較 ---
models = {
'Decision Tree': DecisionTreeClassifier(max_depth=5, random_state=42),
'Random Forest': RandomForestClassifier(n_estimators=100, max_depth=5,
random_state=42),
'Gradient Boosting': GradientBoostingClassifier(n_estimators=100,
max_depth=3,
learning_rate=0.1,
random_state=42),
}
results = {}
for name, model in models.items():
cv_scores = cross_val_score(model, X_train, y_train, cv=5,
scoring='accuracy')
model.fit(X_train, y_train)
test_acc = accuracy_score(y_test, model.predict(X_test))
results[name] = {'cv_mean': cv_scores.mean(), 'cv_std': cv_scores.std(),
'test_acc': test_acc}
print(f"{name}: CV={cv_scores.mean():.3f}±{cv_scores.std():.3f}, "
f"Test={test_acc:.3f}")
# --- 特徴量重要度(ランダムフォレスト) ---
rf = models['Random Forest']
importances = rf.feature_importances_
indices = np.argsort(importances)[::-1][:10]
plt.figure(figsize=(10, 5))
plt.bar(range(10), importances[indices])
plt.xticks(range(10), [f'Feature {i}' for i in indices], rotation=45)
plt.ylabel('Importance')
plt.title('Random Forest Feature Importance (Top 10)')
plt.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.show()
実行検証:決定木 vs ランダムフォレスト vs 勾配ブースティング
実際にこのコードを実行すると、次の結果が得られます(5分割交差検証の平均±標準偏差と、ホールドアウト検証セットでのテスト精度)。
| モデル | CV精度(平均±標準偏差) | テスト精度 |
|---|---|---|
| Decision Tree | 0.807 ± 0.022 | 0.827 |
| Random Forest | 0.901 ± 0.017 | 0.890 |
| Gradient Boosting | 0.921 ± 0.019 | 0.907 |
単体の決定木(max_depth=5)に対し、バギングであるランダムフォレストは CV 精度を9.4ポイント改善(0.807→0.901)、逐次的に残差を追う勾配ブースティングはさらに2.0ポイント上乗せ(0.901→0.921)しています。これは式(9)(10)で導出したバギングの分散削減と、式(15)(16)で導出したブースティングによるバイアス削減が、実データでも整合的に効いていることを示しています。特徴量重要度の上位は特徴量11(重要度0.144)、14(0.132)、15(0.098)が突出しており、20次元のうちn_informative=10で設定した情報を持つ特徴量に重要度が集中する様子が確認できます。
主要ハイパーパラメータ
ランダムフォレスト
| パラメータ | 説明 | 目安 |
|---|---|---|
n_estimators | 木の数 | 100-500(多いほど安定) |
max_depth | 木の深さ | 5-20 |
max_features | 分割候補の特徴量数 | \(\sqrt{p}\) (分類)、\(p/3\) (回帰) |
勾配ブースティング
| パラメータ | 説明 | 目安 |
|---|---|---|
n_estimators | ブースティングの反復数 | 100-1000 |
learning_rate | 学習率 \(\eta\) | 0.01-0.1 |
max_depth | 各木の深さ | 3-8(浅め) |
学習率と反復数にはトレードオフがあり、小さな学習率 + 多くの反復が一般的です。
関連記事
- Self-Attentionの仕組みとPython実装 - Transformerベースの手法とアンサンブル学習の比較に有用です。
- サポートベクターマシン(SVM) - 別の強力な分類手法であるSVMとの比較に有用です。
- k-means法とGMM - 教師なし学習との対比。決定木は特徴量重要度の算出にも利用されます。
- SGDからAdamまで - 勾配ブースティングの「勾配」と最適化手法の関連です。
- ベイズ最適化の基礎とPython実装 - GBDTのハイパーパラメータ最適化にベイズ最適化を適用できます。
- 機械学習による時系列予測・分類・異常検知ハブ - アンサンブル学習を時系列予測・分類・異常検知の全体地図に位置づけ、k-means/GMM・LSTM・カルマンとの使い分けを示すハブ記事。
- LSTMによる時系列予測のPython実装 - 時系列予測の比較対象。GBDT + ラグ特徴量と LSTM の精度/コスト/解釈性を実データで比較する出発点になります。
参考文献
- Breiman, L. (2001). “Random Forests”. Machine Learning, 45(1), 5-32.
- Friedman, J. H. (2001). “Greedy Function Approximation: A Gradient Boosting Machine”. Annals of Statistics, 29(5), 1189-1232.
- Friedman, J., Hastie, T., & Tibshirani, R. (2000). “Additive Logistic Regression: A Statistical View of Boosting”. Annals of Statistics, 28(2), 337-407.
- Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning (2nd ed.), Chapter 15.
- scikit-learn Ensemble Methods