アンサンブルメソッドの力
Gli アンサンブルメソッド 複数の弱いモデルを組み合わせて、強力なモデルを作成します。直感 それは簡単です。多くの凡庸な専門家に意見を求め、その回答を集約することで結果が得られます。 一人の専門家に頼るよりも優れています。これが最も勝てるテクニックです Kaggle での ML コンテスト。本番環境の多くのシステムを強化します。アンサンブルの三本柱 私は 袋詰め, ブースト e 積み重ねる.
Il 袋詰め (ブートストラップ集約) ランダムなサブセットで独立したモデルをトレーニングします データを収集し、予測を集計します。を削減します。 分散。の ブースト モデルを順番にトレーニングし、新しいモデルごとに前のモデルのエラーを修正します。を削減します。 バイアス。の 積み重ねる 基本モデルの予測を入力として使用します それらを最適に組み合わせる方法を学習するメタモデル。
この記事で学べること
- バギングとランダム フォレスト: 分散の削減
- AdaBoost: 最初のブースティング アルゴリズム
- 勾配ブースティング: 最先端の技術
- XGBoost、LightGBM、CatBoost: 最新の実装
- スタッキングと投票: 異種モデルの結合
- アンサンブルのハイパーパラメータ調整
バギングとランダムフォレスト
Il 袋詰め ブートストラップ サンプリングによってデータセットの N 個のコピーを作成します (サンプリング 再挿入)、各コピーでモデルをトレーニングし、多数決によって予測を集計します。 (分類) または平均 (回帰)。の ランダムフォレスト を追加してバギングを拡張します 特徴のランダム化: 各分割で、特徴のランダムなサブセットのみが含まれます。 検討した。この二重のランダム化により非相関ツリーが生成され、分散がさらに減少します。
AdaBoost: アダプティブブースティング
AdaBoost (適応型ブースティング) これは、初めて成功したブースティング アルゴリズムでした。 モデルによって誤って分類されたサンプルに大きな重みを割り当てて、モデルを順番にトレーニングします。 以前。新しいモデルはそれぞれ、最も困難なミスに焦点を当てています。モデルは組み合わせられています 加重平均を使用します。各モデルの重みはその精度に依存します。
from sklearn.ensemble import (
BaggingClassifier, RandomForestClassifier,
AdaBoostClassifier, GradientBoostingClassifier,
VotingClassifier, StackingClassifier
)
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np
data = load_breast_cancer()
X, y = data.data, data.target
# Modelli ensemble
models = {
'Decision Tree': DecisionTreeClassifier(random_state=42),
'Bagging (50 trees)': BaggingClassifier(
estimator=DecisionTreeClassifier(random_state=42),
n_estimators=50, random_state=42, n_jobs=-1
),
'Random Forest': RandomForestClassifier(
n_estimators=100, random_state=42, n_jobs=-1
),
'AdaBoost': AdaBoostClassifier(
n_estimators=100, learning_rate=0.1, random_state=42
),
'Gradient Boosting': GradientBoostingClassifier(
n_estimators=100, learning_rate=0.1,
max_depth=3, random_state=42
)
}
print("Confronto Ensemble Methods:")
for name, model in models.items():
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f" {name:<25s}: {scores.mean():.4f} (+/- {scores.std():.4f})")
勾配ブースティング: キング・オブ・コンペティション
Il 勾配ブースティング モデルを順番に構築します。各新しいモデルはどこから作成されますか で訓練された 残留物 前モデルの(エラー)。勾配降下法を使用して、 任意の損失関数を最小化します。その結果、非常に強力で強力なモデルが完成しました。 過学習を避けるためにハイパーパラメータを慎重に調整する必要があります。
XGBoost (エクストリーム グラディエント ブースティング) 最も一般的な実装です: L1/L2 正則化、ネイティブ欠損値管理、並列化、インテリジェントな枝刈り。 ライトGBM Microsoft が提供する、大規模なデータセットの速度とメモリが最適化されています (レベルごとではなく葉ごとにツリーを成長させます)。 キャットブースト Yandex がネイティブに管理する 手動エンコードを必要としないカテゴリ特徴。
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.datasets import load_breast_cancer
import numpy as np
data = load_breast_cancer()
X, y = data.data, data.target
# Gradient Boosting di scikit-learn con Grid Search
param_grid = {
'n_estimators': [50, 100, 200],
'learning_rate': [0.01, 0.05, 0.1],
'max_depth': [3, 5, 7],
'min_samples_split': [2, 5],
'subsample': [0.8, 1.0]
}
gb = GradientBoostingClassifier(random_state=42)
# Nota: GridSearchCV con molti parametri e' lento
# In pratica si usa RandomizedSearchCV
from sklearn.model_selection import RandomizedSearchCV
random_search = RandomizedSearchCV(
gb, param_grid,
n_iter=20, # 20 combinazioni random
cv=5,
scoring='accuracy',
random_state=42,
n_jobs=-1
)
random_search.fit(X, y)
print(f"Best score: {random_search.best_score_:.4f}")
print(f"Best params: {random_search.best_params_}")
# XGBoost (se installato)
try:
from xgboost import XGBClassifier
xgb = XGBClassifier(
n_estimators=200,
learning_rate=0.05,
max_depth=5,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.1, # L1 regularization
reg_lambda=1.0, # L2 regularization
random_state=42,
eval_metric='logloss'
)
scores_xgb = cross_val_score(xgb, X, y, cv=5, scoring='accuracy')
print(f"\nXGBoost: {scores_xgb.mean():.4f} (+/- {scores_xgb.std():.4f})")
except ImportError:
print("\nXGBoost non installato. Installa con: pip install xgboost")
スタッキングと投票
Il 投票分類子 さまざまなモデルからの予測を組み合わせます。ザ」厳しい投票 多数決を利用します。の ソフト投票 予測された確率を平均します(一般に、 より効果的です)。の スタッキング さらに、基本モデルの予測を特徴として使用します。 の入力の メタ学習者 最適な組み合わせを学習します。
from sklearn.ensemble import (
VotingClassifier, StackingClassifier,
RandomForestClassifier, GradientBoostingClassifier
)
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
X, y = data.data, data.target
# Modelli base
rf = RandomForestClassifier(n_estimators=100, random_state=42)
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
svm = make_pipeline(StandardScaler(), SVC(probability=True, random_state=42))
lr = make_pipeline(StandardScaler(), LogisticRegression(max_iter=10000))
# Soft Voting
voting = VotingClassifier(
estimators=[('rf', rf), ('gb', gb), ('svm', svm), ('lr', lr)],
voting='soft'
)
# Stacking con meta-learner LogisticRegression
stacking = StackingClassifier(
estimators=[('rf', rf), ('gb', gb), ('svm', svm)],
final_estimator=LogisticRegression(max_iter=10000),
cv=5
)
# Confronto
for name, model in [('RF', rf), ('GB', gb), ('Voting', voting), ('Stacking', stacking)]:
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f"{name:<12s}: {scores.mean():.4f} (+/- {scores.std():.4f})")
バギングとブースティング: バギングは独立したモデルを結合することで分散を削減します (ランダムフォレスト)。ブーストはエラーを順番に修正することでバイアスを軽減します (XGBoost)。袋詰め 並列化可能であり、過学習に対する耐性が高くなります。ブーストは通常より多くなります 強力ですが、より慎重な調整が必要です。基本的に、Gradient Boosting (XGBoost、LightGBM) は 多くの場合、表形式のデータに最適な選択です。
重要なポイント
- バギングは、独立したモデルを組み合わせることで分散を削減します (ランダム フォレスト)
- ブースティングはエラーを順番に修正することでバイアスを低減します (AdaBoost、Gradient Boosting)
- XGBoost/LightGBM は表形式データの最先端です
- 学習率が低い + 推定器が多い = 結果は良くなりますが、トレーニングに時間がかかります
- スタッキングは異種モデルとメタ学習器を結合します
- RandomizedSearchCV は、多くのハイパーパラメータを備えた GridSearchCV よりも効率的です







