【问题标题】:Pre-randomization before random forest training in Scikit-learnScikit-learn 中随机森林训练前的预随机化
【发布时间】:2016-05-27 04:29:10
【问题描述】:

通过预先随机化训练集,我使用 sklearn.ensemble.RandomForestClassifier 获得了惊人的显着性能提升(+10% 的交叉验证准确率)。 这让我很困惑,因为 (a) RandomForestClassifier 无论如何都应该随机化训练数据;和 (b) 为什么例子的顺序如此重要?

有什么智慧之言吗?

【问题讨论】:

  • 如果您可以共享数据/代码。社区会更好地帮助你。您可能会犯一些错误。

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


【解决方案1】:

我也遇到了同样的问题,发了question,幸运的是得到了解决。

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

一个极端的例子是,如果您有 50 行所有 A 类的样本,然后是 50 行所有 B 类的样本,并且您在中间手动进行训练测试拆分。该模型现在用所有 A 类样本进行训练,但用所有 B 类样本进行测试,因此测试准确率为 0。

在 scikit 中,train_test_split 默认会进行洗牌,而KFold class 不会。因此,您应该根据您的上下文执行以下操作之一:

  • 先打乱数据
  • 将 train_test_split 与 shuffle=True 一起使用(同样,这是默认设置)
  • 使用 KFold 并记住设置 shuffle=True

【讨论】:

    【解决方案2】:

    示例的顺序根本不应该影响射频性能。注意无论如何,Rf 性能在运行期间可能会有 1-2% 的差异。您是否在训练之前单独保留交叉验证集?(只是确保这不是因为交叉验证集每次都不同)。另外通过随机化,我假设您的意思是更改示例的顺序。

    您还可以检查训练集本身在两种情况下分类器的 Out of Bag 准确性,您不需要单独的 RF 交叉验证集。

    在随机森林的训练过程中,训练每棵树的数据是从训练数据中通过放回抽样得到的,因此每个训练样本没有用于大约1/3的树。我们可以使用这 1/3 树的投票来预测随机森林分类的​​开箱概率。因此,对于 OOB 准确性,您只需要一个训练集,而不是验证或测试数据来预测未见数据的性能。在https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm 处检查 Out of Bag 错误以供进一步研究。

    【讨论】: