随机森林sklearn

时间:2018-10-10 18:38:40

标签: python scikit-learn random-forest cross-validation

我对是否需要对随机森林进行显式交叉验证感到困惑?在随机森林中,我们有Out of Bag样本,可用于计算测试准确性。是否需要显式交叉验证。在随机森林中明确使用CV有什么好处?基于此代码,我很难理解随机林中的CV如何工作 这是我的代码:

模型= BaggingClassifier(base_estimator =购物车,n_estimators = num_trees,random_state =种子)

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

print(results.mean())

6 个答案:

答案 0 :(得分:2)

对于数据集中的每一行,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行:只有Tree 2没有将其用于拟合/训练。因此,我们使用 only 树2预测并获得第1行的分数。
  • 第2行:只有Tree 3没有将其用于训练。因此,我们使用 only 树3预测并获得第2行的分数。
  • ...
  • 第4行:树2和3没有将其用于训练。该房屋的预计销售价格将为Tree 2和Tree 3的平均预测价格,而不是 Tree 1的预测价格。

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

验证集

将此行为与使用显式验证集进行比较。 例如,您在验证数据集中将有5个新行,对于每一行,您将其通过森林中的 ALL 3棵树,获取其各自的预测并将平均值报告为最终预测该行的销售价格。

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

摘要

总结一下,

  • 在计算OOB_score时,每行仅在森林中树木的子集上进行预测。

  • 鉴于显式验证集上报告的分数是通过使用森林中的所有树木来预测每一行的结果,它更能代表测试集中的实际情况。因此,此选项是您想要的。

  • 平均而言,您希望OOB_score会比使用显式验证集的情况稍差一些,因为使用较少的树来预测前者。

评论

也就是说,两个分数(OOB与验证)在实践中通常非常接近。 如果您的数据集很小并且无法提供验证集,那么OOB提供了一个很好的选择。

但是,如果您的数据集足够大,无论如何,我建议您保留一个明确的验证集(或进行交叉验证)。在这种情况下,OOB_score只是判断模型所依据的附加指标,但是您应该在验证分数上放置更高的优先级。努力提高这个分数。


第二个原因

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

一个名为Corporación Favorita Grocery Sales Forecasting的Kaggle竞争示例,您的目标是根据过去的给定数据预测接下来2周中每家商店每件商品的杂货价格4年

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

您希望构建的验证集尽可能的新(例如,使用前2周的数据)。然后,您的训练数据集是从4年前到“今天'。然后您就可以从2周前到“今天”使用“未来”验证集进行验证。

如果使用OOB_score,则无法执行此操作:它会随机生成伪验证集(自举的结果),因此从OOB获得的分数将没有太大意义,因为您没有在模拟“未来”效果如上所述。 生成显式验证集将使您可以自由选择要验证的最新数据,而不必选择随机数据。

答案 1 :(得分:0)

oob_score不够,因为:

  1. 它是在火车集合的某些行上计算出来的,不会显示您的预测能力
  2. 我在oob_score计算中看不到任何简历/分层(因此,如果您的数据集不平衡并且oob_score行被完全随机抽取-这很不好)
  3. 它使用precision_score进行分类,并使用r2进行回归,这可能不是您想要的指标

答案 2 :(得分:0)

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

答案 3 :(得分:0)

oob_score是在训练随机森林模型时对数据集进行引导采样时计算的。这是一个可以控制的超级参数。请注意,OOB是指数据集的自举算法部分。但是,引导程序本身工作的底层方式有所不同,这导致火车样本中和样本外考虑记录的重复性,而不是k倍交叉验证会做的火车/测试拆分

请注意,OOB在交叉验证中特别有用的一个地方是,当交叉验证可能会使计算更加消耗时,在大型数据集上使用随机森林或任何装袋分类器进行处理

答案 4 :(得分: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!

答案 5 :(得分:0)

“我对随机森林是否需要显式交叉验证感到困惑?”

答案:随机森林的工作不需要交叉验证。但是,交叉验证将证明您的模型是否可以很好地泛化。将交叉验证性能指标包含在管道中然后使用 cv 的参数是一种很好的做法。缺点是交叉验证需要资源和时间来完成,对于小型数据集,回报可能并不显着。

相关问题