我对随机森林是否需要显式交叉验证感到困惑?在随机森林中,我们有现成的样本,这可以用于计算测试精度。是否需要显式交叉验证。在随机森林中显式使用CV有什么好处吗?基于下面的代码,我发现很难理解随机森林中的CV是如何工作的:
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())发布于 2018-10-12 13:35:58
对于数据集中的每一行,仅使用随机林中的树的子集来计算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中不使用,依此类推。不管你是否在sklearn的RandomForest中设置了OOB_score为真,到这里为止的所有事情都已经完成了。
OOB
如果OOB_score设置为true:我们遍历dataset中的每一行,并执行以下操作。
OOB_score只是所有行的预测得分的平均值。
验证集
将此行为与使用显式验证集的情况进行比较。例如,您的验证数据集中将有5个新行,对于每一行,您将通过林中的所有3树传递它,获得它们各自的预测,并将平均值报告为该行销售价格的最终预测。
然后,您可以通过取所有行中误差的平均值来报告整个验证集的均方误差(或任何其他度量)。
摘要
总而言之,
在计算forest.
OOB_score会比在显式验证集上略差,因为您在前者中使用更少的树进行预测。评论
也就是说,这两个分数(OOB与验证)在实践中往往相当接近。如果您有一个很小的数据集,并且负担不起验证集,OOB提供了一个很好的替代方案。
但是,如果您的数据集足够大,我建议您留出一个显式验证集(或进行交叉验证)。在这种情况下,OOB_score只是用来判断模型的额外指标,但您应该将验证分数放在更高的优先级。努力提高这个分数。
第二个原因
还有另一种情况,在这种情况下,显式验证集比使用OOB更合适:当涉及时间序列时。
一个例子是名为Corporación Favorita Grocery Sales Forecasting的Kaggle竞赛,您的目标是根据过去4年的给定数据预测未来2周中每个商店的食品杂货价格。
在这种情况下,您的模型(完成后)将在测试集中预测未来价格。因此,在验证模型时,您希望尽可能地模拟这一点。这意味着:
然后,,你的训练数据集就是4年前到“今天”之前的2周。,你想要构建尽可能近的验证集(例如,使用前2周的数据)。你在“未来”验证集上进行验证,从2周前到“今天”。
如果您使用OOB_score,则无法做到这一点:它在随机(自举的结果)上生成伪验证集,因此您从OOB获得的分数将不那么有意义,因为您没有模拟上面描述的“未来”效果。生成显式验证集将允许您自由选择您拥有的最新数据进行验证,而不是随机选择。
发布于 2018-10-11 13:52:58
oob_score是不够的,因为:
发布于 2018-10-16 02:26:48
OOB误差是来自随机森林的预测误差的无偏估计。因此,报告OOB错误就足够了。但是,执行交叉验证并没有什么坏处。理想情况下,两者都应该非常接近。
https://stackoverflow.com/questions/52746769
复制相似问题