Shikata Ga Nai

Private? There is no such things.

37. アンサンブル学習とは? 〜複数モデルを組み合わせる〜

Hello there, ('ω')ノ

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

アンサンブル学習(Ensemble Learning) とは、
複数の異なる機械学習モデルを組み合わせて、最終的な予測を行う手法 です。

📌 なぜアンサンブル学習が重要なのか?

  • 1つのモデルの弱点を補完し、より高い精度を実現!
  • 過学習を防ぎ、汎化性能(新しいデータへの適応力)を向上!
  • 安定した予測が可能になり、実務での適用範囲が広がる!

「複数のモデルを組み合わせることで、より賢い予測ができる!」


📌 2. 主要なアンサンブル学習の手法

アンサンブル学習には、大きく分けて 3つの手法 があります。

✅ ① バギング(Bagging)

バギング(Bagging: Bootstrap Aggregating)は、「複数のモデルを並列に学習し、予測を統合する手法」 です。

📌 特徴

  • データをランダムにサンプリングし、複数のモデルを学習
  • 最終的な予測は、多数決(分類) or 平均値(回帰)で決定
  • 過学習を防ぎ、安定した予測が可能!

📌 代表的なアルゴリズム

  • ランダムフォレスト(Random Forest)(複数の決定木を使う)
  • Extra Trees(Extremely Randomized Trees)(ランダム性を強化)

「バギング = 予測のバラツキを減らし、より安定したモデルを作る!」


✅ ② ブースティング(Boosting)

ブースティング(Boosting)は、「前のモデルの誤分類を次のモデルが補正する」 という考え方で、
複数の弱いモデル(決定木など)を順番に学習し、強いモデルを作る手法 です。

📌 特徴

  • 前のモデルのミスを次のモデルが学習し、改善する
  • 最終的な予測は、重み付きの投票 or 加重平均で決定
  • 単体のモデルよりも高精度になりやすいが、過学習しやすい!

📌 代表的なアルゴリズム

  • XGBoost(eXtreme Gradient Boosting)
  • LightGBM(Light Gradient Boosting Machine)
  • AdaBoost(Adaptive Boosting)

「ブースティング = 予測精度をどんどん向上させる!」


✅ ③ スタッキング(Stacking)

スタッキング(Stacking)は、「複数の異なるモデルを組み合わせ、最終的な予測を行うメタモデルを学習する手法」 です。

📌 特徴

  • 異なるアルゴリズム(SVM, ランダムフォレスト, XGBoostなど)を組み合わせる
  • 最終的な予測は、別の「メタモデル」で統合(例: ロジスティック回帰)
  • 最も高精度なアンサンブル手法だが、実装が複雑!

📌 代表的な手法

  • Blending(シンプルなスタッキング)
  • Stacked Generalization(本格的なスタッキング)

「スタッキング = 異なるモデルの長所を最大限に活かす!」


📌 3. Pythonでアンサンブル学習を実装

✅ ① バギング(ランダムフォレスト)

まずは、ランダムフォレストを使ってバギングを実装します!

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, y = iris.data, iris.target

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ランダムフォレストの実装(バギング)
rf_model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
rf_model.fit(X_train, y_train)

# 予測
y_pred = rf_model.predict(X_test)

# 精度を評価
print(f"Random Forest Accuracy: {accuracy_score(y_test, y_pred):.2f}")

ランダムフォレストを使って、決定木を多数組み合わせ!
バギングにより、安定したモデルを実現!


✅ ② ブースティング(XGBoost)

次に、XGBoostを使ってブースティングを試します!

import xgboost as xgb

# XGBoostの実装(ブースティング)
xgb_model = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, use_label_encoder=False, eval_metric="mlogloss")
xgb_model.fit(X_train, y_train)

# 予測
y_pred_xgb = xgb_model.predict(X_test)

# 精度を評価
print(f"XGBoost Accuracy: {accuracy_score(y_test, y_pred_xgb):.2f}")

XGBoostを使って、誤分類をどんどん修正!
高精度なブースティングモデルを実現!


✅ ③ スタッキング(異なるモデルを組み合わせる)

以下のコードでは、ランダムフォレスト(バギング)とXGBoost(ブースティング)を組み合わせて、
最終的な予測をロジスティック回帰で統合(スタッキング) します。

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression

# スタッキングモデルの作成
estimators = [
    ('rf', RandomForestClassifier(n_estimators=100, random_state=42)),
    ('xgb', xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, use_label_encoder=False, eval_metric="mlogloss"))
]

stacking_model = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression())

# モデルの学習
stacking_model.fit(X_train, y_train)

# 予測と評価
y_pred_stack = stacking_model.predict(X_test)
print(f"Stacking Accuracy: {accuracy_score(y_test, y_pred_stack):.2f}")

異なるモデルを組み合わせて、より高精度な予測を実現!
スタッキングにより、それぞれのモデルの強みを活かす!


🎯 まとめ

アンサンブル学習は、複数のモデルを組み合わせて精度を向上!
バギング(ランダムフォレスト)で予測を安定化!
ブースティング(XGBoost)で精度を最大化!
スタッキングで異なるモデルの長所を活かす!

Best regards, (^^ゞ