随机森林是一种集成学习算法,通过构建多个决策树并综合其预测结果来提升模型性能与稳定性。
是由 Leo Breiman 在 2001 年提出的一类基于树的集成学习方法(ensemble of decision trees)。核心思想是通过构建大量互相独立但结构相似的决策树,并将它们的预测进行 投票或平均,以降低方差、提高泛化能力。通常用于分类与回归问题,也有许多扩展(排序、概率估计、分位数回归、因果推断等)
1. 数据随机:采用Bootstrap抽样法,从原始数据集中随机抽取多个子数据集,每个子数据集对应训练一棵决策树。
2. 特征随机:每棵决策树在分裂节点时,从全部特征中随机选取部分特征作为候选分裂特征,降低单棵树的过拟合风险。
3. 投票集成:分类任务中通过多数投票确定最终预测类别,回归任务中取多棵树预测结果的平均值作为输出。
- 决策树(CART)单棵树有很强的拟合能力但方差高(容易对训练集过拟合)。
- 集成(bagging + 随机特征选择)用“平均”来降低方差。关键是让每棵树间的相关性尽可能低(decorrelation),否则平均的效果受限。
- 随机森林通过两类随机化来做到这一点:
- - 1. 自助采样(bootstrap):每棵树在训练时用有放回抽样得到的样本子集(大约 63.2% 的样本会出现在该子集里, ~36.8% 是 OOB)。
- - 2. 随机特征选择(feature bagging):在每个分裂节点只从全部特征中随机抽取 $m$ 个特征(mtry)来寻找最优切分,而不是在全部特征中找最优切分。
- 结果:每棵树虽然偏向无约束的深树(通常不剪枝),但树之间差异大,平均后方差显著下降。
回归 对每棵树预测取平均
* $(\hat y)$
最终的预测值(随机森林整体的输出)。
* $(T)$
随机森林中 决策树$(tree)$的数量。
例如 100 棵树、500 棵树。
* $(t = 1,2,\dots,T)$
每一棵树的编号。
* $(\hat y^{(t)}(x))$
第 $(t)$ 棵树对输入样本 $(x)$ 给出的预测结果。
* 如果是回归模型 → 这是一个实数。
* 如果是分类模型 → 这是一个类别标签。
* $(\sum_{t=1}^T)$
对所有树的预测进行求和。
* $(\frac{1}{T})$
取平均(即“多数树投票”在回归中的连续版本)。
--------------------------------------------------------------------------------
分类(硬投票)多数票
* $(\hat y)$
随机森林最终预测的 类别(class)。
* $(c)$
所有可能的类别中的某一个类别(如 0–9,或 A/B/C…)。
* $(\arg\max_c)$
找到让后面表达式最大的那个类别 (c)。
* $(\hat y^{(t)}(x))$
第 $(t)$ 棵树对样本 $(x)$ 的分类结果(一个类别标记)。
* $(1{\hat y^{(t)}(x)=c})$
指示函数:
* 若第 $(t)$ 棵树预测的类别 = ($c)$,则值为 1;
* 否则值为 0。
* $(\sum_{t=1}^T 1{\cdot})$
统计有多少棵树把 (x) 判为类别 (c)。
→ 最终选择 票数最多 的类别作为预测结果。
--------------------------------------------------------------------------------
分类(软投票/概率):(平均各树预测的类概率)
* $(\hat p(c|x))$
随机森林对类别 $(c)$ 的 最终预测概率。
* $(T)$
随机森林中树的数量。
* $(p^{(t)}(c \mid x))$
第 $(t)$ 棵树对样本 $(x)$ 输出的类别 $(c)$ 的概率。
* 决策树叶节点通常给出该叶样本的类别比例 → 即一个概率。
* $(\sum_{t=1}^T)$
对所有树的概率进行相加。
* $(\frac{1}{T})$
对概率取平均,得到随机森林的最终概率估计。
→ 这是用于 概率输出、排序、Top-k 分类 以及你模型中的集成投票权重计算。
--------------------------------------------------------------------------------
| 参数名 | 描述 | 值范围 | 默认值 | 建议值 |
|---|---|---|---|---|
| n_estimators | 树的数量 | 50-200 | 100 | 100 |
| max_depth | 单棵树最大深度 | 3-20 | 6 | 6 |
随机森林是一种 集成学习(Ensemble Learning) 方法,本质是:
> 大量决策树 + 随机采样 + 多数投票(分类)或平均(回归)。
它的目标是减少单棵树容易产生的过拟合,让整体模型更稳定。
---
📌 机制 1:数据随机采样(Bootstrap Sampling)
假设你有 1000 条训练数据
随机森林会对每棵树 重复随机抽取(有放回) 一批数据,例如:
第 1 棵树抽样:800 条
第 2 棵树抽样:780 条
第 3 棵树抽样:820 条
……
每棵树看到的数据都不一样 → 树之间天然有差异。
---
📌 机制 2:特征随机选择(Feature Subset Randomness)
构建每个节点时,不会看全部特征,而是随机挑:
例如有 10 个特征,每次只看其中 3 个。
效果:
每棵树关注的特征不同
不容易全部“学一样的东西”
进一步降低“过拟合”
---
📌 机制 3:多棵树独立学习
森林 = 多棵树,每棵树自己训练,自己做判断。
树越多 → 越稳定。
常见数量:100、200、500。
---
📌 机制 4:投票或平均(最终输出)
分类
多数派投票,例如:
树 预测
-------- ----
第 1 棵树 3
第 2 棵树 3
第 3 棵树 5
最终预测为 3。
回归
直接取平均
鲁棒性强,对异常值和噪声不敏感,不易过拟合。
能处理高维数据,无需复杂的特征预处理,且可评估特征重要性。
训练过程并行化程度高,效率优于许多复杂模型。
# 优势(Strengths)
- 对输入特征尺度不敏感(无需归一化)。
- 能自动建模非线性关系与高阶交互(无需事先指定交互项)。
- 对缺失值/异常值相对稳健(某些实现支持 surrogate split)。
- 内置 OOB 估计,无需单独验证集(节约数据)。
- 容易并行化、快速上手(少量超参即能得到不错表现)。
- 适用于分类/回归、多输出任务以及概率估计(软投票)。
# 局限与注意事项(Weaknesses)
- 可解释性差:虽然可给出特征重要性/部分依赖图,但整体模型不如单棵树或线性模型直观。
- 对类别高基数变量与多取值变量的偏好**:MDI 类型重要性会偏好取值多的变量。
- 概率校准问题:RF 输出概率并不总是校准的(可用 Platt scaling 或 isotonic calibration 修正)。
- 预测/模型体积大:大量树会导致模型文件很大、预测慢(尤其在实时场景)。
- 对外推(extrapolation)能力弱:回归时对训练数据范围之外的点不能可靠外推。
- 当特征非常多且 mostly irrelevant 时:随机森林的效果会下降(噪声特征会增加树间相关,导致需要更多树或更强的特征选择)。
数字:
236、366、599、688、122
希望预测一个 “下一次值 = ?(比如第 5 位数)”
完整流程逻辑(不涉及彩票,只是模型流程演示)
---
🔥 第 1 步:构造特征(X)和标签(Y)
假设我们做 下一位数字预测(时间序列窗口 1 → 1)
输入 X(本期) 输出 Y(下期)
------------ ------------
236 366
366 599
599 688
688 122
最后一个 122 没有下一个 → 不能算标签。
---
🔥 第 2 步:将数字拆分为特征(重要!随机森林不能直接处理整体数字)
常见方法:拆为 3 个特征:
数字 H T U
--- - - -
236 2 3 6
366 3 6 6
599 5 9 9
688 6 8 8
标签也拆:
下期数字 H' T' U'
---- -- -- --
366 3 6 6
599 5 9 9
688 6 8 8
122 1 2 2
通常会训练 3 个模型:
预测百位(H')
预测十位(T')
预测个位(U')
每个模型都是一个随机森林。
---
🔥 第 3 步:训练 3 个随机森林模型
例:
RF_H ← 预测下期百位
RF_T ← 预测下期十位
RF_U ← 预测下期个位
每个模型内部是:
100 多棵树
每棵树随机看不同的数据 & 特征
最后多数投票
---
🔥 第 4 步:输入 “122” 预测下一次
将 122 拆成:
H=1, T=2, U=2
分别放入 3 个模型:
RF_H(1,2,2) → 多棵树预测
假设 100 棵树投票结果:
百位预测 投票数
---- ---
1 12
3 9
5 28
6 51
多数票:6
---
RF_T(1,2,2) → 投票
十位预测 投票数
---- ---
2 15
6 10
8 75
多数票:8
---
RF_U(1,2,2) → 投票
个预测 数量
--- --
2 20
6 18
8 62
多数票:8
---
⭐ 最终预测组合 = 688
(这只是 “逻辑示例”,并不是预测真实结果)
---
🎯 为什么常常会预测成类似 688、599 这种“见过的数字”?
随机森林是基于历史数据的模式学习:
输入特征(1,2,2)和训练集最接近的样本是 688
所以树的 voting 更容易 leaning 到它
---
📌 总结(非常关键)
随机森林预测流程就是:
1. 抽取数据 → 每棵树不同
2. 随机特征选择 → 每棵树关注点不同
3. 多棵树独立学习
4. 百十个位分别训练
5. 输入数据 → 所有树投票
6. 组合输出
无