
アンサンブル学習を完全攻略!初心者でもわかる最強の機械学習手法
機械学習において、より高い精度を得るための強力な手法の一つが アンサンブル学習 です。
今回は、アンサンブル学習の基本から代表的な手法まで、初心者にもわかりやすく解説します。
1. アンサンブル学習とは?
1.1 単体のモデル vs アンサンブル学習
機械学習モデルには、決定木・SVM・ニューラルネットワーク などさまざまな種類があります。
しかし、単体のモデル(単一学習器)では、データに対する予測のばらつきが生じやすく、汎化性能(未知データへの適応能力)も限定されます。
そこで登場するのが アンサンブル学習 です。
これは 複数のモデルを組み合わせて予測精度を向上させる手法 で、以下のようなメリットがあります。
✅ 精度向上:複数のモデルの知見を活かすことで、より正確な予測が可能
✅ 過学習の抑制:異なる特徴を持つモデルを組み合わせることで、特定のデータに過剰適応するのを防ぐ
✅ 安定性向上:データのノイズや外れ値による影響を低減
1.2 代表的なアンサンブル学習の手法
アンサンブル学習には、いくつかの代表的な手法があります。
主に以下の3種類に分類されます。
バギング(Bagging):データのランダムサンプリング+並列処理
ブースティング(Boosting):モデルの逐次学習による強化
スタッキング(Stacking):異なるモデルを組み合わせる手法
これらを順番に詳しく見ていきましょう。
2. バギング(Bagging)
2.1 バギングの概要
バギング(Bootstrap Aggregating) は、以下のような仕組みでモデルを強化します。
データのランダムサンプリング
元のデータセットから 重複あり で複数のサブデータセットを作成(ブートストラップ法)。
複数のモデルを独立に学習
それぞれのデータセットで異なる学習モデルをトレーニング。
予測結果を統合
分類問題 → 多数決(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 ブースティングの概要
ブースティングは 誤分類されたデータに重点を置きながら、モデルを逐次的に強化する手法 です。
バギングと異なり、各モデルが 前のモデルの誤りを修正しながら学習 する点が特徴です。
弱いモデル(Weak Learner)を作成
誤分類されたデータに重みを増やす
次のモデルがその誤りを修正
最終的にモデルの加重平均を取る
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 スタッキングの概要
スタッキングは、異なる種類のモデルを組み合わせて最適な予測を行う手法 です。
一般的な流れは以下のとおりです。
異なる種類のモデル(例:SVM・ランダムフォレスト・XGBoost)を学習
各モデルの予測結果を特徴量として、新しいモデル(メタモデル)を学習
メタモデルが最終的な予測を行う
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. まとめ

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