随机森林 · 深度手册
分类:机器学习 | 难度:★★★ 高阶 | 编号:
rf
一、这是什么(一句话用途)
分类 / 回归、特征重要性、缺失值填补(高鲁棒、开箱即用)
二、核心思想
随机森林是集成学习的代表:它训练很多棵决策树,每棵都在有放回随机抽样的训练子集(Bootstrap)上学习,且每次分裂只在随机抽样的若干特征里选最优分割。两个"随机"让各树差异大、相关性低,再对它们的预测做多数投票(分类)或平均(回归)。单棵决策树容易过拟合、对训练数据抖动敏感;而多棵树平均后方差大幅下降、鲁棒性骤增,且能天然给出特征重要性。它几乎不用调参就很强,是建模竞赛里的"baseline 之王"。
三、数学原理与推导
设森林有 棵树,第 棵树在自助样本上得到预测 。最终
特征重要性(不纯度下降平均):分裂时特征 带来的不纯度(如基尼)减少量,在所有树、所有含 的节点上加权平均:
包外误差(OOB):约 1/3 未抽中的样本可当验证集,免去额外划分。
四、建模 / 求解步骤
- 有放回抽样(Bootstrap)建子树训练集
- 每节点随机选部分特征再分裂
- 长成多棵不剪枝决策树
- 预测投票/平均
- 看特征重要性 / 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.
十四、相关手册(延伸阅读)
- 决策树 · 聚类分类
- 梯度提升树(XGBoost / LightGBM) · 机器学习
十五、本手册导航
- 上一篇:贝叶斯方法 · 经典模型
- 下一篇:梯度提升树(XGBoost / LightGBM) · 机器学习
- 返回:算法深度手册库 | 资料站首页
本手册由「算法深度手册生成器」自动产出,配套提供 Python / MATLAB 双版本示例与可下载练手数据集。