我正在参加一个黑客马拉松,我们的任务是根据性别、城市、培训时长、经验、当前公司等特征来预测用户是否对工作感兴趣。
在训练集中,约有90%的人对工作不感兴趣,而只有10%的人感兴趣。但是在他们发布的公共测试集中,这两个类别的比例各占50%,而我的验证准确率始终无法超过55%,尽管训练准确率达到了99%。
测试和训练数据中都有缺失值,我使用RBM来填补这些缺失值。
我的问题是:
验证准确率低是因为类别比例的不平衡,还是因为错误地填补了缺失值?
回答:
解释:
我认为你首先需要重新采样你的数据,因为你的算法学到了大多数人对工作不感兴趣,这在仅看你的训练数据分布时是正确的(90%不感兴趣,10%感兴趣)。你的算法总是假定答案是“不感兴趣”。这就是为什么你在训练集上能达到高准确率的原因。
在你的测试数据中,分布变为了50%:50%。你的算法仍然假定所有人都是“不感兴趣”的,并且在预测感兴趣的人时失败了。(你的测试集准确率下降到大约50%)
如何解决这个问题:
重新采样你的训练数据,使其与训练集中的50%:50%分布相匹配。有不同的重新采样方法可用。一些例子包括:
- 欠采样
- 过采样
- 合成少数类过采样技术(SMOTE)
欠采样:通过移除项目来下采样多数类。在你的情况下,将是(10%感兴趣和10%不感兴趣)。缺点是你只会在20%的可用训练数据上进行学习。
过采样:通过添加冗余点来上采样少数类。优点:你会使用所有数据。缺点:可能导致过拟合。
SMOTE:一种更复杂的过采样方法,它添加合成样本。
我建议先尝试使用简单的过采样,看看是否能解决你的问题。
对于Python,你可以使用名为imbalanced-learn的包,其中包含了这里提到的所有方法。