随机森林是一种经典的集成学习算法,属于Bagging类型,由多棵决策树构成,其核心思想是 “三个臭皮匠,顶个诸葛亮” 。
通过构建多个弱学习器(决策树),并将它们的结果综合起来(分类问题用投票法,回归问题用平均法),从而获得一个更强大、更稳定、更精确的模型。
决策树是一种基于树形结构的机器学习算法,可用于分类和回归任务,模拟人类在面临决策时的思考过程:通过提出一系列是/否问题,逐步对数据进行细分,最终得到一个结论,这个学习过程就是通过分析训练数据,自动构建出一系列这样的“if-then”规则。
类比:就像玩“20个问题”游戏:“是动物吗?” -> “是哺乳动物吗?” -> “是猫科动物吗?” -> “是猫吗?”,每个问题都将可能性范围缩小,直到找到答案。
熵源自信息论,表示随机变量的不确定性或混乱程度,熵越大,不确定性越高。 公式:对于一个数据集 D 中的第 k 类样本所占比例为 p_k,则数据集 D 的熵定义为:

表示使用某个特征 A 对数据集 D 进行分割后,熵减少的程度(即不确定性降低的程度),信息增益越大,意味着用这个特征分裂后,纯度提升得越多,公式:

决策:在选择分裂特征时,选择能带来最大信息增益的那个特征(即纯度提升最大的特征)。
另一种衡量数据不纯度的指标,直观上,表示从数据集中随机抽取两个样本,其类别标签不一致的概率,基尼系数越小,纯度越高,公式:

决策:与信息增益类似,计算用每个特征分裂后的基尼系数加权和,选择那个能使加权基尼系数最小的特征(即纯度提升最大的特征)。
随机森林为了确保构建的每棵树都有差异性,从而提升模型的泛化能力,引入了两大随机性,通过引入这两种随机性,随机森林成功地创造了多棵多样且略有不同的决策树,虽然单棵树可能因为剪枝不够而过拟合,但多棵树通过“平均”或“投票”机制,可以相互抵消掉各自的过拟合部分,从而得到一个更加稳健和通用的模型。
从原始训练集中使用有放回抽样随机抽取n个样本,形成一个子训练集,由于是有放回抽样,原始训练集中有些样本可能被多次抽取,而有些样本可能从未被抽到。大约有 1 - 1/e ≈ 36.8% 的样本不会被抽到,这部分数据被称为 袋外数据(Out-of-Bag, OOB),OOB数据可以用来评估模型性能,无需单独划分验证集。
在构建决策树的每个分裂节点时,不是从全部特征中选择最优特征,而是先随机从所有特征中选取一个特征子集,然后从这个更小的特征子集中选择最优特征进行分裂。这种做法进一步增强了树与树之间的独立性,打破了特征间的关联,使得模型更能抵抗过拟合。
决策树构建的核心在于,如何选择每个节点上要问的“最佳问题”(即用哪个特征进行分裂), 这个“最佳”的衡量标准就是信息增益和基尼系数,目标都是让分裂后的子集尽可能“纯”,即同一类别的样本尽可能地分到同一个分支里。以分类问题为例,随机森林的构建过程如下:
算法 | 类型 | 优点 | 缺点 |
|---|---|---|---|
随机森林 | 集成学习 | 精度高,抗过拟合,处理混合特征 | 黑箱模型,速度慢,内存大 |
梯度提升树 | 集成学习 | 精度通常最高,效率高 | 参数多调参复杂,更容易过拟合 |
支持向量机 | 单一模型 | 在高维空间表现好,理论漂亮 | 对参数和核函数敏感,大数据训练慢 |
逻辑回归/线性回归 | 单一模型 | 可解释性强,速度快 | 难以捕捉复杂非线性关系,精度有限 |
总结来说,随机森林是一个强大、稳健且易于使用的“开箱即用”算法。它通过构建多棵决策并引入随机性,有效提升了模型的泛化能力和精度,使其成为机器学习领域不可或缺的工具之一。
使用一个非常经典的微型数据集,根据天气状况决定是否进行户外跑步。
特征 (X):
目标 (y): 是否跑步:是、否
训练数据集 (共14个样本):
序号 | 天气 | 温度 | 湿度 | 有风 | 跑步 |
|---|---|---|---|---|---|
D1 | 晴天 | 热 | 高 | 无 | 否 |
D2 | 晴天 | 热 | 高 | 有 | 否 |
D3 | 阴天 | 热 | 高 | 无 | 是 |
D4 | 下雨 | 中 | 高 | 无 | 是 |
D5 | 下雨 | 冷 | 正常 | 无 | 是 |
D6 | 下雨 | 冷 | 正常 | 有 | 否 |
D7 | 阴天 | 冷 | 正常 | 有 | 是 |
D8 | 晴天 | 中 | 高 | 无 | 否 |
D9 | 晴天 | 冷 | 正常 | 无 | 是 |
D10 | 下雨 | 中 | 正常 | 无 | 是 |
D11 | 晴天 | 中 | 正常 | 有 | 是 |
D12 | 阴天 | 中 | 高 | 有 | 是 |
D13 | 阴天 | 热 | 正常 | 无 | 是 |
D14 | 下雨 | 中 | 高 | 有 | 否 |
任务:训练一个由 3棵决策树 组成的随机森林,来预测在新的天气条件下是否应该去跑步。
随机森林的核心是 有放回抽样 和 随机特征选择,将构建3棵树(Tree1, Tree2, Tree3),本文详细展示构建 Tree1的过程,Tree2 和 Tree3 的构建流程完全相同,只是基于它们自己的训练集。
从原始数据集中有放回地随机抽取14次,形成每个树自己的训练集。
Tree1 的 训练集:
随机抽到的天数序列是:[D1, D3, D4, D5, D6, D6, D7, D8, D9, D10, D11, D12, D13, D14],其中D6 被抽到了两次,D2 没有被抽到,D2将成为 Tree1 的 OOB(袋外)数据,可用于后续验证。
Tree2 的 训练集: 随机抽到的序列:[D2, D2, D3, D4, D5, D7, D8, D9, D10, D11, D12, D13, D14, D14],其中D2、D14被抽到两次,D1, D6 是OOB数据。
Tree3 的 训练集:
假设抽到的序列:[D1, D2, D3, D3, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14],D3被抽两次,D4 是OOB数据。
我们使用 CART算法 和 基尼系数作为分裂标准。
Tree1 的根节点包含了它所有样本:D1, D3, D4, D5, D6, D6, D7, D8, D9, D10, D11, D12, D13, D14 (共14个样本)。
目标值的分布:
跑步(是): D3, D4, D5, D7, D9, D10, D11, D12, D13 (9个) 跑步(否): D1, D6, D6, D8, D14 (5个)

