AdaBoost シミュレーター 戻る
機械学習シミュレーター

AdaBoost シミュレーター — 弱分類器のブースティング

2次元データに対し、深さ1の決定スタンプを弱分類器として AdaBoost を T 回反復。サンプル重みと最終強分類器の決定境界を可視化し、なぜ弱学習器の組合せが高精度になるかを学べます。

パラメータ設定
ブースティング反復回数 T
クエリ点 x
クエリ点 y

データはシード 42 の LCG で生成(クラス +1:原点付近、クラス −1:ドーナツ状)。線形分離不可能。

計算結果
訓練精度
クエリ予測
ブースティング回数 T
α 重み合計
サンプル重みと決定境界

青=クラス +1/赤=クラス −1/点の大きさ=最終重み/背景塗り=強分類器の決定境界/黒×=クエリ点

理論・主要公式

AdaBoost は重み付き多数決で強分類器を構築するブースティングアルゴリズムです。各反復で前段の誤分類に重みを集中させ、弱学習器を逐次的に訓練します。

重み付き誤分類率 ε_t と弱分類器重み α_t:

$$\varepsilon_t = \sum_{i} w_i\,\mathbb{1}[h_t(\mathbf{x}_i) \ne y_i], \quad \alpha_t = \tfrac{1}{2}\log\frac{1-\varepsilon_t}{\varepsilon_t}$$

サンプル重みの更新と正規化(Z_t は正規化定数):

$$w_i \leftarrow \frac{w_i\,\exp(-\alpha_t\,y_i\,h_t(\mathbf{x}_i))}{Z_t}$$

最終強分類器:

$$H(\mathbf{x}) = \mathrm{sign}\!\left(\sum_{t=1}^{T} \alpha_t\,h_t(\mathbf{x})\right)$$

弱学習器は深さ1の決定スタンプ(単一特徴量の閾値判定)で十分。T を増やすほど訓練誤差は指数的に減少します。

AdaBoost シミュレーターとは

🙋
「弱分類器」って言葉、よく聞くんですけど…弱いのに組み合わせると強くなるって、なんだか不思議ですよね?
🎓
そこが AdaBoost の面白いところだよ。ざっくり言うと、ランダムよりちょっとだけマシな分類器(深さ1の決定スタンプとか)を、何十個も「重み付き多数決」で組み合わせると、複雑な決定境界が描けるようになる。上のシミュレーターは、原点付近の青クラスとドーナツ状の赤クラスを分けようとしている。スタンプは「x ≥ 閾値」とか「y ≥ 閾値」みたいな縦横の線1本だけなのに、20回も重ねると曲線っぽい境界が浮かび上がるよ。
🙋
点の大きさが違うのはなぜですか?大きいやつと小さいやつがありますね。
🎓
それが AdaBoost の核心だ。最終的なサンプル重みを点の大きさで表している。各反復で「前段が間違えたサンプル」の重みを増やすので、決定境界の近くにいる「分類が難しい点」ほど大きくなる。逆に簡単な点はだんだん小さくなる。「次の弱学習器は、これまでに失敗した問題を頑張って解いてね」という指示を、重みという形で渡しているわけだ。
🙋
「α 重み合計」ってカードがあるんですが、これは何ですか?
🎓
最終強分類器は各スタンプの予測に α_t を掛けて足し合わせる。α_t は誤分類率が小さいほど大きくなる「信頼度」だ。$\alpha_t = \frac{1}{2}\log\frac{1-\varepsilon_t}{\varepsilon_t}$ で、ε=0.5(ランダム)だと α=0、ε=0.1 だと α≈1.1 になる。合計値は強分類器のスコアの「規模感」を示していて、T を増やすほど大きくなるよ。スライダーで T を1から50まで動かして、訓練精度と α 合計がどう変わるか見てごらん。
🙋
クエリ点 (0,0) はちゃんと「+1」って出ました!ドーナツの真ん中なので青ですよね。
🎓
そう、原点はクラス +1 の中心だから期待通り。クエリ点を (3,0) あたりに動かしてみて——ドーナツの上だから −1 になるはずだ。さらに (5,5) など外側に動かすと、訓練データが無い領域なのでスタンプの組合せ次第で予測が変わる。境界の安定性は外挿領域では弱いというのも、ブースティングの一般的な性質だよ。

よくある質問

