分类准确率低

数据挖掘 机器学习 分类 多类分类 预言 过拟合
2022-03-07 09:31:18

我想做一个有 6 个类的多类分类。整个数据集有 12750 个和 56 个特征样本,因此每个类有 2125 个样本。在预测之前,我通过 Winsorization 减少了异常值的数量(对于 1% 和 99%),并通过 Yeo-Johnson 变换减少了偏度大于 1 且小于 -1 的特征的偏度,我得到了数据集:

https://i.stack.imgur.com/miy8i.png

后来,当然,我将数据集拆分为 80% 的训练数据和 20% 的测试数据,并对训练数据进行了标准化。我尝试使用随机森林、xgboost 和决策树分类器,但我在训练集上的准确度几乎为 100%,在测试集上的准确度为 20-21%。像增加 n_estimators 这样的方法没有帮助。

所以,我的问题是:

如何减少这种过度拟合?是数据集的问题(我应该减少类似的特征数量吗?)还是分类器的问题(对于这个问题来说它们太弱了吗?)

对于这个问题,数据集是否太小(我应该通过 SMOTE 之类的方法添加更多样本吗?)?班级的样本太少而不能很好地工作吗?

调整超参数后是否有可能获得至少 60% 的准确率(例如通过 GridSearchCV 之类的方法)?

PS 我要补充一点,与目标值的相关性非常差(最大值 +- 6%),我看到随机森林的特征重要性值在 0.0 到 0.03 之间。我不知道这是不是正常情况。

PS2 我尝试更改 n_estimators 参数(值从 5 到 1500)和 max_depth(从 1 到 100),我可以看到测试精度的变化非常差(+-3%)

2个回答

我能想到的东西很少:

  1. 您是否对训练/测试集使用了分层拆分?
  2. 尝试使用验证集并根据验证损失进行提前停止。
  3. 尝试使用 N 折交叉验证。
  4. 为您的模型添加正则化并使用 GridSearchCV 来处理它们的参数。

如果不查看您的数据,很难说更多特别的话。

几点评论:

  • 首先,你说每个类都有 2125 个样本:我很惊讶它完全平衡,这是数据的真实分布吗?人为地平衡类是错误的,尤其是在训练集和测试集分开之前。
  • 原则上,预处理应该仅基于训练集进行,但这不太可能在这里造成严重的问题。
  • 当模型捕获训练数据中偶然发生的事情而不是真实模式时,就会发生过度拟合,这可能是因为它没有足够的实例,或者是因为它试图找到过于微妙的细节。生成人工实例并不总是有效,因为它破坏了数据的分布。所以最简单的解决方案就是让模型更简单:减少特征数量,减少参数数量(例如树的深度)等。
  • 请记住,随机基线分类器在 6 个类中只能获得 16.6% 的准确率。所以 20% 并没有那么糟糕,这取决于任务的难度,即特征对确定目标的帮助程度。根本无法保证任何数据和任何任务都可以达到 60%。然而,必须有可能不过度拟合模型,即在训练集和测试集上获得非常相似的性能。