在Scikit-learn

时间:2016-02-16 03:45:40

标签: machine-learning scikit-learn random-forest

我通过预先随机化训练集,使用sklearn.ensemble.RandomForestClassifier获得了惊人的显着性能提升(+ 10%交叉验证准确度增益)。 从那以后,这对我来说非常令人费解 (a)RandomForestClassifier无论如何都应该随机化训练数据;和 (b)为什么例子的顺序无关紧要?

任何智慧的话语?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并发布了question,很幸运,该问题已解决。

在我的情况下,这是因为数据是按顺序排列的,并且在进行测试序列拆分时,我使用的是K折叠交叉验证,而没有改组。这意味着仅在具有一定模式的相邻样本块上训练模型。

一个极端的例子是,如果您有50行所有类A的样本,然后是50行所有类B的样本,然后手动在中间进行一次火车测试拆分。现在,该模型已经使用A类的所有样本进行了训练,但是使用B类的所有样本进行了测试,因此测试精度为0。

在scikit中,默认情况下train_test_split不进行混洗,而KFold class不进行混洗。因此,您应该根据自己的情况执行以下操作之一:

  • 先随机播放数据
  • 使用带有shuffle = True的train_test_split(同样,这是默认设置)
  • 使用KFold并记住设置shuffle = True

答案 1 :(得分:0)

示例的排序不应影响RF性能。注意无论如何,Rf性能在运行期间可以变化1-2%。您是否在培训之前单独设置交叉验证?(只是确保这不是因为交叉验证集每次都不同)。同样通过随机化我假设你的意思是改变例子的顺序。

此外,您可以在训练集本身的两种情况下检查分类器的Out of Bag精确度,您不需要为RF提供单独的交叉验证集。

在随机森林训练期间,通过从训练数据中替换取样来获得用于训练每个单独树的数据,因此每个训练样本不用于大约1/3的树。我们可以使用这些1/3树的投票来预测随机森林分类的​​开箱概率。因此,在OOB准确性的情况下,您只需要一个训练集,而不需要验证或测试数据来预测未见数据的性能。在https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm检查袋外错误以便进一步研究。