Random Forest
随机森林会对多棵决策树的结果取平均。每棵树都基于自助采样样本生长,并随机划分特征,用于分类和回归。
随机森林是一种监督学习算法:它在同一数据的随机变体上训练许多决策树,然后组合各树的预测结果;分类任务采用投票或类别概率平均,回归任务则取均值。Leo Breiman 在 2001 年的论文《随机森林》中介绍了这种方法,并以他早期的装袋技术为基础。单棵深树会记住训练数据行,因此数据稍有变化,预测结果就会大幅波动。数百棵犯错方式各异的树取平均值,可以抵消大部分方差,因此随机森林是表格数据中最可靠的默认模型之一。它不需要特征缩放,能够处理特征之间的非线性交互,而且随着树的数量增加,其测试误差会趋于稳定。
随机森林的工作原理#
随机森林在树的训练中引入两种随机性,因为只有当集成中的成员犯错各异时,集成才有帮助;随后再组合这些树:
- 自助聚合(装袋):每棵树都在一个自助采样集上训练。该采样集从训练数据中有放回地抽取行,大小与训练数据相同。一些行会出现多次,而每个采样集大约会遗漏 37% 的行(即 1/e)。
- 随机特征子集:每次分裂时,树只考虑随机选取的一部分特征。Scikit-learn 的分类器默认考虑特征数量的平方根,因此,包含 100 个特征的数据集每次分裂会有 10 个候选特征;回归器则默认考虑所有特征。因此,主导特征无法出现在每棵树的顶部,从而降低树之间的相关性。
- 聚合:Breiman 的原始方法采用树的多数票。Scikit-learn 的实现则对所有树的类别概率取平均;回归森林对树的数值预测取平均。
这些树会生长得很深且不进行剪枝,因此每棵树的偏差低、方差高。对许多互不相关的树取平均值,可以在保持低偏差的同时降低方差,这是沿着偏差-方差权衡方向的有利调整。由于各棵树相互独立,它们也可以在多个 CPU 核心上并行训练。
袋外误差和特征重要性#
树从未见过的数据行可用作内置测试集。袋外 (OOB) 分数仅使用自助采样集未包含对应训练行的树来预测该行,因此无需单独留出验证集,就能估算模型在未见数据上的准确率。森林也会报告特征重要性。默认的基于不纯度的重要性衡量每个特征在所有分裂中降低不纯度的程度;它偏向取值唯一的特征,因此,排列重要性——打乱一个特征后分数的下降幅度——是特征排序时更可靠的选择。
此示例使用自带的乳腺癌数据集,通过 5 折交叉验证比较一棵完全生长的树和 scikit-learn 随机森林,随后读取森林的 OOB 分数:
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
# 569 tumors described by 30 numeric features, labeled malignant or benign
X, y = load_breast_cancer(return_X_y=True)
# One fully grown tree vs. a forest of 300 trees on bootstrap samples
tree = DecisionTreeClassifier(random_state=0)
forest = RandomForestClassifier(n_estimators=300, oob_score=True, random_state=0)
# Compare 5-fold cross-validated accuracy
print(f"Single tree: {cross_val_score(tree, X, y, cv=5).mean():.3f}")
print(f"Forest: {cross_val_score(forest, X, y, cv=5).mean():.3f}")
# Out-of-bag score: each row is predicted only by trees that never trained on it
forest.fit(X, y)
print(f"OOB score: {forest.oob_score_:.3f}")脚本输出:单棵树的分数为 0.917,森林为 0.963,OOB 分数为 0.965。森林将树的错误率从 8.3% 降至 3.7%;单次训练运行得到的 OOB 估算值与交叉验证准确率仅相差 0.002。
实际应用#
- 信用风险和欺诈检测:银行根据收入、账户年限和消费模式等表格记录为贷款申请和交易评分,而森林输出的概率用于设定决策阈值。
- 医疗风险预测:临床模型根据患者记录预测再入院等结果,排列重要性则显示哪些测量值影响了每项预测。
- 卫星图像分析:随机森林长期以来一直用于土地覆盖制图,根据光谱波段值和植被指数对每个像素或地块进行分类。
- 作物产量建模:YOLO26 检测器会统计田间图像中的水果或植株,每个对象对应一次检测;随后将每块地的计数与土壤和天气读数一同作为随机森林的列数据,用来预测产量。
随机森林与相关方法对比#
- 单棵决策树:树可以表示为一组易于阅读的 if-then 规则,但数据的微小变化就可能生成完全不同的树。森林牺牲了这种可读性,换取大幅降低的方差。
- 梯度提升:XGBoost、LightGBM 和 CatBoost 会依次构建浅层树,每棵树都修正前面树的错误。经过调参后,提升方法在表格数据基准测试中的得分通常更高;随机森林的各棵树则可以并行独立训练,并且使用默认设置也能取得良好结果。
- 表格基础模型:预训练 Transformer 只需一次前向传播,就能对新表格进行预测,无需针对每个数据集单独拟合模型;如今,它们在小型表格数据上的表现已能媲美经过调优的树集成模型。
- 极端随机树:对于每个候选特征,Extra Trees 会随机抽取一个阈值,而不是搜索最佳阈值,然后从这些随机分裂中选出最佳结果。Scikit-learn 默认使用完整数据集训练这类模型,不进行自助采样;跳过阈值搜索后,其拟合速度比同等规模的随机森林更快。










