見出し画像

アンサンブル学習を完全攻略!初心者でもわかる最強の機械学習手法

機械学習において、より高い精度を得るための強力な手法の一つが アンサンブル学習 です。
今回は、アンサンブル学習の基本から代表的な手法まで、初心者にもわかりやすく解説します。


1. アンサンブル学習とは?

1.1 単体のモデル vs アンサンブル学習

機械学習モデルには、決定木・SVM・ニューラルネットワーク などさまざまな種類があります。
しかし、単体のモデル(単一学習器)では、データに対する予測のばらつきが生じやすく、汎化性能(未知データへの適応能力)も限定されます。

そこで登場するのが アンサンブル学習 です。
これは 複数のモデルを組み合わせて予測精度を向上させる手法 で、以下のようなメリットがあります。

精度向上:複数のモデルの知見を活かすことで、より正確な予測が可能
過学習の抑制:異なる特徴を持つモデルを組み合わせることで、特定のデータに過剰適応するのを防ぐ
安定性向上:データのノイズや外れ値による影響を低減

1.2 代表的なアンサンブル学習の手法

アンサンブル学習には、いくつかの代表的な手法があります。
主に以下の3種類に分類されます。

  1. バギング(Bagging):データのランダムサンプリング+並列処理

  2. ブースティング(Boosting):モデルの逐次学習による強化

  3. スタッキング(Stacking):異なるモデルを組み合わせる手法

これらを順番に詳しく見ていきましょう。


2. バギング(Bagging)

2.1 バギングの概要

バギング(Bootstrap Aggregating) は、以下のような仕組みでモデルを強化します。

  1. データのランダムサンプリング

    • 元のデータセットから 重複あり で複数のサブデータセットを作成(ブートストラップ法)。

  2. 複数のモデルを独立に学習

    • それぞれのデータセットで異なる学習モデルをトレーニング。

  3. 予測結果を統合

    • 分類問題 → 多数決(Voting)

    • 回帰問題 → 平均(Averaging)

この手法により、ノイズの影響を減らし、安定したモデルを作成できます。

2.2 バギングの代表例:ランダムフォレスト

バギングの代表的なアルゴリズムが ランダムフォレスト(Random Forest) です。
これは 複数の決定木(Decision Tree)を組み合わせたモデル で、以下のような特徴があります。

過学習しにくい(単体の決定木に比べて)
高い精度(多様な特徴量を考慮)
並列処理が可能(個々の決定木を独立に学習)

Pythonでの実装(Random Forest)

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの準備
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# ランダムフォレストの学習
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# 予測と評価
y_pred = rf.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))


3. ブースティング(Boosting)

3.1 ブースティングの概要

ブースティングは 誤分類されたデータに重点を置きながら、モデルを逐次的に強化する手法 です。
バギングと異なり、各モデルが 前のモデルの誤りを修正しながら学習 する点が特徴です。

  1. 弱いモデル(Weak Learner)を作成

  2. 誤分類されたデータに重みを増やす

  3. 次のモデルがその誤りを修正

  4. 最終的にモデルの加重平均を取る

3.2 ブースティングの代表例

ブースティングには以下のようなアルゴリズムがあります。

AdaBoost(Adaptive Boosting):弱学習器(例:決定木)を組み合わせて誤りを修正
Gradient Boosting(GBDT):勾配降下法を使ってモデルを最適化
XGBoost / LightGBM / CatBoost:高速で高精度な派生手法

Pythonでの実装(XGBoost)

from xgboost import XGBClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの準備
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# XGBoostの学習
xgb = XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=42)
xgb.fit(X_train, y_train)

# 予測と評価
y_pred = xgb.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))


4. スタッキング(Stacking)

4.1 スタッキングの概要

スタッキングは、異なる種類のモデルを組み合わせて最適な予測を行う手法 です。
一般的な流れは以下のとおりです。

  1. 異なる種類のモデル(例:SVM・ランダムフォレスト・XGBoost)を学習

  2. 各モデルの予測結果を特徴量として、新しいモデル(メタモデル)を学習

  3. メタモデルが最終的な予測を行う

4.2 Pythonでの実装(Stacking)

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# データの準備
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# ベースモデル
base_models = [
    ('rf', RandomForestClassifier(n_estimators=100)),
    ('gb', GradientBoostingClassifier(n_estimators=100))
]

# スタッキングモデル
stacking = StackingClassifier(estimators=base_models, final_estimator=LogisticRegression())
stacking.fit(X_train, y_train)

# 評価
print("Accuracy:", stacking.score(X_test, y_test))


5. まとめ

アンサンブル学習を活用し、より高精度なモデルを作っていきましょう! 


いいなと思ったら応援しよう!

この記事が参加している募集