对于数据集中的每一行,仅使用随机森林中的一部分树来计算
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表示用于训练树的数据集行号(通过自助法选择)。例如,第1棵树没有使用第3和第5行进行训练。
无论您在sklearn的RandomForest中是否将OOB_score
设置为true,到此为止的所有操作都已完成。
OOB
如果将OOB_score
设置为true:我们将遍历数据集中的每一行,并执行以下操作:
- 第1行:只有第2棵树没有用它进行拟合/训练。因此,我们仅使用第2棵树对第1行进行预测并得到分数。
- 第2行:只有第3棵树没有用它进行训练。因此,我们仅使用第3棵树对第2行进行预测并得到分数。
- ...
- 第4行:第2棵树和第3棵树没有用它进行训练。这所房屋的预测销售价格将是Tree 2和Tree 3预测值的平均值,但不包括Tree 1。
OOB_score
是对所有行的预测分数取平均值得到的。
验证集
将此行为与使用显式验证集进行比较。
例如,您的验证数据集中有5个新行,对于每一行,您将通过随机森林中所有3个树,获取它们各自的预测并报告平均值作为该行销售价格的最终预测。
然后,您可以通过对所有行的误差取平均值来计算整个验证集上的均方误差(或任何其他度量)。
总结
总之,
在计算OOB_score
时,每行仅在森林中的子集上进行预测。
而在显式验证集上报告的分数是由预测森林中所有树的结果得出的,这更能代表在测试集中实际发生的情况。因此,这个选项是你想要的。
平均而言,你会发现OOB_score
略低于在显式验证集上的得分,因为前者使用了较少的树进行预测。
评论
话虽如此,在实践中,这两个分数(OOB与验证)通常非常接近。
如果你有一个小数据集,无法承担验证集,那么OOB提供了一个很好的替代方案。
但是,如果你的数据集足够大,我还是建议设置一个显式的验证集(或进行交叉验证)。在这种情况下,OOB_score
只是衡量模型的额外指标,但你应该更注重验证分数。努力提高这个分数。
第二个原因
还有另一种情况,明确的验证集比使用OOB更合适:当涉及到时间序列时。
一个例子是Kaggle竞赛Corporación Favorita Grocery Sales Forecasting,你的目标是预测在给定过去4年的数据基础上,在接下来的两周内每个商店每种商品的杂货价格。
在这种情况下,你的模型(完成后)将在测试集中预测未来价格。因此,在验证模型时,你希望尽可能地模拟这个过程。这意味着:
你想构建最近的验证集(例如使用前2周的数据)。然后,你的训练数据集从4年前到今天前2周。而你要在“未来”验证集上进行验证,从2周前到现在。
如果您使用
OOB_score
,则无法执行此操作:它会随机生成伪验证集(引导的后果),因此从OOB获得的分数将不太有意义,因为您没有模拟上述“未来”效应。
生成显式验证集将允许您自由选择最近的数据进行验证,而不是随机选择。
oob_score : bool, optional (default=False)
更改为True
来改变默认行为。 - G. Anderson