Boosting · Bagging · Stacking — 三种主流集成学习策略的深度对比,从原理到实践,一图看懂它们的区别与联系。
每一轮训练都关注前一轮预测错误的样本,逐步修正偏差。弱学习器按顺序排列,后面的模型"弥补"前面的不足。
核心:降低偏差 (Bias)
通过有放回抽样 (Bootstrap) 生成多个训练集,独立训练多个模型,最后投票/平均。模型之间互不干扰。
核心:降低方差 (Variance)
训练多个不同类型的基学习器,将它们的预测结果作为新特征,交给一个元学习器 (Meta-Learner) 做最终决策。
核心:取长补短
| 对比维度 | Boosting | Bagging | Stacking |
|---|---|---|---|
| 训练方式 | 串行,依赖前一轮结果 | 并行,各模型独立训练 | 两层/多层,先基模型后元模型 |
| 主要目标 | 降低偏差 (Bias) | 降低方差 (Variance) | 综合提升,取长补短 |
| 基学习器 | 通常为弱学习器(浅树) | 通常为强学习器(深树) | 可异质(不同类型模型) |
| 数据采样 | 调整样本权重 | Bootstrap 有放回抽样 | Cross-Validation 生成元特征 |
| 融合方式 | 加权投票 / 加法模型 | 简单投票 / 平均 | 元学习器学习最优组合 |
| 过拟合风险 | 较低(偏差主导) | 较低(方差被平均) | 较高(需小心设计元层) |
| 训练速度 | 较慢(串行) | 快(可并行) | 中等(取决于基模型数量) |
| 可解释性 | 中等 | 较好(单树可解释) | 较差(多层黑盒) |
| 典型场景 | 表格数据竞赛、工业界首选 | 通用场景、快速 baseline | Kaggle 决赛圈、追求极致精度 |
| 代表算法 | XGBoost, LightGBM, AdaBoost | Random Forest, Bagged Trees | Blending, Super Learner |
集成学习的本质是对偏差和方差的权衡。Boosting 专注降低偏差,Bagging 专注降低方差,Stacking 两者兼顾。
理想状态
Boosting 要解决的问题
Bagging 要解决的问题
Stacking 综合改善
观察三种集成方法如何从弱模型逐步构建强模型。
点击「下一步」观看训练过程的每一步变化。
# pip install xgboost scikit-learn import xgboost as xgb from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split X, y = load_breast_cancer(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 梯度提升:串行训练,每轮拟合残差 model = xgb.XGBClassifier( n_estimators=100, max_depth=3, # 浅树,弱学习器 learning_rate=0.1, # 步长,控制收敛速度 subsample=0.8, # 样本采样率 colsample_bytree=0.8 # 特征采样率 ) model.fit(X_train, y_train) print(f"Accuracy: {model.score(X_test, y_test):.4f}")
from sklearn.ensemble import RandomForestClassifier # 随机森林:Bootstrap 采样 + 随机特征选择 model = RandomForestClassifier( n_estimators=100, max_depth=None, # 深树,强学习器 max_features='sqrt', # 每棵树随机选特征 bootstrap=True, # 有放回抽样 n_jobs=-1 # 并行训练 ) model.fit(X_train, y_train) print(f"Accuracy: {model.score(X_test, y_test):.4f}")
from sklearn.ensemble import StackingClassifier, RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC # Stacking:异质基模型 + 元学习器 base_models = [ ('rf', RandomForestClassifier(n_estimators=50)), ('svm', SVC(probability=True)), ('lr', LogisticRegression(max_iter=500)), ] model = StackingClassifier( estimators=base_models, final_estimator=LogisticRegression(), # 元学习器 cv=5, # 5折交叉验证防过拟合 n_jobs=-1 ) model.fit(X_train, y_train) print(f"Accuracy: {model.score(X_test, y_test):.4f}")
Wolpert 提出 Stacked Generalization,用元学习器融合多个基模型。
Leo Breiman 提出 Bootstrap Aggregating,通过有放回抽样降低方差。
Freund & Schapire 提出 AdaBoost,开创串行提升先河。
Breiman 将 Bagging 与随机特征选择结合,成为经典。
Friedman 将 Boosting 化为梯度下降优化,适用任意可微损失。
Tianqi Chen 开源 XGBoost,工程优化 + 算法创新,统治 Kaggle。
微软 & Yandex 推出 LightGBM 与 CatBoost,GBDT 家族走向巅峰。
表格数据、结构化数据的首选。XGBoost / LightGBM 在大多数 Kaggle 表格竞赛中表现优异。注意调参和防止过拟合。
Random Forest 训练快、调参少、天然支持并行。适合快速建立 baseline,或数据量较大时作为首选。
当 Boosting 和 Bagging 各自达到瓶颈时,Stacking 可以进一步榨取性能。适合 Kaggle 决赛圈或对精度要求极高的场景。
先用 Random Forest 建立 baseline → 再用 XGBoost/LightGBM 提升 → 最后用 Stacking 融合多个模型。这是工业界的标准流程。