训练集和测试集中的类别比例不平衡会导致验证准确率低吗?

我正在参加一个黑客马拉松,我们的任务是根据性别、城市、培训时长、经验、当前公司等特征来预测用户是否对工作感兴趣。

在训练集中,约有90%的人对工作不感兴趣,而只有10%的人感兴趣。但是在他们发布的公共测试集中,这两个类别的比例各占50%,而我的验证准确率始终无法超过55%,尽管训练准确率达到了99%。

测试和训练数据中都有缺失值,我使用RBM来填补这些缺失值。

我的问题是:

验证准确率低是因为类别比例的不平衡,还是因为错误地填补了缺失值?


回答:

解释:

我认为你首先需要重新采样你的数据,因为你的算法学到了大多数人对工作不感兴趣,这在仅看你的训练数据分布时是正确的(90%不感兴趣,10%感兴趣)。你的算法总是假定答案是“不感兴趣”。这就是为什么你在训练集上能达到高准确率的原因。

在你的测试数据中,分布变为了50%:50%。你的算法仍然假定所有人都是“不感兴趣”的,并且在预测感兴趣的人时失败了。(你的测试集准确率下降到大约50%)

如何解决这个问题:

重新采样你的训练数据,使其与训练集中的50%:50%分布相匹配。有不同的重新采样方法可用。一些例子包括:

  • 欠采样
  • 过采样
  • 合成少数类过采样技术(SMOTE)

欠采样:通过移除项目来下采样多数类。在你的情况下,将是(10%感兴趣和10%不感兴趣)。缺点是你只会在20%的可用训练数据上进行学习。

过采样:通过添加冗余点来上采样少数类。优点:你会使用所有数据。缺点:可能导致过拟合。

SMOTE:一种更复杂的过采样方法,它添加合成样本。

我建议先尝试使用简单的过采样,看看是否能解决你的问题。

对于Python,你可以使用名为imbalanced-learn的包,其中包含了这里提到的所有方法。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注