随机森林的原理是什么?它的「随机」体现在哪里?
简化版
随机森林(Random Forest) 是 Bagging + 决策树 + 特征随机 的集成模型:并行训练很多棵决策树,预测时分类多数投票、回归取平均。它的「随机」有两重:① 样本随机(Bagging)——每棵树用自助采样(有放回抽样)得到的不同训练子集;② 特征随机——每棵树的每个节点分裂时,只从随机选出的一部分特征里挑最优分裂(而非全部特征)。这两重随机让每棵树各不相同、错误不相关,从而在投票平均后大幅降低方差、提升泛化。单棵树可以长满不剪枝(靠集成消化方差)。它稳、易用、抗过拟合,还能给出特征重要性和 OOB 估计。
详细版
算法流程:
for i in 1..N: # 训练 N 棵树
Dᵢ = 从训练集自助采样(有放回) # ① 样本随机
在 Dᵢ 上训练一棵决策树:
每个节点分裂时: 从全部特征随机选 m 个 # ② 特征随机
只在这 m 个里选最优分裂
通常长满、不剪枝
预测: 分类→N 棵树多数投票; 回归→N 棵树均值
两重随机(关键):
| 随机来源 | 做法 | 作用 |
|---|---|---|
| 样本随机 | 每棵树用 bootstrap 子集 | 降低树间相关性 |
| 特征随机 | 每次分裂只看 m 个随机特征 | 进一步去相关,防某强特征主导所有树 |
- 特征数 m 常取
√总特征数(分类)或总数/3(回归)。
为什么强: 两重随机 → 树之间去相关 → 投票平均后方差大降(这是随机森林比单纯 Bagging 更强的关键)。
附带能力: OOB(袋外)误差估计(免费的验证)、特征重要性。
完整版教学
一、随机森林 = Bagging + 决策树 + 特征随机
随机森林建立在 Bagging 之上:并行训练很多棵决策树、预测时投票/平均。但它比普通 Bagging 多了一步特征随机,正是这一步让它成为最成功的集成模型之一。
它专门解决决策树的痛点——单棵树高方差、易过拟合。思路是:训练一大片「各不相同」的树,让它们的错误互相抵消。而要让树「各不相同」,随机森林用了两重随机。
二、第一重随机:样本随机(Bagging / Bootstrap)
每棵树不是用全部训练数据,而是用自助采样(bootstrap) 得到的子集:从 N 个样本中有放回地随机抽 N 次,得到一个大小为 N 但有重复、且约36.8% 样本没被抽到的子集。
- 每棵树看到的数据都不一样 → 树与树之间产生差异(多样性)。
- 没被抽到的约 36.8% 样本叫袋外样本(OOB),可以拿来做免费的验证(见第五节)。
(为什么是约 36.8%?某样本一次不被抽中的概率是 (1-1/N),N 次都不中约为 (1-1/N)^N → 1/e ≈ 0.368。)
三、第二重随机:特征随机(随机森林的精髓)
这是随机森林区别于普通 Bagging 的关键。普通 Bagging 的每棵树在分裂时都从全部特征里选最优,结果是——如果存在一个很强的特征,几乎每棵树都会优先用它来分裂,导致所有树长得很像、错误高度相关,投票平均的降方差效果大打折扣。
随机森林的解法:每个节点分裂时,先从全部特征里随机抽出 m 个特征(子集),只在这 m 个里选最优分裂。
- 这样强特征不会每次都被选到,其他特征有机会主导某些分裂 → 树与树之间进一步去相关、更加多样。
- m 是关键超参数,常用经验值:分类
m ≈ √总特征数,回归m ≈ 总特征数/3。m 小→树更随机更去相关(方差更低但单树偏差可能升),m 大→树更像。
「去相关」是随机森林降方差的核心:Bagging 平均降方差的效果,取决于树之间有多独立;树越去相关,平均后方差降得越多。特征随机就是为了让树尽量去相关。
四、为什么两重随机能降方差——直觉
n 个模型平均后的方差,不仅和单模型方差 σ² 有关,还和它们之间的相关系数 ρ 有关:
平均后方差 ≈ ρσ² + (1-ρ)σ²/n
- n(树数)越大,第二项越小。
- 但只要 ρ(树间相关)不为 0,第一项
ρσ²就是方差下降的天花板。 - 要突破这个天花板,就得降低 ρ——这正是特征随机的作用:让树去相关、ρ 变小,方差才能进一步降下来。
所以随机森林 = 用两重随机把树去相关,再靠平均把方差压到很低。单棵树可以长满不剪枝(高方差没关系,集成会消化掉),偏差还保持得低。
五、附带的好处:OOB 估计与特征重要性
- OOB(袋外)误差:每个样本约有 36.8% 的树没在训练中用到它,用「没见过它的那些树」来预测它、统计误差,就得到一个几乎免费的、类似交叉验证的泛化估计,不必额外划验证集。
- 特征重要性:随机森林能输出特征重要性(基于不纯度下降 MDI 或置换重要性),用于特征选择和解释(注意 MDI 偏向高基数特征,详见特征重要性专题)。
六、优缺点
优点:在许多表格任务上具有较强的非线性建模能力,多树平均通常比单树稳定;各树训练可并行,常规数值特征通常不需缩放,还可提供 OOB 估计和特征重要性。所谓“混合特征”取决于实现:若库不原生支持类别特征,仍需先做一致的编码。
缺点:可解释性不如单棵树(一片树的集体决策难解释)、模型大、预测比单树慢、对极高维稀疏数据(如文本)不如线性模型、外推能力弱(回归不能超训练范围)、遇到强噪声特征多时 m 需调。
随机森林并非天然免疫过拟合:严重标签噪声、极小叶节点、数据泄漏或不当验证仍会得到乐观结果。树数、max_features、叶节点最小样本数和类别权重应结合 OOB 或交叉验证选择;同时要把模型体积、预测延迟和概率校准纳入工程评价。
七、常见追问
- 树越多越好吗? 固定数据、超参数与随机树生成机制时,增加树数通常减少有限棵平均的随机波动并趋于稳定,但收益递减且训练、内存、推理成本上升;验证指标不要求逐棵单调改善。
- 随机森林会过拟合吗? 会。平均能显著缓解单树方差,却不能消除泄漏、标签噪声、偏置特征或不合适的叶大小;增加树数主要降低集成的蒙特卡洛波动,不等于修复这些问题。
- 和 GBDT 区别? 随机森林是 Bagging(并行、降方差、独立树、可不剪枝);GBDT 是 Boosting(串行、降偏差、纠错、浅树)(详见对比专题)。
- m 取多少? 分类 √p、回归 p/3 是经验起点,可调。m 越小越随机、树越去相关。
八、用 0.632/0.368 算清 OOB 来源
从 N 个样本有放回抽 N 次,某个样本一次都没被抽中的概率是 (1-1/N)^N,N 很大时趋近 e^-1≈0.368。因此一棵树的 Bootstrap 样本大约覆盖 63.2% 的不同训练样本,其余约 36.8% 可作为该树的 OOB 样本。对某样本做 OOB 预测时,只聚合没有抽到它的那些树。
P(not selected) = (1 - 1/N)^N -> e^-1 ~= 0.368
P(selected at least once) ~= 0.632
Var(forest) depends on both tree variance and inter-tree correlation
| 对象/方案 | 核心机制 | 选择或风险 |
|---|---|---|
| 样本随机 | 每棵树 Bootstrap | 制造数据差异并提供 OOB |
| 特征随机 | 每个节点只看候选特征子集 | 降低强特征导致的树间相关 |
| 聚合 | 分类投票/概率平均,回归平均 | 降低方差 |
重复 B 次:Bootstrap → 节点随机候选特征 → 深树
↓
聚合预测 + OOB 评估
记忆钩子:随机森林的第二个随机发生在“每个节点选候选特征”,不是只在建树前永久抽一组特征。
九、常见误区与追问
- 误区:每棵树只看一次固定的随机特征子集。 经典随机森林在每个节点重新抽候选特征。
- 误区:OOB 预测使用了所有树。 只使用训练时没抽到该样本的树。
- 追问:为什么不把单树强剪枝? 常让单树保持较低偏差,再靠去相关平均控制方差,但仍可限制叶样本。
- 追问:OOB 能完全替代交叉验证吗? 它是高效内部估计,但小数据、复杂调参和分组/时间切分仍应使用合适验证。
- 追问:特征候选数越小越好吗? 太小会降低相关性,也可能让单树过弱,需要验证平衡。
十、加强记忆
随机森林 = Bagging + 决策树 + 特征随机,并行训练多棵树、分类投票/回归平均。两重随机是精髓:① 样本随机——每棵树用自助采样子集(约 63% 样本,剩 36.8% 为 OOB);② 特征随机——每个节点分裂只从随机 m 个特征里选最优(分类 √p、回归 p/3)。两重随机让树去相关,而平均后方差 ≈ρσ²+(1-ρ)σ²/n,降低树间相关 ρ 才能把方差压过天花板——这就是特征随机比普通 Bagging 更强的原因。单树可长满不剪枝(靠集成消化方差)。附赠 OOB 免费验证和特征重要性。优点是准、稳、抗过拟合、易用、可并行;缺点是可解释性弱、模型大、不能外推。