Skip to content

随机森林中的袋外验证(OOB validation)

OOB Validation in Random Forest

在训练集上训练完 ML 模型后,我们总是会保留一个留出的验证/测试集用于评估。我相信你已经知道它的用途,所以我们不展开讨论。但你是否知道随机森林是个例外?换言之,人们可以某种程度地用训练集本身来“评估”随机森林。让我们看看怎么做。回顾一下,随机森林的训练过程如下:

  • 首先,我们有放回地创建不同的数据子集(这个过程称为自助法(bootstrap))。
  • 接着,我们在每个子集上训练一棵决策树。
  • 最后,我们聚合所有预测以得到最终预测。

该过程如下所示:

ds p275 1

如果我们仔细看上图,每个子集都缺少原始训练集中的一些数据点。

ds p276 1

我们可以用这些观测样本来验证模型。这也被称为袋外验证(OOB validation)。为整个随机森林计算袋外分数也很简单。但需要记住的一点是,我们不能在各自特定的袋外样本上评估单棵决策树,然后为整个随机森林模型生成某种“聚合分数”。

ds p276 2

这是因为随机森林关注的不是单棵决策树单独说了什么,而是所有决策树集体说了什么。所以,我们可以这样为随机森林模型生成袋外分数。对于训练集中的每一个数据点:

  • 收集所有未把它用作训练数据点的决策树的预测。
  • 聚合这些预测以得到最终预测。

例如,考虑一个包含 5 棵决策树的 RF 模型 → (P, Q, R, S, T)。假设某个数据点 X 在决策树 P 和 R 中被用作训练数据。

ds p277 1

所以我们要从决策树 Q、S 和 T 中收集数据点 X 的袋外预测。在获得所有样本的袋外预测后,我们对它们评分得到袋外分数。看……这项技术让我们能够在训练集上评估随机森林模型。当然,我不希望你在不了解它的一些优势和注意事项的情况下就盲目采用袋外验证。我发现袋外验证在以下情况中特别有用:

  • 在数据量较少的情况下,袋外验证避免了数据拆分,同时仍能获得一个良好的模型验证代理。
  • 在数据量较大的情况下,传统的交叉验证技术在计算上代价很高。此时袋外验证提供了一个高效的替代方案。这是因为就其本质而言,即便是交叉验证提供的也是一个留折(out-of-fold)指标。袋外验证也基于类似原理。当然,袋外验证的一个固有优势是它保证了没有数据泄漏。幸运的是,袋外验证也被巧妙地集成到了 sklearn 的随机森林实现中。
  • 关于袋外分数,最重要的注意事项是:在模型选择、模型改进等方面要谨慎使用。因为如果这样做,我们通常会倾向于过拟合袋外分数,因为模型本质上是在被调优以在那些训练时被留出的数据点上表现良好。而如果我们持续依据袋外分数来改进模型,就会得到对其泛化性能过于乐观的评估。如果基于我的经验只分享一条教训,那就是:如果我们没有一个真正的(且完全不同的)留出验证集,我们就会在某种程度上过拟合。所做出的决策可能过于针对袋外样本,无法很好地泛化到新数据。

ds p278 1

本站内容仅供学习交流,版权归原作者所有。