我在二元分类任务中有一个不平衡的数据集,其中正数与负数分别为 0.3% 和 99.7%。正面和负面之间的差距是巨大的。当我使用 MNIST 问题中使用的结构训练 CNN 时,测试结果显示高假阴性率。此外,训练误差曲线在一开始的几个时期内迅速下降,但在接下来的时期内保持相同的值。
你能告诉我一个处理这个问题的方法吗?谢谢!
我在二元分类任务中有一个不平衡的数据集,其中正数与负数分别为 0.3% 和 99.7%。正面和负面之间的差距是巨大的。当我使用 MNIST 问题中使用的结构训练 CNN 时,测试结果显示高假阴性率。此外,训练误差曲线在一开始的几个时期内迅速下降,但在接下来的时期内保持相同的值。
你能告诉我一个处理这个问题的方法吗?谢谢!
发生这种情况是因为当您进行小批量时,小批量包含您的阳性样本的可能性非常小(考虑到此处的比例)。所以它最终会学习负类的模式,在几个 epoch 之后,所有东西都会被归类为负类。
有两种可能的方法来处理这种情况。
鉴于比例为 0.3% 到 99.7%,这是一个高度倾斜的数据集。每 1000 个样本几乎没有 3 个正类样本。我想说你应该通过获得更多积极的类来平衡数据集。去获取尽可能多的阳性样本。然后,您可以使用更平衡的数据集。例如,您可以获取 1000 个正样本,然后随机选择一组 1000 个负样本并构建分类器。现在,它应该能够同时学习这两个类。
在小批量后更新权重时使用加权误差度量。在任何 mini-batch 期间,权重与正类和负类的样本数成比例更新。现在,在目前的情况下,比例为 3:1000,即使这个技巧也可能行不通。因此,您可以尝试通过获取更多 297 个正样本并将它们与 1000 个负样本组合来将比例设置为 300:1000。然后使用 300:1000 的比例,您应该根据每个类中的样本数量对小批量期间的错误进行加权。这应该有效。
为什么要在这里使用 CNN?您是否考虑过其他实际处理不平衡数据的模型?
例如,我发现以下两种技术对我来说非常有效:
带有 SMOTE Boosting 的随机森林:使用一种SMOTE
对多数类进行欠采样并通过可调整的百分比对少数类进行过采样的混合。根据您的响应变量在训练集中的分布选择这些百分比。将此数据输入您的 RF 模型。始终交叉验证/执行网格搜索以找到适合您的 RF 的最佳参数设置。
XGBoost w/超参数优化:再次,交叉验证或执行网格搜索以找到模型的最佳参数设置。此外,xgboost
允许您使用 平衡正负类权重scale_pos_weight
。有关完整列表,请参阅参数文档。
我还应该补充一点,我正在处理的数据集具有相同的偏斜百分比,并且我能够获得 0.941 的敏感度得分和 0.71 的特异性xgboost
,这意味着该模型非常准确地预测了真正的阳性结果,这预示着对我来说很好。
(对不起,我不能发表评论,没有足够的声誉,我真的很想知道你为什么选择 CNN)
不平衡数据集是所有领域的常见问题,并不特别涉及计算机视觉和卷积神经网络 (CNN) 处理的问题。
为了解决这个问题,您应该尝试通过过度采样少数类或欠采样多数类(或两者)来平衡您的数据集。可以说,一个不错的选择是 SMOTE(合成少数过采样技术)算法,如上所述。在这里您可以找到不同过采样算法的比较。如果您是 Python 用户,那么不平衡学习是一个很好的库,它实现了许多有用的技术来平衡数据集。
另一方面,如果您尝试对图像进行分类,增加数据集大小的一个好方法是增加它(即通过创建合理的合成示例,例如相似的图像但相对于原始图像旋转/移动了一点点)。您有时可能会发现增加少数类以实现更好的平衡很有用。Keras ImageDataGenerator类是用于此目的的好工具。