首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机森林sklearn

随机森林sklearn
EN

Stack Overflow用户
提问于 2018-10-11 02:38:40
回答 6查看 868关注 0票数 2

我对随机森林是否需要显式交叉验证感到困惑?在随机森林中,我们有现成的样本,这可以用于计算测试精度。是否需要显式交叉验证。在随机森林中显式使用CV有什么好处吗?基于下面的代码,我发现很难理解随机森林中的CV是如何工作的:

代码语言:javascript
复制
model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)

results = cross_validation.cross_val_score(model, X, Y, cv=kfold)

print(results.mean())
EN

回答 6

Stack Overflow用户

发布于 2018-10-12 13:35:58

对于数据集中的每一行,仅使用随机林中的树的子集来计算OOB_score。因此,它不能真正反映完整的随机森林模型在任何特定数据行上的执行情况。所以简短的答案是:你仍然需要一个显式的验证集,因为模型在该集上计算的分数(可以是R2,均方误差等)。是基于完整模型所做的预测。

我将用一个(过于简化)的例子来说明:

假设我们正在进行回归以预测房屋销售价格。您有一个包含5行的数据集(每行将包含特定房屋的特征,例如,它的YearBuiltLivingAreaNumberOfGarages ),以及一个具有3树的随机森林。

代码语言:javascript
复制
Tree 1     Tree 2     Tree 3
------     ------     ------
  1                      1
  2           2       
              3          3
  4                      
              5          5

其中数字1-5表示用于训练树的数据集行号(通过自举选择)。例如,第3行和第5行在训练树1中不使用,依此类推。不管你是否在sklearn的RandomForest中设置了OOB_score为真,到这里为止的所有事情都已经完成了。

OOB

如果OOB_score设置为true:我们遍历dataset中的每一行,并执行以下操作。

  • 第1行:只有树2未将其用于装配/训练。因此,我们仅使用树2预测并获得第1行的分数。
  • 行2:只有树3没有使用它进行训练。因此,我们仅使用树3预测并获得第2行的分数。
  • ...
  • Row 4:树2和3没有使用它进行训练。这套房子的预测售价将是树2和树3的预测价格的平均值,而不是树1的预测价格。

OOB_score只是所有行的预测得分的平均值。

验证集

将此行为与使用显式验证集的情况进行比较。例如,您的验证数据集中将有5个新行,对于每一行,您将通过林中的所有3树传递它,获得它们各自的预测,并将平均值报告为该行销售价格的最终预测。

然后,您可以通过取所有行中误差的平均值来报告整个验证集的均方误差(或任何其他度量)。

摘要

总而言之,

在计算forest.

  • Whereas中的树的所有子集时,仅对每行进行预测。在显式验证集上报告的分数是使用
  • 预测林中的每行的结果,这更能代表测试集中实际发生的情况。因此,此选项就是您想要的选项。
  • 平均而言,您预计OOB_score会比在显式验证集上略差,因为您在前者中使用更少的树进行预测。

评论

也就是说,这两个分数(OOB与验证)在实践中往往相当接近。如果您有一个很小的数据集,并且负担不起验证集,OOB提供了一个很好的替代方案。

但是,如果您的数据集足够大,我建议您留出一个显式验证集(或进行交叉验证)。在这种情况下,OOB_score只是用来判断模型的额外指标,但您应该将验证分数放在更高的优先级。努力提高这个分数。

第二个原因

还有另一种情况,在这种情况下,显式验证集比使用OOB更合适:当涉及时间序列时。

一个例子是名为Corporación Favorita Grocery Sales Forecasting的Kaggle竞赛,您的目标是根据过去4年的给定数据预测未来2周中每个商店的食品杂货价格。

在这种情况下,您的模型(完成后)将在测试集中预测未来价格。因此,在验证模型时,您希望尽可能地模拟这一点。这意味着:

然后,,你的训练数据集就是4年前到“今天”之前的2周。,你想要构建尽可能近的验证集(例如,使用前2周的数据)。你在“未来”验证集上进行验证,从2周前到“今天”。

如果您使用OOB_score,则无法做到这一点:它在随机(自举的结果)上生成伪验证集,因此您从OOB获得的分数将不那么有意义,因为您没有模拟上面描述的“未来”效果。生成显式验证集将允许您自由选择您拥有的最新数据进行验证,而不是随机选择。

票数 3
EN

Stack Overflow用户

发布于 2018-10-11 13:52:58

oob_score是不够的,因为:

  1. 它是在训练集中的一些行上计算的,这不能显示您的预测能力
  2. 我在oob_score计算中看不到任何cv/分层(因此,如果您有不平衡的数据集,并且oob_score行是完全随机获取的,这是不好的)
  3. 它使用accuracy_score进行分类,使用r2进行回归,这可能不是您所需的指标
票数 0
EN

Stack Overflow用户

发布于 2018-10-16 02:26:48

OOB误差是来自随机森林的预测误差的无偏估计。因此,报告OOB错误就足够了。但是,执行交叉验证并没有什么坏处。理想情况下,两者都应该非常接近。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52746769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档