1. 引言:集成学习是什么
集成学习是机器学习中一类非常有效的策略,其核心思想是「三个臭皮匠,顶个诸葛亮」。通过组合多个基础模型(弱学习器)的预测结果,集成学习往往能获得比单个模型更优的泛化能力和稳定性。在众多集成方法中,Bagging和Boosting是最具代表性的两大流派,它们分别从「并行降低方差」和「串行降低偏差」两个角度出发,构建出强大的集成模型。
2.Bagging和Boosting理解前提:偏差与方差
模型的泛化误差可以分解为偏差与方差两部分:
偏差:模型平均预测和真实值之间的差距。反映模型本身的拟合能力。偏差高通常意味着欠拟合,模型过于简单,没有捕捉到数据中的规律。
方差:用不同训练集训练出的模型,预测结果波动有多大。反映模型对训练数据扰动的敏感程度。方差高通常意味着过拟合,模型记住了太多训练集中的噪声,换一批数据预测结果就大幅波动。
Bagging 与 Boosting 的分野,正对应着对这两种误差成分的不同侧重。
“预测求职者起薪” 举例 计算偏差和方差
背景:假设某位求职者按照真实规律,起薪应是8千元。为了看清概念,暂时忽略现实中的随机因素。用同一种算法、同样的设置,换三批训练数据,分别训练三个模型,再预测这同一个人。
| 训练时用的数据 | 对同一个人的预测 |
|---|---|
| 第一批 | 4千元 |
| 第二批 | 5千元 |
| 第三批 | 6千元 |
注意:人没换,算法没换,换的是训练数据。
偏差如何计算?先看平均预测离真实规律多远
先算这三个模型的平均预测:
真实规律给出的值是8,所以:
−3表示:平均来看,这种方法低估了3千元。
做误差分解时,通常用的是“偏差的平方”:
因此,偏差关心的是:把训练数据变化的影响平均掉以后,模型还偏不偏。偏差是模型预测中的“系统性偏离”。
方差怎么算?看预测围绕自己的平均值晃得多厉害
三个预测是4、5、6,它们自己的平均值是5。分别计算每次预测离这个平均值多远:
| 预测 | 减去平均预测5 | 差值平方 |
|---|---|---|
| 4 | −1 | 1 |
| 5 | 0 | 0 |
| 6 | 1 | 1 |
把平方差求平均:
这里减的是平均预测5,而不是实际的8。
方差是模型对训练数据变化的敏感程度。
这是两者最关键的区别:
- 算偏差:平均预测与真实规律比较。
- 算方差:每次预测与平均预测比较。
什么?你不会还不懂吧?
好吧,那我们把抽象的东西具体化,好好告诉你一下什么是方差、什么是偏差。
我们假设,你有一把尺子。
假如说,尺子的刻度没有那么精确,离正确刻度差多少,这个就叫偏差。随便你去测量什么,尺子对于正确的值始终是有偏离的。比如你这把尺子每米少正确刻度3cm,你测你的身高,就会低了一些;你测其他人的身高,也会按比例低一些。
偏差:是尺子本身每米少3cm,属于系统性偏离。你不管什么时候测、测谁,它都会稳定地让你测小一点。
那么你在使用尺子的时候,在不同环境下使用可能得到不同结果,这个结果的波动程度就叫方差。比如某个周日下午阳光明媚,你测量了一下你的臂围,38cm,真不赖。晚上你喝了点酒,大半夜11点12点了,也不开个灯,迷迷糊糊地又测量了你的臂围,结果这次读成36cm,下次又读成40cm,跟下午的38cm也对不上。
方差:是你晚上喝了酒、没开灯、手抖、看错刻度,导致每次测出来的数忽高忽低、不稳定。这个波动的程度,就是方差。
3. 相关概念:集成学习中出现的那些名词
- 弱学习器:指那些仅比随机猜测略好的模型,例如深度很浅的决策树。
- 偏差(Bias):衡量模型预测值与真实值之间的系统性偏离,高偏差通常意味着模型过于简单、欠拟合。
- 方差(Variance):衡量模型对训练数据波动的敏感程度,高方差通常意味着模型过于复杂、过拟合。
- 集成策略:如何组合多个弱学习器的输出,常见方式包括投票法、平均法和加权组合。
4. Bagging 思想(并行 · 降方差)
4.1 核心原理
Bagging(Bootstrap Aggregating,自助采样聚合):主要想让容易波动的模型更稳定。
核心思想是「并行训练、投票决策」,Bagging 的核心操作是“有放回重采样 + 并行训练 + 聚合”。
给定训练集 D(大小为 n),Bagging执行以下步骤:
Bootstrap 采样:从 D 中有放回地随机抽取 nn 个样本,得到一个与原始集大小相同的子集 Dj。重复 m 次,得到 m 个训练子集。每个子集约包含原始数据中约63.2%的不重复样本。
并行训练基学习器:在每个 Dj上独立训练一个基模型 hj。基学习器通常选择高方差、低偏差的模型(如深度很深甚至不剪枝的决策树),因为 Bagging 要“消耗”的正是方差。
聚合输出:分类任务用投票,回归任务用平均,得到最终预测。
简单理解一下:Bagging思想,多个基学习器预测相互独立,改变模型对于真实规律的距离较小,但是多个基学习器训练数据是从总训练集中随机有放回抽取的,所以多个基学习器的训练集是既有交集又有差集的,训练出的结果相当于受到相同的噪音+不同噪音的影响,最后聚合输出,降低了模型对训练数据变化的敏感程度,所以说Bagging思想的收益是降低方差来的。
- 单棵深树可能因为训练数据略有变化,就长出很不同的结构。Bagging让多棵树分别学习,再合并意见,使部分波动互相抵消,因此通常说它主要降低方差。树之间越相似,能抵消的波动往往越有限。
- 由于每个基学习器只看到训练集的一部分样本,它们各自会存在一定的偏差和噪声,但通过平均或投票,这些随机误差会相互抵消,从而显著降低模型的方差,有效缓解过拟合问题。
- 为什么能降方差?如果 m 个基模型的预测是相互独立的,取平均后方差会降到原来的约 1/m。Bootstrap 样本之间并非完全独立,因此实际降幅达不到这个理论值,但在实践中仍然非常有效。Bagging 在平均意义上不改变偏差,它的收益几乎全部来自方差的压缩
4.2 算法流程
Bagging 的典型流程可以概括为以下步骤:
- 从原始训练集中有放回地随机抽取 n 个样本,生成一个新的子训练集。
- 重复上述采样过程 m 次,得到 m 个不同的子训练集。
- 在每个子训练集上独立训练一个基学习器。对于新的预测样本,让所有基学习器分别预测,然后通过投票(分类)或平均(回归)得到最终结果。
4.3 代表算法:随机森林
随机森林是 Bagging 最著名的代表算法。它在 Bagging 的基础上进一步引入了「特征随机选择」机制:在构建每棵决策树时,每次分裂只从全部特征中随机选取一个子集进行最优划分。这种双重随机性进一步降低了树与树之间的相关性,使得集成模型的方差更小、泛化能力更强。
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100, max_features="sqrt", random_state=42) model.fit(X_train, y_train) y_pred = model.predict(X_test)5. Boosting 思想(串行逐渐纠错 · 降偏差)
5.1 核心原理
Boosting:让后面的模型继续学习前面没学好的地方,逐步改进整体预测。
Boosting(提升)的核心思想是「串行训练、逐步纠错」。与 Bagging 并行训练不同,Boosting 按顺序训练一系列基学习器,每个新的基学习器都重点关注前一个学习器犯错的样本,从而逐步降低整体模型的偏差。最终将所有基学习器加权组合,得到一个强学习器。
与 Bagging 的“各自学习,再合意见”相比,Boosting 的后一轮训练需要参考前面已经取得的结果,因此各轮之间有先后依赖。
Boosting的核心操作:「先训练一个模型 → 找到当前不足 → 训练下一个模型来补 → 累积预测」。
给定训练集 D,Boosting 通常执行以下步骤:
- 训练第一个基学习器:先学习数据中的一部分规律,得到初步预测。
- 找出当前模型的不足:判断哪些样本没有处理好,或者预测还差多少。
- 训练下一个基学习器:让新模型重点学习这些不足。
- 累积模型输出:按照各模型的系数或学习率合并预测,再继续下一轮,最终得到整体模型。
Boosting 更关注于「难样本」:每一轮训练都会调整样本权重,预测对了:权重下降,预测错了权重提升,让之前被分错的样本在下一轮获得更高的权重,从而迫使新模型更关注这些困难样本。
简单理解一下:Boosting思想每次使用的都是全量的训练集去训练基学习器,对于不同数据集合对于模型的影响改变基本不大,每次训练都是找出上一个基学习器的不足进行加权二次训练,但是对于模型整体的整体预测的系统偏离,多轮迭代进行优化,所以说Boosting思想的收益是降低偏差来的。
4.2 算法流程
Boosting 的典型流程可以概括为以下步骤:
- 初始化所有训练样本的权重为均匀分布。
- 在当前样本权重下训练一个基学习器。
- 根据该学习器的错误率调整样本权重:被分错的样本权重增大,被分对的样本权重减小。
- 重复上述过程,直到达到预设的迭代次数。
- 将所有基学习器按其准确率加权组合,得到最终模型。
4.3 代表算法:AdaBoost 与 GBDT
AdaBoost 是最早的 Boosting 算法之一,它通过调整样本权重来串行训练弱学习器,并按错误率分配模型权重。而 GBDT(梯度提升决策树)则从梯度下降的角度出发,每一轮拟合前一轮预测的负梯度(残差),逐步逼近真实目标。
from sklearn.ensemble import GradientBoostingClassifier model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, random_state=42) model.fit(X_train, y_train) y_pred = model.predict(X_test)6. Bagging 与 Boosting 的对比
| 对比维度 | Bagging | Boosting |
|---|---|---|
| 训练方式 | 并行训练,各基学习器相互独立 | 串行训练,后一个依赖前一个的结果 |
| 主要目标 | 降低方差,缓解过拟合 | 降低偏差,提升拟合能力 |
| 样本使用 | 有放回随机采样,各子集独立 | 全部样本参与,但权重动态调整 |
| 基学习器要求 | 可并行训练,对弱学习器要求不高 | 通常要求弱学习器略优于随机猜测 |
| 对噪声敏感度 | 对噪声和异常值较稳健 | 对噪声和异常值较敏感 |
| 代表算法 | 随机森林 | AdaBoost、GBDT、XGBoost |
7. 如何选择
在实际项目中,选择 Bagging 还是 Boosting,需要结合数据特点与业务需求:
- 如果训练数据噪声较多、存在异常值,且希望模型更稳健,优先考虑 Bagging(如随机森林)。
- 如果数据质量较高、希望追求极致的预测精度,且能接受更长的训练时间,Boosting(如 XGBoost、LightGBM)通常是更好的选择。
- 如果特征维度很高,随机森林的特征随机选择机制能有效降低过拟合风险。
- 如果对训练速度有较高要求,Bagging 的并行特性更适合大规模数据。