どちらもアンサンブル学習ですが、訓練方法が異なります。Bagging(Random Forest が代表例)は訓練データをブートストラップで複数生成し、各学習器を独立に並列で訓練して多数決を取ります。AdaBoost は各反復で前段の誤分類サンプルの重みを増やしながら逐次的に学習器を訓練し、各学習器に α 重みを付けて重み付き多数決を取ります。Bagging は分散低減、Boosting はバイアス低減が主な狙いです。
AdaBoost は指数損失の貪欲最小化と解釈でき、勾配ブースティング(Gradient Boosting)の特殊ケースです。勾配ブースティングは損失関数を一般化し、対数損失や二乗誤差など任意の微分可能な損失に対して残差勾配を弱学習器でフィッティングします。XGBoost や LightGBM は勾配ブースティングをヒストグラム近似や正則化、並列化で大規模化した実装で、Kaggle 等で表形式データの定番アルゴリズムになっています。AdaBoost はその起源にあたる古典的手法です。
Viola-Jones の顔検出器(2001年)は AdaBoost を実用化した最も有名な応用例です。Haar-like 特徴量を計算する膨大な弱分類器候補から、AdaBoost で有効なものを少数選び、カスケード構造に並べることでリアルタイム顔検出を実現しました。OpenCV の haarcascade_frontalface などはこの方式の実装で、ガラケー時代の携帯カメラからデジカメの顔認識まで広く搭載されました。
理論上は反復回数 T を増やすほど訓練誤差は単調に減りますが、テスト誤差は必ずしも増えません。これは「マージン理論」で説明され、訓練誤差がゼロになった後も AdaBoost はマージン(決定境界からの距離)を広げ続けるためです。ただしラベルノイズが多いデータでは、ノイズサンプルに重みが集中して過学習を起こします。ノイズが疑われる場合は LogitBoost や勾配ブースティングの方が頑健です。

実世界での応用

顔検出・物体検出:Viola-Jones の顔検出器は AdaBoost の最も有名な応用です。Haar-like 特徴量の膨大な候補から、AdaBoost で有効な特徴量を選び、カスケード構造で「明らかに顔でない領域」を高速に棄却することで、当時の貧弱な計算機でもリアルタイム顔検出を実現しました。デジタルカメラの顔認識やスマートフォンの自動フォーカスなど、画像処理の現場で長く使われてきました。

表形式データの分類・回帰:AdaBoost の系譜にある勾配ブースティング決定木(GBDT)は、表形式データの分類・回帰タスクで最強の手法の一つです。XGBoost、LightGBM、CatBoost といったライブラリは、Kaggle コンペティションや実務の信用スコアリング・需要予測・異常検知で広く使われ、深層学習が苦手とする表形式データで真価を発揮します。

テキスト分類・スパム判定:初期のメールスパム判定器の多くは、単語の出現を弱分類器とした AdaBoost や類似のブースティング手法で実装されていました。各単語の出現有無は弱い特徴ですが、それを数千個重ね合わせることで高精度なフィルタが構築できます。

医療診断支援:放射線画像からの腫瘍検出や、心電図からの不整脈検出など、医療画像・生体信号の二値分類にもブースティング系手法が使われます。各特徴量の寄与(α 重み)が解釈可能なため、臨床現場での説明責任にも対応しやすい利点があります。

よくある誤解と注意点

最も多い誤解は、「弱分類器を増やせば増やすほど精度が上がる」と単純に考えてしまうことです。確かに訓練誤差は T とともに単調に減りますが、テスト誤差は必ずしも改善しません。特にラベルノイズの多いデータでは、ノイズサンプルに重みが集中して、後半の弱学習器がノイズの暗記に費やされ過学習します。シミュレーターで T=50 にしたとき、決定境界が訓練点ぴったりにくねくね曲がるなら、それは新しいデータには弱い兆候です。実務では交差検証で T を選ぶか、Early Stopping を導入します。

次に多いのが、「決定スタンプは弱すぎて非線形問題には使えない」という思い込みです。スタンプ1個では確かに縦横の線1本しか引けませんが、AdaBoost で重み付き多数決を取ると、複雑なドーナツ状のクラスでも分離できます。上のシミュレーターで T=20 にすれば、訓練精度は十分高くなるはずです。弱学習器の「弱さ」は問題ではなく、「ランダムよりわずかに良い」性能さえあれば、ブースティングが指数的に誤差を減らしてくれます。

最後に、サンプル重みは「再サンプリング」ではなく「損失の重み付け」である点に注意してください。実装によっては重みに比例して訓練サンプルを再サンプリングする方式もありますが、AdaBoost の標準的な実装は、弱学習器の訓練時に重み付き誤分類率を最小化するだけで、データそのものは複製しません。シミュレーターも全 40 サンプルをそのまま使い、各サンプルの貢献度を w_i で調整しています。重み更新式 $w_i \leftarrow w_i\,\exp(-\alpha_t\,y_i\,h_t(\mathbf{x}_i))$ は、正しく分類されたサンプルの重みを下げ、誤分類されたサンプルの重みを上げる対称的な形になっています。