随机森林多数表决模拟器 返回
机器学习模拟器

随机森林多数表决 — 装袋法与方差降低

使用bootstrap重采样与特征子采样训练T棵决策树并以多数表决预测。通过对比单树精度与决策边界的平滑程度,直观理解集成为何能降低方差。

参数设置
树的数量 T
每棵树的最大深度
查询点 x
查询点 y

训练数据固定(LCG seed=42、N=80点、二分类、σ=1.5)。每棵树的构建也通过派生的种子保持决定论。

计算结果
单树训练精度
集成训练精度
查询点预测类别
最高类的票占比
多数表决决策边界与查询点票分布

浅色背景=多数表决决策区域(红=类0/蓝=类1)/散点=训练数据/黄色×=查询点/右下条=查询点的票分布

理论与主要公式

bootstrap样本:从N个点中有放回地抽取N个(约63.2%为不重复)。每棵树用各自的bootstrap样本训练:

$$P(\text{未被抽中}) = (1 - 1/N)^N \;\xrightarrow{N\to\infty}\; e^{-1} \approx 0.368$$

二分类下的多数表决预测:

$$\hat{y}(\mathbf{x}) = \mathrm{argmax}_{c \in \{0,1\}} \sum_{t=1}^{T} \mathbb{1}[h_t(\mathbf{x}) = c]$$

独立弱学习器平均的方差降低(装袋法效应):

$$\mathrm{Var}(\bar{h}) = \frac{\sigma^2}{T} + \rho\,\sigma^2\,\frac{T-1}{T}$$

ρ为树之间的相关系数。特征子采样降低ρ,从而保证T增大时方差持续下降。

什么是随机森林多数表决模拟器

🙋
老师,听说随机森林就是"多建几棵决策树然后投票",仅靠这样真的能提高精度吗?用同一份数据训练,所有树不就长得一模一样了吗?
🎓
问得好。关键在于两层随机化:bootstrap重采样和特征子采样。bootstrap从原始的N个样本中有放回地抽N个——同一个样本可能出现多次,约37%根本不会被选中。这样每棵树看到的数据略有不同。再加上每次分割随机选用的特征不同,树之间的相关性进一步降低。在上方模拟器中把树的数量T从1调到10、20——决策边界会从锯齿状变成平滑曲线。
🙋
真的诶,T=1时边界很粗糙,T=20左右就变得圆润平滑了。但"单树训练精度"和"集成训练精度"差距好像没有特别大?
🎓
训练精度在单树上本来就高——深树容易把训练数据完全记住。真正受益的是测试精度和方差降低。数学上T个独立弱学习器的均值方差降到σ²/T。实际中树之间不完全独立,残留ρσ²(T-1)/T项,但特征子采样能压低ρ,让T增大时方差继续下降。这个模拟器没单独显示测试集,但你可以看决策边界趋向"两类中心连线的对角直线"——这就是过拟合被平均掉的过程。
🙋
把查询点放在(0,0)——正好两类中间——票数几乎对半,"最高类的票占比"只有60%左右。这意味着什么?
🎓
这正是"预测不确定性"的体现。中心点对哪类都说得过去,所以不同的树投出不同的票。把查询点移到(-3,-3)或(3,3)看看——票占比会跳到95%甚至100%。实际工作中这个票占比常作为"预测概率"使用(predict_proba):低于0.5视为待定,高于0.9则可放心采纳。在信用评分和医疗辅助决策中非常重要。
🙋
把最大深度调到1精度大幅下降,调到5又接近100%。是不是越深越好?
🎓
不行,这是个陷阱。深树会把训练集背下来达到100%训练精度,但在测试集上会过拟合。这里就是随机森林的精妙之处——即使单树过拟合,由于bootstrap让每棵树看到的数据不同,过拟合的位置也不同,多数表决就把这些噪声平均掉了。所以RF的默认策略是"深树+大量"。梯度提升则相反,主张"浅树+逐步纠正",二者形成对比。

常见问题

