4. Bagging原理:Bootstrap采样、降低方差、随机森林的核心思想
各位同学,咱们今天聊聊Bagging。说实话,这是集成学习里我最喜欢的一个分支——不是因为它的数学多漂亮,而是因为它真的「皮实耐用」。我在做环境预测项目时,十次里有七八次都会先用Bagging试试水。
Bagging的全称是Bootstrap Aggregating,翻译过来就是「自助聚合」。名字有点拗口,但核心思想特别简单:用多个弱模型投票,比单个模型更靠谱。你想想看,一个人判断天气可能出错,但十个气象员一起投票,准确率是不是高多了?
4.1 Bootstrap采样:从一份数据变出N份
Bagging的第一步,就是Bootstrap采样。这玩意儿说白了就是「有放回地随机抽样」。
假设我们有一份环境监测数据,里面有1000个样本。我每次从里面随机抽一个,记下来,然后放回去。重复1000次,就得到一份新的「自助样本」。这份新样本里,有些原始数据会出现多次,有些一次都没出现——这很正常。
关键点:每次Bootstrap采样,大约会有63.2%的原始数据被抽到,剩下的36.8%没被抽到。这些没被抽到的数据,我们叫它「袋外数据」(Out-of-Bag,简称OOB)。
为什么要用Bootstrap?我个人的理解是:它制造了「多样性」。每个子模型看到的数据都不完全一样,这样它们学到的「偏见」就不同。当这些有偏见的模型投票时,偏见互相抵消,最终结果反而更准。
我在做PM2.5浓度预测时遇到过一个问题:原始数据里有一天出现了极端污染事件,如果只用一份训练集,模型很容易被这个异常值带偏。但用了Bootstrap采样后,有些子模型没抽到那个异常值,它们的预测就「拉」了回来。这就是Bagging的魅力。
4.2 降低方差:为什么Bagging能稳定预测
咱们先搞清楚一个概念:模型的误差来自哪里?
- 偏差(Bias):模型对真实关系的拟合能力。偏差高,就是欠拟合。
- 方差(Variance):模型对训练数据变化的敏感度。方差高,就是过拟合。
Bagging主要干的事,就是降低方差。
为什么会这样?我打个比方。你一个人做决策,可能今天心情好就选A,明天心情差就选B——这就是高方差。但如果你找100个人投票,每个人的心情波动互相抵消,最终结果就稳定多了。
数学上也有解释。假设我们有T个独立的基模型,每个模型的方差都是σ²。那么这些模型平均后的方差是σ²/T。但问题是,基模型之间不可能完全独立——它们用的数据都是从同一份原始数据里Bootstrap出来的。所以实际方差降低的效果,会比σ²/T差一些,但依然显著。
我的经验:Bagging对「高方差、低偏差」的模型效果最好。比如决策树(深度大、不剪枝的那种),单棵树方差极高,但Bagging后能大幅降低。相反,对线性回归这种低方差的模型,Bagging的提升有限。
4.3 随机森林:Bagging的终极进化
随机森林,说白了就是「Bagging + 决策树 + 随机特征选择」。它是我在环境预测项目里用得最多的算法,没有之一。
核心思想就两点:
- 样本随机:用Bootstrap采样生成不同的训练子集。
- 特征随机:在每个节点分裂时,只随机选择一部分特征来考虑最佳分裂点。
为什么要加特征随机?你想啊,如果所有树都用全部特征,那它们学出来的结构会非常相似——说白了就是「同质化」。同质化的模型投票,效果还不如一个强模型。特征随机保证了每棵树都「各有所长」,有的擅长看温度,有的擅长看湿度,投票时才能互补。
随机森林的标准流程:
- 从原始数据中Bootstrap采样N次,生成N个训练子集。
- 对每个子集,训练一棵决策树(不剪枝,让它长到最深)。
- 在每个节点分裂时,从全部M个特征中随机选m个(通常m = √M 或 log₂M)。
- 重复步骤1-3,生成N棵树。
- 预测时,分类问题用投票,回归问题用平均。
我曾经用随机森林预测某河流的溶解氧浓度。原始数据有温度、pH、浊度、氨氮等20多个特征。如果只用单棵决策树,R²只有0.65左右。换成随机森林(500棵树),R²直接跳到0.89。嗯,这就是集成的力量。
4.4 袋外数据:免费的验证集
前面提到,每次Bootstrap采样会有约36.8%的数据没被抽到。这些数据有个妙用——作为验证集。
具体做法是:对每个样本,找到所有没用到它训练的树,用这些树对它做预测。然后汇总所有样本的预测结果,计算误差。这个误差就是「袋外误差」(OOB Error)。
避坑指南:我曾经犯过一个错误——在随机森林训练完后,又单独划分验证集来调参。后来发现,OOB误差和验证集误差几乎一致。所以现在我的习惯是:直接用OOB误差来评估模型,省下来的验证集数据可以加入训练,进一步提升精度。
4.5 核心逻辑框架图
下面这张图,是我自己总结的Bagging核心逻辑。你看一遍,应该就能把整个流程串起来。
4.6 什么时候该用Bagging?
根据我的项目经验,以下场景特别适合Bagging:
| 场景 | 推荐程度 | 原因 |
|---|---|---|
| 数据量中等(几千到几万条) | ⭐⭐⭐⭐⭐ | Bootstrap能充分利用数据,OOB误差可靠 |
| 特征维度高(几十到几百个) | ⭐⭐⭐⭐⭐ | 随机特征选择能有效避免过拟合 |
| 基模型是决策树 | ⭐⭐⭐⭐⭐ | 决策树高方差,Bagging降方差效果显著 |
| 数据有噪声或异常值 | ⭐⭐⭐⭐ | 多个模型投票能「拉回」异常影响 |
| 需要特征重要性排序 | ⭐⭐⭐⭐ | 随机森林天然支持特征重要性评估 |
| 数据量极大(百万级以上) | ⭐⭐⭐ | 训练N棵树计算量大,可考虑用XGBoost替代 |
注意:Bagging不是万能的。如果你的基模型本身偏差就很高(比如线性模型),Bagging也救不了。这时候应该先考虑提升模型复杂度,或者换用Boosting方法。
好了,关于Bagging的原理就聊到这儿。核心就三句话:Bootstrap采样制造多样性,投票/平均降低方差,随机森林是Bagging的最佳实践。下一节咱们会动手写代码,把这些理论落到实处。
公众号:蓝海资料掘金营,微信deep3321