训练数据不平衡——但我的验证集也应该如此吗?

机器算法验证 机器学习 神经网络 交叉验证 数据集 不平衡类
2022-03-07 08:31:34

我标记了由 10000 个正例和 50000 个负例组成的数据,总共给出了 60000 个示例。显然这个数据是不平衡的。

现在让我们说我想创建我的验证集,并且我想使用 10% 的数据来执行此操作。我的问题如下:

我应该确保我的验证集也是不平衡的(作为对训练集真实分布的认可),还是应该确保我的验证集是平衡的?因此,例如,我的验证集是否应该来自:

  • 10% 正面示例 + 10% 负面示例,给出 1000+ 和 5000- 示例。(这个验证集反映了原始数据的不平衡)。
  • 或者验证集应该由 10% 的正例、1000+ 和 (10/5 = 2%) 的负例组成,同时给出 1000 个示例?

(测试集的相同问题)。

似乎有很多方法可以用不平衡的数据进行训练,但是我在哪里找不到关于我的验证集是否也应该反映原始不平衡的最佳实践。最后,我不做交叉验证,我将使用单个验证集和神经网络。

谢谢!

3个回答

验证集的重点是选择神经网络最有可能在测试集上表现最好的时期/迭代。随后,验证集中类的分布最好反映测试集中类的分布,以便验证集的性能指标很好地近似测试集的性能指标。换句话说,验证集应该反映原始数据的不平衡。

使用自然不平衡的训练和测试数据,我遇到了这样一个场景,我的模型似乎随着时间的推移而改进,但实际上只是记住了训练集中的少数类样本,并学习总是预测其他所有内容的多数类。

我通过平衡我的测试数据来诊断这个问题,并观察到测试数据的准确性和损失随着更多的时期而变得更糟(不平衡的测试数据并非如此)。

诊断此类问题的另一种方法是使用单个类的敏感性、特异性或准确性等指标,而不是查看整体准确性/损失。这篇博客文章对此进行了更详细的介绍,并在 Keras http://www.deepideas.net/unbalanced-classes-machine-learning/中提供了这些指标的示例实现

我认为正确的解决方案取决于您的模型在现实世界中的应用以及少数类的准确性有多重要。例如,如果您正在训练诸如 imagenet 之类的东西,并注意到它的“海蛞蝓”类的准确度较低,那可能还可以。但是,如果您正在训练一个模型来预测某人是否患有癌症,那么少数类的准确性将非常重要。

这取决于您要优化什么:您的目标分布是什么,您希望在哪个分布上最小化预期损失?如果它与训练分布相同,那么验证数据应该遵循相同的分布。如果它是一个不同的分布(例如,您希望您的算法在平衡数据上表现良好),您实际上希望最小化该分布的预期损失并且您的验证集应该相应地根据该分布进行采样。这种情况称为“协变量偏移”,有一个完整的研究分支研究所谓的“协变量偏移适应”,即处理这个问题。Sugiyama / Kawanabe 于 2012 年出版了一本关于该主题的书,名为“