3 回答

TA贡献1900条经验 获得超5个赞
对于数据集中的每一行,OOB_score仅使用随机森林中树的子集计算。因此,它并不能真正反映完全随机森林模型在任何特定数据行上的表现。所以简短的回答是:你仍然需要一个明确的验证集,因为在该集上计算的模型分数(无论是 R2,均方误差等)是基于完整模型的预测。
我将用一个(过度简化的)例子来说明:
假设我们正在做回归预测房价。你有一个数据集5行(每行会包含一个特定的房子的功能,如它YearBuilt,LivingArea,NumberOfGarages例如),以及随机森林具有3棵树。
Tree 1 Tree 2 Tree 3
------ ------ ------
1 1
2 2
3 3
4
5 5
其中数字 1-5 表示用于训练树的数据集行号(通过引导选择)。然后例如,第 3 行和第 5 行不用于训练树 1,依此类推。无论您是否OOB_score在 sklearn 的 RandomForest 中设置为true,到此为止的所有内容都已完成。
面向对象
如果OOB_score设置为 true:我们遍历数据集中的每一行,并执行以下操作。
第 1 行:只有树 2 未将其用于拟合/训练。因此,我们仅使用树 2预测并获得第 1 行的分数。
第 2 行:只有 Tree 3 没有使用它进行训练。因此,我们仅使用树 3预测并获得第 2 行的分数。
...
第 4 行:树 2 和 3 未将其用于训练。这所房子的预测售价将是树 2 和树 3 预测的平均值,而不是树 1。
这OOB_score只是所有行的预测分数的平均值。
验证集
将此行为与您是否使用了显式验证集进行比较。您将(例如)在验证数据集中有 5 个新行,对于每一行,您将通过森林中的所有3 棵树,获取它们各自的预测并将平均值报告为该行的销售价格的最终预测.
然后,您可以通过取所有行的误差平均值来报告整个验证集的均方误差(或任何其他指标)。
概括
总结一下,
在计算 时OOB_score,每一行仅在森林中的一个树子集上进行预测。
而在显式验证集上报告的分数是对森林中所有树木的每一行进行预测的结果,这更能代表测试集中实际发生的情况。所以,这个选项就是你想要的。
平均而言,您会期望OOB_score比在显式验证集上做的稍微差一些,因为在前者中使用较少的树进行预测。
评论
也就是说,这两个分数(OOB 与验证)在实践中通常非常接近。如果你有一个小数据集并且买不起验证集,OOB 提供了一个很好的选择。
但是,如果您的数据集足够大,我建议无论如何都要留出一个显式验证集(或进行交叉验证)。在这种情况下,这OOB_score只是判断模型的附加指标,但您应该将验证分数放在更高的优先级上。努力提高这个分数。
第二个原因
还有另一种情况,其中显式验证集比使用 OOB 更合适:当涉及时间序列时。
一个例子是名为Corporación Favorita Grocery Sales Forecasting的 Kaggle 竞赛,您的目标是根据过去 4 年的给定数据预测未来 2 周内每家商店每件商品的杂货价格。
在这种情况下,您的模型(完成后)将预测测试集中的未来价格。因此,您希望在验证模型时尽可能地模拟这一点。这意味着:
您希望将验证集构造为尽可能最新(例如,使用前 2 周的数据)。然后,您的训练数据集是从 4 年前到“今天”之前的 2 周。并且您在“未来”验证集上进行验证,从 2 周前到“今天”。
如果您使用,则无法执行此操作OOB_score:它随机生成伪验证集(引导的结果),因此您从 OOB 获得的分数将没有意义,因为您没有模拟上述“未来”效果。生成显式验证集将允许您自由选择您拥有的最新数据进行验证,而不是随机选择。

TA贡献1806条经验 获得超8个赞
“我很困惑随机森林是否需要明确的交叉验证?”
答:随机森林的工作不需要交叉验证。但是,交叉验证将证明您的模型是否可以很好地泛化。将交叉验证性能指标包含在管道中然后使用 cv 的参数是一种很好的做法。缺点是交叉验证需要资源和时间来完成,对于小数据集,回报可能并不显着。
添加回答
举报