随机森林 sklearn

3

我对于随机森林是否需要显式的交叉验证感到困惑?在随机森林中,我们有袋外样本可以用于计算测试准确性。是否需要明确使用CV?在随机森林中明确使用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())

1
你是在问分类器是否隐式地使用袋外样本进行评分吗?如果是这个问题,答案是否定的,默认情况下不会使用。但是,你可以通过将oob_score : bool, optional (default=False)更改为True来改变默认行为。 - G. Anderson
6个回答

3
对于数据集中的每一行,仅使用随机森林中的一部分树来计算OOB_score,因此它并不能真正反映完整随机森林模型在任何特定数据行上的表现。因此,简短的答案是:你仍然需要一个明确的验证集,因为在该集上计算的模型得分(如R2、均方误差等)是基于完整模型进行的预测。
我将通过一个(过度简化的)例子进行说明:
假设我们正在进行房屋销售价格的回归预测。您有一个包含 5 行的数据集(每行都包含特定房屋的特征,例如其YearBuiltLivingAreaNumberOfGarages等),以及一个包含 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获得的分数将不太有意义,因为您没有模拟上述“未来”效应。 生成显式验证集将允许您自由选择最近的数据进行验证,而不是随机选择。

1

oob_score是在训练随机森林模型时对数据集进行自助采样时计算的超参数。这是一个可以控制的超参数。请注意,OOB是指自助算法中数据集的一部分。然而,自助算法本身工作方式的不同导致了记录在训练样本和样本外都被考虑到的冗余性,而不是像k折交叉验证那样进行训练/测试拆分。

请注意,在使用随机森林或任何装袋分类器处理大型数据集时,OOB可能比交叉验证更有用,因为交叉验证可能会变得更加耗费计算资源。


0

oob_score不足之处:

  1. 它是在训练集的某些行上计算的,这并不能显示你的预测能力
  2. 我没有看到oob_score计算中有任何cv/分层(所以如果你的数据集不平衡,并且oob_score的行是完全随机选择的 - 这是不好的)
  3. 它对分类使用accuracy_score,对回归使用r2,这可能不是你期望的评估指标

关于第二点,sklearn在训练随机森林时有一个"weight"参数,你可以将其设置为"balanced"或"balanced_subsample"以应对不平衡的数据集。 - Ben
对于其余部分,文献中有一些论文比较了OOB和CV。例如,请参阅2002年发表在《机器学习》杂志上的文章《使用外袋估计量估计双分类数据集的泛化误差》("Estimating Generalization Error on Two-Class Datasets Using Out-of-Bag Estimates")。 - Ben
谢谢。关于第二点:我知道“balanced”选项。但我不确定OOB是否使用它。不过,我快速查看了sklearn的代码。 - avchauzov
1
如果你想知道sklearn RF代码中的内容,我建议你看一下Gilles Louppe的博士论文,他是实现这个算法的人,他的论文中有很多详细信息!https://arxiv.org/abs/1407.7502 - Ben

0
OOB错误是随机森林预测误差的无偏估计。因此,报告OOB错误就足够了。然而,进行交叉验证也没有坏处。理想情况下,两者应该非常接近。

0

“我不确定随机森林是否需要显式交叉验证?”

回答:对于随机森林来说,不需要进行交叉验证。然而,交叉验证可以证明你的模型是否能够很好地泛化。将交叉验证性能指标作为流程的一部分是一个好的做法,然后使用cv的参数。不过,交叉验证需要消耗资源和时间才能完成,对于小数据集来说,回报可能并不显著。


0

#交叉验证是什么?#

交叉验证是一种技术,它涉及保留数据集中的特定样本,不对模型进行训练。稍后,在最终确定模型之前,您会在这个样本上测试您的模型。

Here are the steps involved in cross validation:

 1. You reserve a sample data set
 2. Train the model using the remaining part of the dataset Use
 3.the reserve sample of the test (validation) set. This will help you in gauging 
   the effectiveness of your model’s performance. If your model delivers a  
   result on validation data, go ahead with the current model. It rocks!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接