machine-learning - 为什么打乱训练数据会影响我的随机森林分类器的准确性?
问题描述
有人问过同样的问题。但由于 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
解决方案
您使用的未打乱数据表明某些特征的值对于某些行往往是恒定的。这导致森林变弱,因为构成它的所有单独的树都变弱了。
要看到这一点,请采取极端的推理;如果其中一个特征在整个数据集中是恒定的(或者如果您使用该数据集的一大块特征是恒定的),那么如果选择此特征,则不会带来任何熵变化。因此永远不会选择此功能,并且树不适合。
推荐阅读
- javascript - 如何传播数组的内部数组元素?
- php - 按另一个数组中的值对数组进行排序
- multithreading - 为什么比较和交换(CAS)算法是无锁同步的好选择?
- node.js - 将 ChaiHttp 与 beforeEach 或 before 方法一起使用
- javascript - 如何在 React Native 中获取 TextInput 相对于其父级或屏幕的光标位置
- javascript - 如何从 CSS 变换矩阵计算动画关键帧或时间偏移?
- excel - 如何遍历每个切片器项目,但不包括那些没有数据的项目 - 在 VBA 中?
- linux - 如何使用 sed 将字符串替换为数字?
- node.js - 如何使用 nodemailer 从 squirrelmail 发送邮件?
- java - 一项活动可以失去其意图附加功能吗?