袋外误差估计是否可以增强?


9

在随机森林中,每棵树都是在数据的唯一Boostrap样本上并行生长的。由于预计每个Bo​​ostrap样本将包含约63%的独特观测值,因此将约37%的观测值排除在外,可用于测试树。

现在,似乎在随机梯度增强中,还有一个类似于RF中的估计:OOBerror

如果bag.fraction设置为大于0(建议为0.5),则gbm将计算出袋装的预测性能改善估计值。它评估在选择下一个回归树时未使用的那些观察结果的偏差减少。

资料来源:Ridgeway(2007),第3.3节(第8页)。

我无法理解其工作方式/是否有效。说我要按顺序添加一棵树。我正在原始数据集的随机子样本上生长这棵树。我可以在不用于生长的观察结果上测试这棵树。同意 但是,由于Boosting是顺序的,所以我宁愿使用到目前为止构建的整个序列来为那些遗漏的观察提供预测。而且,前面的许多树木很有可能已经看到了这些观察结果。因此,不是真的像RF一样在每个回合上都未对模型进行过测试,对吗?

那么,这怎么称为“袋外”误差估计呢?对我来说,似乎已经被发现了吗?


1
请参阅github.com/scikit-learn/scikit-learn/pull/1806上的讨论。您并不孤单表示担心OOB估计的计算方式。
mpiktas 2015年

感谢您的链接,但不幸的是,所有线程贡献者似乎都像我一样迷路!
Antoine

1
其实不行 见github.com/scikit-learn/scikit-learn/pull/2188。在此提交中,OOB分数以gbm的方式更改为OOB改进。我不知道这个想法如何精确地工作,但是从我收集的数据来看,当前树的oob样本用于计算OOB改进。我没有找到数学公式,因此有必要深入研究gbm代码以查看此改进的计算精确度。
mpiktas 2015年

@Antoine真是令人兴奋的问题!找到明确的答案了吗?
索伦·哈弗隆德·威灵

1
不,很不幸。上面的链接(在注释中),该线程和另一个线程给出了一些提示。这让我完全疯了。总有一天,应该有人给Friedman / Hastie博士发电子邮件...不过,谢谢您的关注。
Antoine

Answers:


2

仅部分回答(并向您的问题添加新问题)。

R http://www.rdocumentation.org/packages/gbm/functions/gbm中的gbm实现 具有两个参数,可以调整一些不便之处。

a)train.fraction将定义用于训练所有树木的数据的比例,因此1- train.fraction将是真实的OOB(袋装)数据。

b)bag.fraction将定义在提升中创建下一棵树时使用的训练数据的比例。因此可能存在一些从未用于创建任何树的数据,它们可以真正用作OOB数据。(但不太可能,请参阅下面的问题)

这使我想到了这个问题。您将37%的数据视为OOB的分析仅适用于一棵树。但是,任何树中都不会使用任何数据的机会要小得多(对于所有树,它必须在OOB中-我的理解是每棵树都有自己的引导程序)。因此,在RandomForests中,不可能有任何OOB来测试森林。但是R中的randomForest实现(基于Breiman的原始代码)对OOB进行了很多讨论(例如结果数据,请参见http://www.rdocumentation.org/packages/randomForest/functions/randomForest Ñ ř Ë Ë0.37ntreesntreeerr.rateconfusion

我不知道该如何回答(我感谢您(+1)提出这个问题,并使我意识到我不了解randomForests的这一方面)。可能的解决方案是只有一个引导程序-并且所有树都是从中构造的-但据我所知,事实并非如此。


对于RF /装袋,没有问题:在集成构建过程中的任何给定步骤中,原始数据集中的任何观察结果都可以馈送到所有接受了Boostrap样本训练的树木,而无需进行观察。树木总数的大约三分之一(〜37%)将满足此条件。此外,通过让这些树投票并参加最受欢迎的课程,可以为观察获得预测。预测与在所有类别中平均的观测值的真实标签不同的次数,给出了袋外误差估计
Antoine

1
同样,似乎在Boosting中提供OOB错误估计能力的原因不在于train.fraction参数(这只是gbm函数的功能,而在原始算法中不存在),而实际上来自于以下事实:数据用于训练序列中的每棵树,而忽略观察值(可用于测试)。这回到我最初的问题。由于这些观测值可能已被序列中的许多先前树多次查看,因此如何将其用于测试?
Antoine

忘了提及RF中的每棵树确实都是根据其自己的原始数据的独特引导样本构建的
Antoine

@ user2835597感谢您对RF的解释。因此,RF的OOB错误实际上仅评估了森林中1/3的树(对我而言,这似乎不太有用)。好吧,每天学习一些东西。
雅克·威纳

无论如何,train.fraction参数似乎是您问题的答案。sklearn实现也有一个类似的参数,即子样本(请参阅scikit-learn.org/stable/modules/generation/…–
Jacques Wainer

-2

我相信他们在每个步骤中都不会做出估算。由于添加了所有步骤的结果(使用系数),因此也可以使用相同的系数添加OOB错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.