Scikit-learn 中随机森林训练前的预随机化

Posted

技术标签:

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

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

有什么智慧之言吗?

【问题讨论】:

如果您可以共享数据/代码。社区会更好地帮助你。您可能会犯一些错误。 【参考方案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 错误以供进一步研究。

【讨论】:

以上是关于Scikit-learn 中随机森林训练前的预随机化的主要内容,如果未能解决你的问题,请参考以下文章

SciKit-Learn 随机森林子样本大小如何可能等于原始训练数据大小?

在 scikit-learn 中平均多个随机森林模型

在 64 位 python 上训练的 Scikit-Learn 随机森林不会在 32 位 python 上打开

如何在 scikit-learn 的随机森林的 graphviz-graph 中找到一个类?

Python 中用 XGBoost 和 scikit-learn 进行随机梯度增强

有没有一种方法可以用决策树/随机森林进行迁移学习?