MCM520 ← 资料站首页 随机森林 · 深度手册 打开交互阅读器 →

随机森林 · 深度手册

分类:机器学习 | 难度:★★★ 高阶 | 编号:rf

一、这是什么(一句话用途)

分类 / 回归、特征重要性、缺失值填补(高鲁棒、开箱即用)

二、核心思想

随机森林是集成学习的代表:它训练很多棵决策树,每棵都在有放回随机抽样的训练子集(Bootstrap)上学习,且每次分裂只在随机抽样的若干特征里选最优分割。两个"随机"让各树差异大、相关性低,再对它们的预测做多数投票(分类)或平均(回归)。单棵决策树容易过拟合、对训练数据抖动敏感;而多棵树平均后方差大幅下降、鲁棒性骤增,且能天然给出特征重要性。它几乎不用调参就很强,是建模竞赛里的"baseline 之王"。

三、数学原理与推导

设森林有 TT 棵树,第 tt 棵树在自助样本上得到预测 ht(x)h_t(\mathbf{x})。最终

y^rf={mode{ht(x)}t=1T,分类1T∑t=1Tht(x),回归 \hat{y}_{\text{rf}}=\begin{cases}\text{mode}\{h_t(\mathbf{x})\}_{t=1}^T, & \text{分类}\\[4pt]\dfrac{1}{T}\sum_{t=1}^T h_t(\mathbf{x}), & \text{回归}\end{cases}

特征重要性(不纯度下降平均):分裂时特征 jj 带来的不纯度(如基尼)减少量,在所有树、所有含 jj 的节点上加权平均:

Impj=1T∑t=1T∑v:用 j 分裂的节点NvNΔGv \text{Imp}_j=\frac{1}{T}\sum_{t=1}^T\sum_{v:\text{用 }j\text{ 分裂的节点}}\frac{N_v}{N}\Delta G_v

包外误差(OOB):约 1/3 未抽中的样本可当验证集,免去额外划分。

四、建模 / 求解步骤

  1. 有放回抽样(Bootstrap)建子树训练集
  2. 每节点随机选部分特征再分裂
  3. 长成多棵不剪枝决策树
  4. 预测投票/平均
  5. 看特征重要性 / OOB 误差

五、关键公式速查

输出=多树投票(分类)或平均(回归);重要性=基尼下降加权平均

六、典型示例

100 棵树的森林对 3 类鸢尾花投票,得稳健分类与特征排名。

完整算例(数字演示,照着算一遍)

场景:100 棵树,每棵用 bootstrap 样本 + 随机 √p 特征,对 10 特征分类。

结果:OOB 误差≈4%,特征重要性:'凹度'>'周长'>'纹理'。

结论:RF 通过集成降低方差,给出特征重要性排序。

七、Python 实现示例

import os, numpy as np
import pandas as pd
HERE = os.path.dirname(os.path.abspath(__file__))
df = pd.read_csv(os.path.join(HERE,"..","datasets","rf.csv"))
X = df[["x1","x2","x3","x4"]].to_numpy(dtype=float); y = df["label"].to_numpy(dtype=float)
X = (X-X.mean(0))/X.std(0)
rng = np.random.default_rng(11)
def best_split(Xb, yb):
    best = (0, 0, 0.5, 0.5)
    for f in rng.choice(4, 2, replace=False):
        for t in np.unique(Xb[:, f]):
            m = Xb[:, f] <= t
            if 2 <= m.sum() <= len(m)-2:
                lv, rv = yb[m].mean(), yb[~m].mean()
                if abs(lv-rv) > abs(best[2]-best[3]):
                    best = (f, t, lv, rv)
    return best
trees = []
for _ in range(30):
    idx = rng.choice(len(X), len(X), replace=True)
    trees.append(best_split(X[idx], y[idx]))
pred = np.array([np.where(X[:, t[0]] <= t[1], t[2], t[3]) for t in trees]).mean(0)
final = (pred >= 0.5).astype(int)
print("随机森林(30 棵桩树) 准确率=%.3f" % ((final==y).mean()))

配套文件:py_rf.py(需 numpy / pandas;与下方数据集配套练习)

八、MATLAB 实现示例

%% 随机森林(袋装桩树)示例(MATLAB/Octave)
df = readtable('..\datasets\rf.csv');
X = table2array(df(:,1:4)); y = table2array(df(:,5));
X = (X-mean(X,1))./std(X,1); rng(11);
N=30; votes=zeros(height(X),1);
for t=1:N
  idx = randsample(height(X), height(X)); Xb=X(idx,:); yb=y(idx);
  bestf=1; bestt=0; bestlv=0.5; bestrv=0.5; bestsc=0;
  feats = randperm(4,2);
  for fi=1:2
    f=feats(fi);
    for t0=unique(Xb(:,f))'
      m = Xb(:,f)<=t0;
      if sum(m)>=2 && sum(m)<=height(Xb)-2
        lv=mean(yb(m)); rv=mean(yb(~m));
        if abs(lv-rv)>bestsc, bestsc=abs(lv-rv); bestf=f; bestt=t0; bestlv=lv; bestrv=rv; end
      end
    end
  end
  pred = (X(:,bestf)<=bestt)*bestlv + (X(:,bestf)>bestt)*bestrv;
  votes = votes + pred;
end
final = votes/N >= 0.5;
fprintf('随机森林(30 棵桩树) 准确率=%.3f\n', mean(final==y));

配套文件:m_rf.m(基础 MATLAB / Octave 即可运行)

九、练手数据集(可下载)

四特征 + 二分类标签。用于随机森林:袋装桩树投票,对比单棵决策树。

  • 字段:x1, x2, x3, x4, label
  • 行数:60 行
  • 下载:rf.csv

十、常见误区与避坑清单

  • 树太多训练慢
  • 高维稀疏文本不如线性模型
  • 可解释性弱于单棵树

十一、结果怎么解读

看特征重要性排序做特征选择。

十二、常与谁搭配

由决策树集成而来;与梯度提升树同属集成学习,但降低方差。

十三、论文写作技巧(怎么把它写进论文)

把 随机森林 写进论文,核心不是堆公式,而是讲清「为什么用它、结果怎么呈现、如何对比」三件事。

1. 动机怎么写(为什么用它而不是别的)

开篇说明是数据驱动预测,给出特征工程与样本规模。对比传统统计模型,点出 随机森林 能自动捕捉非线性 / 交互效应,但也要诚实说明需要调参与防过拟合。

2. 结果怎么写(图表与指标)

给学习曲线(样本量 vs 性能)、交叉验证平均 ± 标准差表、特征重要性排序图。多个模型横向对比误差。

3. 可直接套用的写作话术

  • 中文模板:针对<问题>,本文采用 随机森林 进行分类 / 回归、特征重要性、缺失值填补(高鲁棒、开箱即用)。该方法能够自动刻画<优势>,在处理<场景>时相较<对比方法>更具<特点>。
  • 英文模板:To address , we adopt 随机森林 to 分类 / 回归、特征重要性、缺失值填补(高鲁棒、开箱即用). Benefiting from its ability to , it outperforms on .

4. 同类易踩的写作坑

必须做交叉验证而非单次划分;报告方差而不仅是均值;说明超参搜索范围,避免「炼丹」嫌疑。

5. 典型论文段落范例(可直接参考 / 改写)

下面是一段可直接套用的论文表述,已按本算法定制,填空处(…)替换成你的真实数值即可。

针对信贷违约预测,本文采用 随机森林,经 5 折交叉验证平均 AUC=0.91±0.02,特征重要性显示收入稳定性与负债比为关键因子,模型在独立测试集上保持稳健。

For credit default prediction, we adopt 随机森林 and obtain AUC=0.91±0.02 under 5-fold cross-validation; feature importance highlights income stability and debt ratio as key drivers, with stable performance on a held-out test set.

十四、相关手册(延伸阅读)

十五、本手册导航


本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。