首页 > 解决方案 > 为什么打乱训练数据会影响我的随机森林分类器的准确性?

问题描述

有人过同样的问题。但由于 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

标签: machine-learningscikit-learnmodelrandom-forest

解决方案


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

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


推荐阅读