382 lines
18 KiB
Markdown
382 lines
18 KiB
Markdown
# 第十五章
|
||
|
||
## 1. 随机森林的定义:从“树”到“森林”
|
||
|
||
**随机森林(Random Forest, RF)** 是一种基于**集成学习(Ensemble Learning)**思想的算法。它通过构建大量的**决策树(Decision Trees)**,并将它们的预测结果进行结合,从而得到一个比单一决策树更准确、更鲁棒的模型。
|
||
|
||
- **分类任务**:采用“投票法”(Majority Voting),即少数服从多数。
|
||
|
||
- **回归任务**:采用“均值法”(Averaging),即取所有树输出的平均值。
|
||
|
||
|
||
其核心思想可以用一句话概括:**“集思广益,博采众长”**。单棵决策树容易过拟合(死记硬背训练数据),但如果有一群各不相同的树,它们犯错的方向各不相同,互相抵消后,整体的误差就会大幅降低。
|
||
|
||
---
|
||
|
||
## 2. 随机森林的算法细节:核心是“随机”
|
||
|
||
随机森林之所以强大,关键在于其**双重随机性**,这确保了森林中的每一棵树都是“独立且多样”的。
|
||
|
||
### A. 数据的随机:Bootstrap Sampling(自助采样法)
|
||
|
||
随机森林并不是把所有数据都喂给每一棵树。它使用一种叫 **Bagging (Bootstrap Aggregating)** 的技术:
|
||
|
||
1. 如果训练集有 $N$ 个样本,每棵树都会从这 $N$ 个样本中**有放回地**随机抽取 $N$ 个样本。
|
||
|
||
2. 在这个过程中,大约有 $36.8\%$ 的数据不会被抽到,这些数据被称为 **袋外数据(Out-of-Bag, OOB)**。
|
||
|
||
3. OOB 数据非常重要,它们可以直接用来测试模型性能,无需额外的交叉验证。
|
||
|
||
|
||
### B. 特征的随机:Feature Subsetting
|
||
|
||
这是随机森林区别于普通 Bagging 算法的关键:
|
||
|
||
1. 在决策树分裂节点时,它不会考虑所有的特征(属性)。
|
||
|
||
2. 它会先从总共 $M$ 个特征中随机选择 $m$ 个特征(通常 $m = \sqrt{M}$)。
|
||
|
||
3. 只在这 $m$ 个特征中寻找最优的分裂点。
|
||
|
||
|
||
### C. 为什么需要这两重随机?
|
||
|
||
如果每棵树都看同样的数据、同样的特征,它们长出来的样子会非常接近。**随机性的引入是为了降低树与树之间的“相关性”**。森林里的树越多样,抵御噪声和过拟合的能力就越强。
|
||
|
||
---
|
||
|
||
## 3. 随机森林的深度分析:优缺点与评估
|
||
|
||
### 核心优势
|
||
|
||
- **极高的准确率**:在大多数数据集上,随机森林的基准表现都非常稳健。
|
||
|
||
- **抗过拟合能力强**:由于集成的力量,它比单棵树更难陷入过拟合。
|
||
|
||
- **能够处理高维数据**:可以处理成千上万个输入变量,且不需要降维(PCA)。
|
||
|
||
- **自带特征重要性评估**:它能告诉你在预测过程中,哪些变量起到了关键作用。
|
||
|
||
- **对缺失值不敏感**:能够自动处理缺失数据并维持较高的精度。
|
||
|
||
|
||
### 潜在缺点
|
||
|
||
- **黑盒属性**:虽然单棵决策树很容易解释,但几百棵树组成的森林很难直观地展示逻辑过程。
|
||
|
||
- **计算开销**:在处理超大规模数据或需要极低延迟的推理场景时,它比逻辑回归等线性模型要慢。
|
||
|
||
- **回归限制**:在回归问题中,它无法预测超出训练集取值范围的数据(不具备外推能力)。
|
||
|
||
|
||
### 性能评估指标
|
||
|
||
1. **OOB Error (袋外错误率)**:利用没参加训练的 OOB 数据进行自我评估,是泛化误差的无偏估计。
|
||
|
||
2. **Gini Importance / Mean Decrease Impurity**:衡量特征对降低模型不确定性的贡献度。
|
||
|
||
|
||
---
|
||
|
||
## 4. 应用场景与实践
|
||
|
||
随机森林由于其“开箱即用”的特性,被广泛应用于各行各业:
|
||
|
||
- **金融领域**:信用评分、反欺诈检测(通过分析交易模式识别异常)。
|
||
|
||
- **医疗领域**:通过患者的各项指标(血压、血糖、基因数据)预测疾病风险。
|
||
|
||
- **电商领域**:用户流失预测、推荐系统。
|
||
|
||
- **工业制造**:预测设备的剩余寿命或故障概率。
|
||
|
||
|
||
### 总结
|
||
|
||
随机森林是机器学习工具箱里的“瑞士军刀”:**简单、全能、高效**。它不需要复杂的参数调优(通常默认参数效果就不错),也不需要复杂的特征缩放(对量纲不敏感),是任何数据科学项目首选的基准模型之一。
|
||
|
||
---
|
||
|
||
你的直觉非常敏锐。把决策树理解为“自动门控分段函数”**是一个极具数学洞察力的视角。在这种视角下,随机森林本质上就是**多个分段函数的非线性组合(加权平均或投票)。
|
||
|
||
为了彻底理清它们的关系,我们可以从**函数形式**、**方差-偏差权衡**以及**决策边界**三个维度来深度对比。
|
||
|
||
---
|
||
|
||
## 1. 结构关系:基石与建筑
|
||
|
||
简单来说,决策树是**原子单元**,随机森林是**有机整体**。
|
||
|
||
- **决策树(Base Learner)**:是森林中的单一基学习器。它通过递归地将特征空间切分为一个个不重叠的“矩形”区域,并在每个区域内给出一个预测值。
|
||
|
||
- **随机森林(Ensemble)**:是将多棵树通过 **Bagging** 逻辑组合起来。这里的核心公式可以表达为:
|
||
|
||
$$F(x) = \frac{1}{T} \sum_{t=1}^{T} f_t(x)$$
|
||
|
||
其中 $f_t(x)$ 就是你提到的“分段函数”。
|
||
|
||
|
||
---
|
||
|
||
## 2. 核心区别:分段函数的精细度 vs. 稳定性
|
||
|
||
### A. 拟合方式:分段 vs. 平滑
|
||
|
||
- **单棵树**:是一个**阶梯状的硬分段函数**。由于它强行在某个阈值(如 $x > 5$)处切开,它的预测曲线在切分点处是断裂的、不连续的。这导致它对噪声极其敏感——数据稍微一变,切分点就可能大跳水。
|
||
|
||
- **随机森林**:通过对大量阶梯函数求平均,将原来“生硬”的阶梯**平滑化**了。虽然宏观上它依然是分段的,但每一段的边界由成百上千棵树共同决定,这使得模型对局部噪声的容错率极高。
|
||
|
||
|
||
### B. 统计学本质:偏差(Bias)与方差(Variance)
|
||
|
||
这是机器学习中最经典的对比:
|
||
|
||
- **决策树(高方差,低偏差)**:一棵不受限的树可以生长得极其复杂,直到完美契合每一个训练样本(低偏差),但这会导致它在遇到新数据时表现很差(高方差/过拟合)。
|
||
|
||
- **随机森林(低方差,低偏差)**:随机森林通过“随机采样”让每棵树学到的东西都不一样。当你把这些树平均起来时,单棵树的“错误偏见”会被其他树抵消掉,从而显著**降低了方差**,同时保持了接近单棵树的低偏差。
|
||
|
||
|
||
---
|
||
|
||
## 3. 为什么说它是“自动门控”?
|
||
|
||
你提到的“门控”概念在决策树中体现为 **IF-THEN 逻辑门**:
|
||
|
||
1. **自动性**:树利用“信息增益”或“基尼系数”自动寻找最优的切分特征和切分点。它在每个节点都在问:“走左边还是走右边?”这就是一个硬门控。
|
||
|
||
2. **分段性**:它将输入空间 $\mathbb{R}^d$ 划分成 $M$ 个区域 $R_1, R_2, \dots, R_M$。在每个区域 $R_m$ 内,函数值 $c_m$ 是常数。
|
||
|
||
$$f(x) = \sum_{m=1}^{M} c_m I(x \in R_m)$$
|
||
|
||
_注:$I$ 是指示函数。_
|
||
|
||
|
||
**随机森林的区别在于:**
|
||
|
||
它不再是“一个”大的门控开关,而是由几百个“小门控开关”并行运作。最终结果不是由一个开关决定,而是由所有开关的**群体决策**产生。
|
||
|
||
---
|
||
|
||
## 4. 对比总结表
|
||
|
||
|**特性**|**决策树 (Decision Tree)**|**随机森林 (Random Forest)**|
|
||
|---|---|---|
|
||
|**函数形态**|单一的、粗糙的硬分段函数|复合的、趋向平滑的分段函数|
|
||
|**解释性**|极高(白盒),可以画出流程图|较低(黑盒),难以追踪每一条路径|
|
||
|**稳定性**|差,数据微调可能导致结构剧变|极强,抗噪声能力出色|
|
||
|**训练速度**|极快|较慢(但支持多核并行,因为树之间独立)|
|
||
|**主要目标**|寻找特征间的非线性切分|通过集成降低过拟合,提高泛化能力|
|
||
|
||
**一句话总结:**
|
||
|
||
你的理解非常到位,已经抓住了集成学习中两大流派的精髓!
|
||
|
||
你提到的这种“每棵树都在凑上一棵树的差值”的逻辑,正是 **Boosting(提升法)** 的核心机制。我们可以把 **Bagging(随机森林为代表)** 和 **Boosting(以 GBDT、XGBoost 为代表)** 放在一起做一个极简的对比:
|
||
|
||
---
|
||
|
||
### 1. Bagging:并行的“民主投票”
|
||
|
||
**(你说的:通过随机分配样本得到多数据支持)**
|
||
|
||
- **逻辑:** 它是**并行**的关系。每一棵树都是独立的,大家“平起平坐”。
|
||
|
||
- **做法:** 像你说的,利用 **Bootstrap(自助采样)** 给每棵树分配不同的数据子集。每棵树都尽力去学习一个完整的、复杂的模型。
|
||
|
||
- **目的:** 这里的每棵树可能都有点“主见”(方差大),但通过把所有树的结果平均一下,那些随机的错误就互相抵消了。
|
||
|
||
- **总结:** 解决的是“不稳定”**的问题,即降低**方差(Variance)。
|
||
|
||
|
||
---
|
||
|
||
### 2. Boosting:串行的“接力补位”
|
||
|
||
**(你说的:每棵树凑上一棵树的差值)**
|
||
|
||
- **逻辑:** 它是**串行**的关系。树与树之间有严格的先后顺序,后来的树是前面的“补丁”。
|
||
|
||
- **做法:**
|
||
|
||
1. 第一棵树先预测一个粗略的结果。
|
||
|
||
2. 计算预测值和真实值之间的**残差(Residual)**,也就是你说的“差值”。
|
||
|
||
3. 第二棵树不再预测原始目标,而是专门去**预测这个残差**。
|
||
|
||
4. 以此类推,每一棵新树都在努力修补前面所有树留下的“遗憾”。
|
||
|
||
- **目的:** 每一棵树往往都很简单(弱模型),但通过不断的接力,模型会越来越准。
|
||
|
||
- **总结:** 解决的是“预测不准”**的问题,即降低**偏差(Bias)。
|
||
|
||
|
||
---
|
||
|
||
### 3. 形象的比喻
|
||
|
||
为了让你印象更深,我们可以用“做卷子”来比喻:
|
||
|
||
- **Bagging (随机森林)**:
|
||
|
||
就像考试前,班里有 100 个学生。老师给每个学生发了一份**稍微有点区别**的复习资料(随机样本+随机特征)。考试时,大家各做各的,最后把所有人的答案收上来。针对选择题,哪个选项选的人多就填哪个。这样即便有几个学生看错题了,也不会影响大局。
|
||
|
||
- **Boosting (GBDT/XGBoost)**:
|
||
|
||
就像是一个**顶级学霸在迭代**。他先做了一遍卷子,发现自己错了 10 分(差值)。于是他第二次专门研究这 10 分的错题,把错题补上了。但由于补了错题,可能又引发了 2 分的新小错,于是他第三次又去攻克这 2 分。经过多次“凑差值”,最后他的答案近乎完美。
|
||
|
||
|
||
---
|
||
|
||
### 补充一个专业术语:残差(Residual)
|
||
|
||
你提到的“预测方差”或“预测差值”,在算法里专业术语叫 **残差 (Residual)**。
|
||
|
||
- 在 **梯度提升树 (GBDT)** 中,这种“凑差值”的过程其实是在沿着**梯度的负方向**下降。
|
||
|
||
- 而在著名的 **AdaBoost** 中,它不是凑差值,而是给上一棵树做错的样本“加权重”,让下一棵树重点关注那些“难啃的骨头”。
|
||
|
||
|
||
**总结一下:**
|
||
|
||
- **Bagging** 是靠“人多”,让结果更稳(随机采样是关键)。
|
||
|
||
- **Boosting** 是靠“迭代”,让结果更准(凑差值是关键)。
|
||
|
||
|
||
你的直觉完全正确!这种把复杂算法拆解成“自动门控”和“接力凑差值”的思维方式,非常符合计算机科学中对模型本质的理解。
|
||
|
||
---
|
||
|
||
你的直觉非常准确,那个神秘的数字 **36.8%** 确实来自于数学常数 $1/e$。
|
||
|
||
### 1. 36.8% 是怎么推导出来的?
|
||
|
||
在随机森林的 **Bootstrap(自助采样)** 过程中,假设我们的原始数据集有 $N$ 个样本。每一棵树在构建时,我们都会进行 $N$ 次“有放回”的随机抽取。
|
||
|
||
对于某个特定的样本,在**每一次**抽取中:
|
||
|
||
- 它被抽中的概率是 $\frac{1}{N}$。
|
||
|
||
- 它**没有**被抽中的概率是 $1 - \frac{1}{N}$。
|
||
|
||
|
||
那么,经过 $N$ 次独立抽取后,这个样本**一次都没有被抽中**的概率就是:
|
||
|
||
$$P = (1 - \frac{1}{N})^N$$
|
||
|
||
当样本量 $N$ 趋于无穷大时,根据高等数学中的重要极限公式:
|
||
|
||
$$\lim_{N \to \infty} (1 - \frac{1}{N})^N = \frac{1}{e} \approx 0.367879... \approx 36.8\%$$
|
||
|
||
这意味着,大约有 **36.8%** 的数据在训练某棵特定树时是“隐身”的。这些数据就是 **袋外数据(Out-of-Bag, OOB)**。
|
||
|
||
---
|
||
|
||
### 2. 为什么随机森林表现得这么好?
|
||
|
||
随机森林之所以能成为机器学习中的“常青树”,核心在于它巧妙地平衡了**个体能力**与**群体多样性**。
|
||
|
||
#### A. 误差分解的胜利(Variance Reduction)
|
||
|
||
在机器学习中,泛化误差 = **偏差(Bias)** + **方差(Variance)** + 噪声。
|
||
|
||
- **决策树**:如果长得太深,偏差很低(能拟合复杂规律),但方差很高(换个数据集结果就变了)。
|
||
|
||
- **随机森林**:通过集成(Averaging),它能在保持低偏差的同时,极大地削减方差。数学上可以证明,当树与树之间的相关性越低,森林整体的方差就越小。
|
||
|
||
|
||
#### B. 两次随机化的“去相关性”
|
||
|
||
如果所有的树都长得差不多,集成也就失去了意义。随机森林通过两层“护城河”确保树的多样性:
|
||
|
||
1. **样本随机(Bootstrap)**:每棵树看的数据不一样(虽然有重叠)。
|
||
|
||
2. **特征随机(Feature Space Splitting)**:在每个节点分裂时,只允许从随机挑选的几个特征中选最好的。
|
||
|
||
> 想象一下:如果你总是让最强的特征(比如“性别”)作为根节点,那所有树的第一步都一样。随机森林强迫某些树不准看这个“最强特征”,逼着它们去挖掘其他潜在的、微弱但有用的信号。
|
||
|
||
|
||
#### C. 自带“内部测试集” (OOB Evaluation)
|
||
|
||
因为有那 36.8% 的数据没参与训练,所以每一棵树都有自己专属的“验证集”。
|
||
|
||
- 你可以直接用 OOB 数据来评估模型的泛化能力,甚至不需要再做繁琐的交叉验证(Cross-Validation)。
|
||
|
||
- 这就像是你在复习时,总有 1/3 的题目你没见过,这能非常真实地反映你考试时的状态。
|
||
|
||
|
||
#### D. 特征重要性分析
|
||
|
||
随机森林不仅给结果,还能给理由。通过观察某个特征在被加入噪声后,OOB 准确率下降了多少,我们可以精准地判断哪些特征才是真正的“大腿”。
|
||
|
||
### 总结
|
||
|
||
随机森林的成功在于它是一个“极其稳健的民主系统”**。它利用那 **36.8%** 的留白提供了自我检查的机会,通过**双重随机化打破了单棵树的偏见,最终通过“大数定律”抹平了由于数据噪声带来的波动。
|
||
|
||
这种“大力出奇迹”的并行集成思路,使其在处理非线性、高维、含有缺失值的数据时,依然是目前工业界最可靠的基准模型之一。
|
||
|
||
---
|
||
|
||
没错!你一针见血地指出了它的分类学地位:**随机森林(Random Forest)就是 Bagging 算法最成功、最典型的进化版。**
|
||
|
||
你说“不断的进行协同”,这个“协同”**在 Bagging 里体现为一种**“并行的集体智慧”。
|
||
|
||
为了让你更透彻地理解这种“协同”机制,我们可以把 Bagging 的协同过程拆解为三个动作:**独立生长、互补、民主表决**。
|
||
|
||
### 1. 协同的第一步:独立生长(Independent Breeding)
|
||
|
||
Bagging 的核心在于“并行”。
|
||
|
||
- 在协同之前,每个基学习器(决策树)都是在自己的小世界里(那 $1 - 36.8\%$ 的样本空间)独立长大的。
|
||
|
||
- 这种独立性至关重要。如果大家天天在一起讨论(相关性高),最后得出的意见就会惊人地一致,那就不是协同,而是“集体偏见”了。
|
||
|
||
|
||
### 2. 协同的核心:去相关性(De-correlation)
|
||
|
||
普通的 Bagging(比如用逻辑回归做基学习器)只是在样本上做文章。
|
||
|
||
**随机森林之所以是“Bagging 的顶配版”**,是因为它在协同上多走了一步:**特征随机选择**。
|
||
|
||
- 它让树与树之间不仅看的数据不同,连观察世界的“视角”(特征)都不同。
|
||
|
||
- 有的树是通过“财务指标”看公司的,有的树是被迫通过“员工满意度”看公司的。这种**强制性的差异化**,是高水平协同的前提。
|
||
|
||
|
||
### 3. 协同的结果:投票/平均(Aggregating)
|
||
|
||
这是“协同”发挥威力的时刻。Bagging 的全称是 **B**ootstrap **Aggregating**,这个 **Aggregating** 就是协同的收网阶段:
|
||
|
||
- **消除离群值(Noise Cancellation)**:假设有一棵树被某个异常点误导了,给出了离谱的预测。在协同系统中,由于其他 99 棵树没有被这个点干扰,通过投票或平均,那个离谱的预测会被轻易地“淹没”掉。
|
||
|
||
- **填补认知盲区**:每棵树因为只看了部分数据和部分特征,都有自己的“盲区”。但 100 棵树协同起来,就覆盖了完整的特征空间和样本空间。
|
||
|
||
|
||
---
|
||
|
||
### 简单对比你提到的两个“协同”方式:
|
||
|
||
- **Bagging 的协同(随机森林)**:
|
||
|
||
- **方式**:**并行的求和/平均**。
|
||
|
||
- **潜台词**: “我不知道谁是对的,但我相信大家的平均意见是最稳的。”
|
||
|
||
- **侧重点**: 强调**多样性**,靠消除**方差**来协同。
|
||
|
||
- **Boosting 的协同(GBDT/XGBoost)**:
|
||
|
||
- **方式**:**串行的误差修正**。
|
||
|
||
- **潜台词**: “我知道你哪里做错了,我来帮你把这部分错改过来。”
|
||
|
||
- **侧重点**: 强调**迭代**,靠消除**偏差**来协同。
|
||
|
||
|
||
**总结:**
|
||
|
||
你说得非常对,随机森林就是通过 **Bootstrap** 采样创造差异,再通过 **Aggregating** 实现协同。这种协同不是互相学习(那是 Boosting),而是**互相制衡、取长补短**,从而让整体表现远超任何一个孤立的个体。
|
||
|
||
---
|