现在需要尝试所有特征的所有可能分裂方式,找到最佳分裂特征。随机森林在每个节点分裂时,可以随机选择一个特征子集,本次从4个特征中随机选择 √4 = 2 个特征,选到的两个特征是 天气和 湿度,在这两个特征中找最佳分裂点。
A. 计算按天气特征分裂的基尼系数
天气有3个取值:晴天,阴天,下雨




B. 计算按特征湿度分裂的基尼系数
湿度有2个取值:高、正常



C. 选择根节点的最佳分裂特征
天气带来的纯度提升远大于湿度,因此根节点选择 天气作为分裂特征,根节点的分裂结果:
上述分裂后,晴天和下雨分支还需要继续分裂,流程与根节点完全相同:
对于晴天节点,随机选择2个特征(比如 温度 和 有风),计算这两个特征分裂后的加权基尼系数,选择增益最大的特征进行分裂,重复此过程,直到满足停止条件(如节点纯度达到100%、节点样本数小于预设值、达到最大深度等)。
假设我们继续这个过程,最终得到一颗完整的 Tree1:
完全重复 第1步到第3步 的过程:
使用 Tree2 的 数据集 (D2,D2, D3, D4, D5, D7, D8, D9, D10, D11, D12, D13, D14, D14),在每个节点随机选择特征子集,使用基尼系数选择最佳分裂点,生成一颗可能完全不同的决策树 Tree2。
同理,生成 Tree3。
最终,我们得到3颗不同的决策树,组成一个“森林”。
新的样本:天气=晴天,温度=冷,湿度=高,有风=否,要预测是否应该去跑步,让森林里的每棵树都进行投票:
1. Tree1 预测:
2. Tree2 预测:
3. Tree3 预测:
最终投票结果:不跑步 (2票) vs 跑步(1票)
通过这个手推示例,我们可以清晰地看到随机森林的工作原理:
这种“集思广益”的机制,有效降低了单颗决策树容易过拟合的风险,使得随机森林成为一个非常强大且稳定的模型。这个手算过程虽然繁琐,但彻底揭示了其内部机制。在实际应用中,计算机构建拥有几百棵树的森林也只是瞬间之事。