bootstrap采样会从原始数据中选取约63%用于训练,剩下约37%留在袋外。对每个样本,仅使用未在训练中见过它的树进行预测,再聚合所有这样的预测得到误分类率,即为OOB误差。这相当于在不另外划分验证集的情况下估计泛化性能,因此随机森林中常将其作为交叉验证的替代方案。在scikit-learn中可通过 oob_score=True 获取该值。
常用方法有两种。第一种是MDI(不纯度均值减少),将每个特征用于划分时的Gini不纯度下降量在所有树上取平均,速度快但偏向于类别数多或连续值分辨率高的特征。第二种是置换重要度(permutation importance),随机打乱某特征的取值后衡量OOB精度的下降量,计算更慢但被认为更公平。SHAP值是另一种被广泛使用的替代方案。
随机森林并行训练相互独立的树(bagging),通过多数表决或平均聚合,目标是降低方差,对过拟合鲁棒且易于调参。梯度提升(XGBoost、LightGBM、CatBoost等)按顺序训练新树以拟合先前树的残差(boosting),目标是降低偏差。后者通常精度上限更高,但对学习率与树数量更敏感,调参不当容易过拟合。
理论上T增大时OOB误差单调下降且不会过拟合(Breiman大数定律)。实际中精度通常在T=100到500之间趋于饱和。由于训练与推理成本随T线性增长,常用做法是观察OOB曲线并在其趋平之前停止。本模拟器为绘图速度将T限制在50以内,但定性行为相同:T超过20后决策边界几乎不再变化。

实际应用

信用评分与贷款决策:金融机构常用随机森林或梯度提升树,根据收入、工龄、逾期历史、交易模式等特征估计违约概率。多数表决的票占比可直接作为"风险评分"使用,且特征重要度排序具备相对良好的可解释性,便于向监管机构作出说明。

医学诊断与基因表达分析:面对"特征数 >> 样本数"的高维数据(如基因表达矩阵),随机森林对过拟合鲁棒、实用性强。特征子采样在数千乃至数万维特征中也能稳定工作,可输出疾病相关基因的重要度排名,因而在生物信息学中被广泛使用。

制造业的不良品检测与预测性维护:从传感器数据中识别不良品或故障征兆时,随机森林易于在生产现场部署。训练易于并行,推理速度快,对异常值稳健;通过对票占比设阈值,可实现"高置信度自动判定,灰色区域转交人工复核"的实用流程。

推荐系统与需求预测:电商和零售行业用随机森林根据用户属性与购买记录预测购买概率或需求量。它在认真做特征工程之前就是一个强大的基线模型,能自动捕捉特征间的交互。即使在深度学习盛行的今天,在表格数据上仍常常是表现最强的单一模型之一。

常见误解与注意事项

最常见的误解是"树越多精度一定越高"。OOB误差确实随T单调下降,但通常在100到500棵树时就趋于饱和,再增加几乎没有提升,反而训练与推理成本线性增加、内存占用上升。在模拟器中把树数从1调到10、30、50:T=10与T=30的差异很明显,但T=30与T=50的差异几乎看不出来。实际中应在OOB曲线趋平之前停止。

其次容易出错的是把MDI特征重要度当成绝对真理。MDI对类别数多或连续值分辨率高的特征有过高估计的偏差。比如把毫无意义但唯一的"客户ID"作为特征加入,它甚至可能排到最前面。建议结合permutation importance和SHAP值使用。此外,相关性高的特征之间会"分摊"重要度,需要特别留意。

最后要注意不能把随机森林当万能锤。它在表格数据上很强,但在图像、音频、文本这类结构化数据上远不及深度学习。它的外推能力极弱,对训练数据范围之外的输入预测会失稳。对于极端不平衡的数据,多数表决会一直输出多数类,因此必须使用class_weight、阈值调整、SMOTE等手段。在本模拟器中,把查询点拖到角落(±5, ±5),会看到票占比变得极端——这正是外推不稳定的一个缩影。