第十篇:随机森林——用多棵树解决过拟合的魔法

前面我们讲了决策树,它直观、易理解,但有一个很明显的问题:容易过拟合

过拟合的意思就是:模型在训练集上几乎完美,但在新数据上表现不佳。
因为一棵树会把训练集里的每一个小波动、噪声甚至偶然规律都记住,泛化能力就差。

随机森林(Random Forest)就是为了解决这个问题而出现的。


1. 随机森林的直观思路

你可以把随机森林想象成:

“不要只问一棵树的意见,问一群树,然后让它们投票决定结果。”

每一棵树都是一颗单独的决策树,可能结构不同,可能看到了不同的训练数据或特征。
当你预测一个新样本时:

  • 每棵树给一个预测结果
  • 最后多数票决定最终结果

这就像在现实生活中,遇到不确定的事情时,你问多个人意见,再综合判断。


2. 为什么随机森林不容易过拟合

随机森林解决过拟合,靠两件事:

1)随机采样训练数据(Bagging)

每棵树训练时,并不是用全部训练数据,而是从训练集中随机抽取一部分样本(有放回)。

  • 这叫 Bootstrap 采样
  • 每棵树都看到略有不同的数据
  • 这样训练出来的树不会完全相同,也不会同时记住训练集里的所有噪声

2)随机选择特征

在分裂每个节点时,每棵树不会看所有特征,而是随机挑选一部分特征来找最优分裂

  • 避免某个特别强的特征主导所有树
  • 增加每棵树之间的多样性
  • 最终组合时,多样性帮助减少过拟合

这两种随机性结合起来,就是“随机森林”名字的由来。


3. 随机森林和单棵决策树的区别

特性 单棵决策树 随机森林
是否容易过拟合
训练速度 慢(多棵树)
预测速度 较慢(每棵树都预测)
可解释性 较低(单棵树容易解释,但整体不容易)
处理非线性 可以 可以,且更稳健
对异常值敏感 低(多树投票抵消)

可以看到,随机森林就是用多棵树集体投票来弥补单棵树的缺点。


4. Python 示例:建立随机森林分类器

延续前面学生考试的数据,我们来看看随机森林是怎么做预测的:

import numpy as np
from sklearn.ensemble import RandomForestClassifier

# 特征:每天学习时长、作业完成率、是否参加辅导班
X_train = np.array([
    [2, 50, 0],
    [3, 60, 0],
    [4, 65, 0],
    [5, 70, 1],
    [6, 75, 1],
    [7, 80, 1]
])
y_train = np.array([0, 0, 0, 1, 1, 1])

# 新样本
X_test = np.array([
    [3.5, 62, 0],
    [6.5, 78, 1]
])

# 建立随机森林
rf = RandomForestClassifier(n_estimators=100, max_depth=3, random_state=42)
rf.fit(X_train, y_train)

# 预测
y_pred = rf.predict(X_test)
print("预测结果:", y_pred)

# 每棵树的投票结果
print("每棵树预测结果:")
for i, tree in enumerate(rf.estimators_[:5], 1):  # 只打印前5棵
    print(f"树{i}: {tree.predict(X_test)}")

在这里插入图片描述

说明

  • n_estimators=100 表示随机森林里有 100 棵树
  • 每棵树都是在随机抽样的训练数据和随机特征上建立的
  • max_depth=3 限制每棵树的深度,避免单棵树过拟合
  • 预测时每棵树给一个结果,最终采用多数票

即便某些单棵树预测错误,最终结果通常更稳健。


5. 随机森林的优缺点

优点

  • 不容易过拟合,泛化能力强
  • 可以处理数值和类别混合特征
  • 对异常值和噪声不太敏感
  • 不需要太多特征工程,模型自带特征选择能力

缺点

  • 可解释性差(很难像单棵决策树那样画出来分析决策路径)
  • 预测速度比单棵树慢
  • 占用内存大,尤其训练数据和树数量多的时候

6. 随机森林调参的重点

如果你要优化随机森林性能,可以关注几个主要参数:

  • n_estimators:树的数量

    • 多树通常更稳定,但训练和预测更慢
  • max_depth:限制树深度

    • 控制单棵树过拟合
  • min_samples_leaf:每个叶子最少样本数

    • 防止树分裂太细
  • max_features:分裂时随机选择的特征数量

    • 提高树的多样性

通常使用验证集或者交叉验证来挑选这些参数。


7. 为什么随机森林很适合做基线模型

在真实项目里,很多数据科学家会先用随机森林做一个基线模型:

  • 数据不用做太复杂的预处理
  • 不用担心特征尺度
  • 对异常值和噪声相对稳健
  • 预测准确率通常不错

基于这个基线,再考虑是否用梯度提升树或神经网络进一步优化。


8. 总结:为什么它叫“随机森林”

名字很形象:

  • 随机:随机抽样样本 + 随机抽特征
  • 森林:多棵树集体投票

你可以理解成:多棵树互相制衡,投票决定最终结果

相比单棵树,随机森林:

  • 泛化能力更强
  • 不容易被个别噪声点影响
  • 能处理更复杂的数据分布

如果你掌握了 KNN、单棵决策树,再理解随机森林,你就已经建立了分类任务从局部投票到条件分裂,再到集成学习的完整逻辑

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