随机森林的 OOB 误差是什么?
简化版
OOB 评估利用每棵 bootstrap 树未抽到的样本做验证:对样本只聚合没训练过它的树,得到近似交叉验证的预测。它节省额外验证成本,但时间/分组数据、调参偏差和少树覆盖不足仍需独立处理。
详细版
-
bootstrap 抽 N 次后,单棵树约有 36.8% 样本未被抽中。
-
每个样本的 OOB 预测来自不同树子集。
-
树数少时部分样本 OOB 票数不足,指标方差大。
-
反复用 OOB 调很多超参数会对 OOB 过拟合。
-
时间序列和同主体数据会破坏独立性假设。
完整版教学
一、每棵树自带一小块未见数据
样本一次抽不到的概率为 (1-1/N)^N≈e^-1。
这些未见样本可检测该树的泛化,跨树聚合后覆盖大多数训练样本。
OOB 并非神奇新数据:它仍来自训练总体,无法模拟未来漂移,也无法阻止同一用户的关联样本跨集合。
二、底层机制与公式
P(sample OOB for one tree)=(1-1/N)^N -> e^-1≈0.368
OOB_pred(i)=aggregate trees where i not in bootstrap
三、带数字的推演
N 很大时,一棵树约 36.8% 样本 OOB。
100 棵树下,每个样本期望获得约 36.8 票,覆盖较稳定;只有 5 棵时则期望不到 2 票。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| OOB | 无需额外切分 | 仅适用于 bootstrap 集成 |
| K 折 | 模型通用、可分组 | 训练成本 K 倍 |
| 留出集 | 简单且真实 | 占用训练数据 |
五、执行流程
训练 bootstrap 森林 -> 记录每树 in-bag 集合 -> 聚合各样本 OOB 票
-> 计算指标/置换重要性 -> 检查票数分布 -> 独立测试确认
六、边界条件与工程代价
若 bootstrap=False,就没有自然 OOB 样本;某些库会直接禁止 oob_score。
类别极不均衡时,OOB 子集的少数类票数仍可能不稳,应报告类别指标与置信区间。
记忆钩子:OOB 的核心是“对这棵树没抽到”,极限比例约 36.8%。
七、常见误区与追问
-
误区:OOB 是完全独立测试集。 它来自同一训练总体且常被用于调参。
-
追问:36.8% 怎么来的? N 次有放回抽样均未抽到某样本的极限是 e^-1。
-
误区:任何随机森林都能算 OOB。 必须启用 bootstrap。
-
追问:树数少有何影响? 每个样本可用 OOB 票少,预测方差大。
-
追问:何时仍需分组验证? 同用户、时间或设备相关样本可能泄漏时。
八、加强记忆
OOB 的核心是“对这棵树没抽到”,极限比例约 36.8%。
它是便宜的内部验证,不是可替代所有独立测试的免检证书。