アンサンブル学習の基本を徹底解説
バギング(Bagging)とは?
バギングは、Bootstrap AGGregatING(ブートストラップ・アグリゲーティング)の略で、機械学習のアンサンブル学習と呼ばれる手法の一つです。 アンサンブル学習とは、「三人寄れば文殊の知恵」のように、複数の学習モデル(単独ではそれほど精度が高くない「弱い学習器」)を組み合わせて、より強力で精度の高い一つのモデルを構築する手法を指します。
バギングの主な目的は、モデルのバリアンス(予測のばらつき)を減らし、過学習(訓練データに過剰に適合してしまい、未知のデータに対応できなくなること)を防ぐことで、汎化性能(未知のデータへの対応能力)を高めることです。 特に、決定木のように不安定になりがちなモデルに対して効果を発揮します。
バギングの仕組み
バギングは、Leo Breiman氏によって1996年に提案されたアルゴリズムで、以下の3つのステップで学習を進めます。
- ブートストラップサンプリング:元の訓練データから、ランダムにデータを復元抽出(一度選んだデータも再度選ばれることを許す抽出方法)します。 これにより、少しずつ内容の異なる複数のデータセット(ブートストラップサンプル)を作成します。
- モデルの並列学習:作成したそれぞれのデータセットを使って、独立した学習モデル(例:決定木)を並列で学習させます。
- 結果の統合(集約):学習させた複数のモデルの予測結果をまとめます。
この最後の「統合」の方法は、解きたい問題の種類によって異なります。
- 分類問題の場合:多数決(各モデルの予測結果で最も多かったクラスを採用)
- 回帰問題の場合:平均(各モデルの予測値の平均を算出)
このように、少しずつ異なるデータで学習した多様なモデルの「意見」を集約することで、個々のモデルが持つ予測のばらつきや偏りを打ち消し合い、安定した精度の高い予測が可能になります。
バギングの代表的なアルゴリズム:ランダムフォレスト
バギングの考え方を応用した最も有名で強力なアルゴリズムがランダムフォレストです。 ランダムフォレストは、バギングに加えてさらにランダム性を加えることで、より高い性能を発揮します。
基本的な学習器として決定木を使用し、以下の2つのランダム性を取り入れています。
- データのランダム性(バギング):ブートストラップサンプリングにより、学習に使うデータをランダムに選びます。
- 特徴量のランダム性:決定木の各ノードで分割を行う際に、すべての特徴量(説明変数)の中からランダムに選んだ一部の特徴量のみを分割の候補とします。
この「特徴量のランダム性」を加えることで、各決定木間の相関がさらに低くなり、より多様なモデルが作られます。 結果として、アンサンブル全体の性能が向上し、過学習を強力に抑制することができます。
バギングのメリット・デメリット
メリット | デメリット | |
---|---|---|
精度・安定性 | 過学習を抑制し、モデルの汎化性能を高めることで、予測精度が向上します。 また、訓練データが少し変わったときの予測のばらつき(バリアンス)を低減できます。 | – |
実装 | 各モデルは独立して並列に学習できるため、計算リソースを効率的に活用でき、実装も比較的容易です。 | 複数のモデルを学習させるため、単一のモデルよりも計算時間やメモリが多く必要になります。 |
解釈性 | – | 複数のモデルを組み合わせるため、単一のモデル(例:単一の決定木)に比べて、なぜその予測結果になったのかという判断根拠の解釈が難しくなります(ブラックボックス化)。 |
簡単なコード例(イメージ)
Pythonの機械学習ライブラリであるscikit-learnを使うと、バギングを簡単に実装できます。 以下は、決定木を基本学習器として用いた分類問題の例です。
# 必要なライブラリのインポート
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
# ダミーデータの生成
X, y = make_classification(n_samples=100, n_features=20, n_informative=15, n_redundant=5, random_state=42)
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
# バギングモデルの作成
# base_estimator: 基礎となる学習器(この場合は決定木)
# n_estimators: 作成する学習器の数
# random_state: 乱数のシード(再現性のために固定)
bagging_model = BaggingClassifier(
estimator=DecisionTreeClassifier(),
n_estimators=10,
random_state=42
)
# モデルの学習
bagging_model.fit(X_train, y_train)
# 予測と精度の評価
accuracy = bagging_model.score(X_test, y_test)
print(f"バギングモデルの精度: {accuracy}")
※ このコードはscikit-learnライブラリがインストールされている環境で動作します。
まとめ
バギングは、機械学習においてモデルの精度と安定性を向上させるための強力なテクニックです。 特に、その代表例であるランダムフォレストは、様々なデータ分析コンペティションや実務で高い成果を上げています。
仕組みは「多数の少しずつ違う意見を聞いて、最終的な判断を下す」という直感的なものであり、初心者の方でも比較的理解しやすいアンサンブル学習の入門として最適な手法と言えるでしょう。