Bagging 与 Boosting
Bagging 独立训练并平均以降低方差,Boosting 顺序纠错以降低偏差。
学习前需要掌握
背景与问题
两种方法都会组合多个学习器,表面都像“多棵树一起预测”。区别在于每个新模型是否依赖之前模型的错误,以及最终如何聚合;这会改变并行性、超参数关系和对噪声的反应。
概念定义
Bagging 在扰动后的训练样本上独立训练模型,通常平均概率或回归值;boosting 顺序添加模型,按当前加权错误或损失梯度修正旧集成。Bagging 常用于降低不稳定模型的方差,boosting 可逐步提高表达能力,但这不是严格的偏差方差二分保证。
直观理解
Bagging 像多人独立做完整试卷后汇总,boosting 像下一位专门接着修订上一份答案。前者需要意见有差异,后者依赖修订目标和步子是否合适。
核心原理
Bagging 各学习器的训练可较独立并行;boosting 的第 m 轮目标取决于前 m−1 轮,轮间通常顺序执行,但每轮内部仍可能并行。不能把“顺序依赖”说成算法内部任何操作都不能并行。
Bagging 的树可以较深,再用数量与随机性稳定预测;boosting 常限制单树容量,通过树数和学习率累加。实际模型仍可调整这些设计,不能只靠树深推断训练家族。
比较要固定相同的训练划分、调参预算和指标。含错标的少数样本可能被提升反复强调,森林也并非天然免疫噪声;应看误差分布与稳定性,不用一个小例子的均值给普适排名。
数学表达
两种不同聚合规则
左侧为回归平均,右侧为梯度提升加法;分类的概率与 margin 需按各模型定义处理。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1先用单树或简单业务规则建立基线。
- 2按任务边界预先固定验证折与主要指标。
- 3分别调节森林单树约束与提升的学习率、轮数。
- 4在相同折上比较均值、波动和训练预测成本。
代码对应位置
示例 1相同三折上比较两个完整构造数据基线:修复未定义的模型、X、y 和 cv;观测输出仅用于演示公平协议。
手算与场景核对
只看聚合算术:三个独立回归模型预测为 1、3、5,bagging 平均为 3。另一个提升模型初值为 1,两轮树输出分别为 1、−0.5,学习率为 0.2,最终为 1+0.2×1+0.2×(−0.5)=1.1。
这不是同一批训练结果的优劣比较,只说明模型之间的关系。下方代码另外在固定构造分类数据上使用相同三折验证,完整输出仅属于该协议。
计算与实现步骤
- 先用单树或简单业务规则建立基线。
- 按任务边界预先固定验证折与主要指标。
- 分别调节森林单树约束与提升的学习率、轮数。
- 在相同折上比较均值、波动和训练预测成本。
- 检查少数类、异常与噪声样本后再选择,最终测试只使用一次。
代码实现
示例 1
相同三折上比较两个完整构造数据基线
example_01.py用途:修复未定义的模型、X、y 和 cv;观测输出仅用于演示公平协议。
from sklearn.datasets import make_moons
from sklearn.ensemble import RandomForestClassifier, HistGradientBoostingClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score
X, y = make_moons(n_samples=180, noise=0.25, random_state=7)
cv = list(StratifiedKFold(n_splits=3, shuffle=True, random_state=7).split(X, y))
models = {
"forest": RandomForestClassifier(n_estimators=30, min_samples_leaf=2, random_state=7),
"boost": HistGradientBoostingClassifier(max_iter=30, max_leaf_nodes=5, random_state=7),
}
for name, model in models.items():
scores = cross_val_score(model, X, y, cv=cv, scoring="accuracy")
print(name + " folds=" + ",".join(f"{x:.4f}" for x in scores) + f" mean={scores.mean():.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
修复未定义的模型、X、y 和 cv;观测输出仅用于演示公平协议。
X- 完整特征矩阵,每行一个样本、每列一个特征。
y- 目标标签或连续目标值。
model- 组合预处理和估计器的模型对象。
mean- 训练特征逐列均值。
scores- 交叉验证各折的评价分数。
Step 1 · 1–3 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.datasets import make_moons
from sklearn.ensemble import RandomForestClassifier, HistGradientBoostingClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_scoreStep 2 · 5–13 行
只从训练数据逐列计算均值与标准差,对应标准化公式中的 μ 和 σ。
X, y = make_moons(n_samples=180, noise=0.25, random_state=7)
cv = list(StratifiedKFold(n_splits=3, shuffle=True, random_state=7).split(X, y))
models = {
"forest": RandomForestClassifier(n_estimators=30, min_samples_leaf=2, random_state=7),
"boost": HistGradientBoostingClassifier(max_iter=30, max_leaf_nodes=5, random_state=7),
}
for name, model in models.items():
scores = cross_val_score(model, X, y, cv=cv, scoring="accuracy")
print(name + " folds=" + ",".join(f"{x:.4f}" for x in scores) + f" mean={scores.mean():.4f}")代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
forest folds=0.9167,0.8833,0.8167 mean=0.8722 boost folds=0.9000,0.9333,0.8333 mean=0.8889
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 把 bagging 等同于永远低偏差、boosting 等同于永远低方差。
- 两个模型用不同折或不同调参预算,却直接比较分数。
- 将构造数据上的一次胜负说成算法普遍优劣。
实际应用
- 在表格任务里用森林和提升作为不同归纳偏好的候选基线。
- 诊断主要误差是否来自样本扰动、容量不足或持续噪声。
常见错误
- 把 bagging 等同于永远低偏差、boosting 等同于永远低方差。
- 两个模型用不同折或不同调参预算,却直接比较分数。
- 将构造数据上的一次胜负说成算法普遍优劣。
资料与假设
参见 scikit-learn:Ensemble methods。 本页数值均为构造例;涉及模型分数时仅说明给定数据与协议下的计算。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。