ML ML Learning Lab
14 / 14
第 14 步 · 多棵树投票的集成力量

随机森林Random Forest

多棵树投票 — Bootstrap + 随机特征 + 集成学习

10 分钟
阅读 + 实操
1 个
交互演示
中级
难度

随机森林 · 交互演示

森林规模0
OOB 准确率--
树的数量 10
最大深度 6

为什么学这步?

单棵决策树容易过拟合 — 它会记住训练数据里的噪声。随机森林用集成学习的思路破局:训练很多棵各有差异的树,再让它们投票表决。"各有差异"靠 Bootstrap 采样和随机特征子集保证。这是表格数据上最常用、最稳的基线模型之一,也是理解 Boosting、Stacking 等高级集成方法的基础。

📌 发生了什么

  • 每棵树用 Bootstrap 有放回采样得到不同的训练集(约 63% 数据)。
  • 每次分裂只考虑随机特征子集,增加树与树之间的差异性。
  • 分类投票、回归平均,集成多棵树降低方差,OOB 数据天然用于验证。

⚠️ 常见陷阱

  • 树越多一定越好?不是,OOB 准确率会趋于稳定(收益递减)。
  • 能预测训练范围之外的值?不能,森林无法外推。
  • 特征重要性一定可靠?不完全,相关特征的重要性会被分摊。

本章小结

  • Bootstrap 采样:每棵树用有放回采样得到不同的训练集。
  • 随机特征子集:每次分裂只看部分特征,增加多样性。
  • 集成思想:好而不同的模型组合,优于单一模型。

📐 Bagging 与方差降低

随机森林的核心是 Bagging(Bootstrap Aggregating):有放回采样生成多个训练集,训练多棵树后投票。

Bootstrap 使每棵树看到约 63.2% 的数据,剩余 36.8% 是袋外数据(OOB),天然用于验证:

Bagging 降低方差。N 棵独立树的方差为 σ²/N,但树间有相关性 ρ,实际方差为:

随机特征子集降低树间相关性 ρ。每次分裂只选 m = √d 个特征,让树"各有不同":

🎛 树的数量对比

树的数量是随机森林的核心超参数。增加树能降低方差,但收益递减。

树的数量 表现 结果
1 棵树 等价单棵决策树,高方差 过拟合
10 棵树 初步集成效果,方差仍偏高 不够
100 棵树 OOB 稳定,准确率高 推荐
1000 棵树 收益递减,OOB 不再提升 浪费算力

💡 树的数量不会过拟合(只增不减),但 max_depth 会。先固定树数=100,再调深度。

💻 Bootstrap 采样 + 随机特征选择

随机森林的核心:Bootstrap 采样 + 随机特征子集 + 多数投票(Python):

import math
import random

# Bootstrap 有放回采样
def bootstrap_sample(data, labels):
    n = len(data)
    sample = {'data': [], 'labels': [], 'oob_idx': []}
    picked = set()
    for _ in range(n):
        idx = random.randrange(n)
        sample['data'].append(data[idx])
        sample['labels'].append(labels[idx])
        picked.add(idx)
    # 记录未被采到的样本(OOB)
    for i in range(n):
        if i not in picked:
            sample['oob_idx'].append(i)
    return sample

# 随机特征子集:每次分裂只看 √d 个特征
def random_feature_subset(n_features):
    m = int(math.sqrt(n_features))
    idx = list(range(n_features))
    random.shuffle(idx)  # 打乱后取前 m 个
    return idx[:m]

# 随机森林预测:多数投票
def forest_predict(forest, x):
    votes = {}
    for tree in forest:
        pred = tree_predict(tree, x)
        votes[pred] = votes.get(pred, 0) + 1
    return max(votes.items(), key=lambda kv: kv[1])[0]

📚 参考文献与延伸阅读

  • Breiman, L. (2001). Random Forests. Machine Learning — 随机森林的奠基论文
  • Breiman, L. (1996). Bagging Predictors. Machine Learning — Bagging 方差降低的理论分析
  • scikit-learn: Random Forests — 工业实现与特征重要性
  • Wikipedia: Random forest — Bagging、OOB 与方差降低的数学推导

📝 课后练习

检验你的理解——答对为止