为啥打乱训练数据会影响我的随机森林分类器的准确性?

Posted

技术标签:

【中文标题】为啥打乱训练数据会影响我的随机森林分类器的准确性?【英文标题】:Why does shuffling training data affect my random forest classifier's accuracy?为什么打乱训练数据会影响我的随机森林分类器的准确性? 【发布时间】:2021-02-02 19:04:50 【问题描述】:

同样的问题是asked。但由于 OP 没有发布代码,因此没有提供太多有用的信息。

我遇到了基本相同的问题,由于某种原因,改组数据使我的随机森林分类器的准确率大大提高(从 45% 到 94%!)。 (在我的情况下,删除重复项也会影响准确性,但这可能是另一天的讨论)根据我对 RF 算法工作原理的理解,这真的不应该发生。

我的数据是从多个文件合并而来的,每个文件都包含相同顺序的相同样本。对于每个样本,前 3 列是单独的输出,但目前我只关注第一个输出。

合并后的数据如下所示。输出(第一列)是有序且分布不均的:

洗牌后的数据如下所示:

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

TOTAL_OUTPUTS = 3

... (code for merging data and feature engineering)

to_compare = 
    "merged": merged,
    "merged shuffled": merged.sample(frac=1.0),
    "merged distinct": merged.drop_duplicates(),
    "merged distinct shuffled": merged.drop_duplicates().sample(frac=1.0)



params = 'n_estimators': 300,
          'max_depth': 15,
          'criterion': 'entropy',
          'max_features': 'sqrt'
          

for name, data_to_compare in to_compare.items():
    features = data_to_compare.iloc[:, TOTAL_OUTPUTS:]
    y = data_to_compare.iloc[:, 0]
    rf = RandomForestClassifier(**params)
    scores = cross_val_score(rf, features, y, cv=3)
    print(name, scores.mean(), np.std(scores))

输出:

merged 0.44977727094363956 0.04442305341799508
merged shuffled 0.9431099584137672 0.0008679933736473513
merged distinct 0.44780773420479303 0.04365860091028133
merged distinct shuffled 0.8486519607843137 0.00042583049485598673

【问题讨论】:

【参考方案1】:

您使用的未打乱数据表明,某些特征的值对于某些行往往是恒定的。这会导致森林变弱,因为构成它的所有单独的树都变弱了。

要看到这一点,请采取极端的推理;如果其中一个特征在整个数据集中是恒定的(或者如果您使用该数据集的一大块特征是恒定的),那么如果选择此特征,则不会带来任何熵变化。所以这个特性永远不会被选中,并且树不适合。

【讨论】:

感谢您的回复。但我不明白这如何回答我的问题:如果确实存在常量特征并使模型更弱,那么改组数据如何解决问题?另外,我想向您保证,数据中不存在常量特征。这些功能是从 700 多个功能中选择的,我已手动检查每个功能是否提供了相当高的信息增益。 仔细阅读:我的假设是某些特征在“某些行上”是恒定的,而不是一直。 CV 过程将在部分数据集上训练模型。在这些部分中,如果数据集未打乱,则有可能某些特征确实是恒定的。这会产生脆弱的树木和脆弱的森林。 你完全正确!我总是将 KFold 与 shuffle=True 一起使用,我完全忘记了更天真的 cv= (some int) 只是“拆分”数据,而不是随机选择样本进行训练/测试。非常感谢! 真正的原因是 RF 是一个贪心算法,因此特征的顺序很重要 好吧,在一定程度上同意,如果您将“presented”更改为“sampled”,因为顺序本身也不重要,所有功能都已尝试并选择最佳。

以上是关于为啥打乱训练数据会影响我的随机森林分类器的准确性?的主要内容,如果未能解决你的问题,请参考以下文章

随机森林回归器的特征选择

如何测量随机森林分类器的准确性?

随机森林

更改随机森林分类器的阈值

R语言数据分析|随机森林

为啥以两种不同方式应用随机森林分类器的特征选择结果不同