在分类中,如何在数据集不平衡的情况下验证模型?

Posted

技术标签:

【中文标题】在分类中,如何在数据集不平衡的情况下验证模型?【英文标题】:In classification, how do you validate the model in case of imbalanced data set? 【发布时间】:2017-12-07 15:23:16 【问题描述】:

我是机器学习的初学者,并试图解决分类问题。我正在处理一个非常不平衡(顺序)的数据集(20k 记录中只有 2% 的正数),并且我正在使用 LSTM/GRUs 在 python 中使用 tensorflow 进行建模。

这就是我所做的: 加载数据。 将数据集拆分为 3 个数据集: A 培训 (70%) B 用于验证 (15%) C 测试 (15%); 对于每个数据集(A、B、C),对正类进行过采样,以便将正类的百分比从 2% 增加到 30%。这给了我 3 个更平衡的新数据集:A'、B'、C'

然后我使用 GRU 使用数据集 A' 训练我的模型。

我的目标:在我的测试集 C 上获得最高的 F 分数(有没有更好的指标?据我所知,F 分数取决于数据分布,即数据的倾斜程度。如果我的实际负数与正数比率增加然后精度降低(由于假阴性增加),但召回或多或少保持不变;所以我的整体 F 分数下降)

我的问题是:

我可以在训练时使用交叉熵作为我的成本函数吗? (我没有改变成本函数以对误报更敏感,因为我已经对我的正样本进行了过度采样)

我必须使用哪个数据集进行验证? B 还是 B'?我应该使用什么指标来绘制验证学习曲线以了解我的模型过度拟合的点? (目前我在 A'(训练)和 B'(验证)上都使用准确度来查看是否存在过度拟合。但 B' 上的准确度和 B 上的 f 分数似乎没有太大相关性。因为最终我想要在 C 上的 f 得分很好,这意味着我需要在 B 上给出良好 f 得分的模型)

提前感谢您的宝贵时间! 问候。

【问题讨论】:

当然,您应该测量不平衡数据集中的“准确性”(或任何其他指标),而不是更平衡的数据集。这样,您就可以根据真实数据衡量模型的性能。 yes.. 有道理.. 但在这种情况下我唯一的问题是我能否比较 A(平衡)和 B'(不平衡)上的指标,并绘制这两个指标是否存在过度拟合或不是.. 【参考方案1】:

(以下是一个长评论而不是完整的答案 - 我需要考虑一下。我希望我今晚/明天有时间更新它)

哪个集合应该是测试集?

我们正在使用一个测试集来估计真实分数(错误/准确率/F1 分数/召回/精度/...),因此,如果我们在所有可能的样本上测试模型(这将是非常大量的样本;例如,如果您收到 32x32 像素的灰度图像,它将是 256^1024 \约 10^2466)。

因此,您将 C 用于测试,而不是 C'。

哪个集合应该是验证集?

我们正在使用验证集来避免在测试集上过度拟合。通常用于提前停止。如果分数是优化目标,它应该是 B(不是 B')。如果分数不同,您可能想考虑两者如何齐头并进(例如,当优化目标变得更好时,分数也会变得更好吗?)。如果很多情况下不能齐头并进,就应该调整优化目标。

您拥有 F1 分数,并且正在考虑使用交叉熵作为优化目标。交叉熵忽略了类,因此你平衡了类。

edit:考虑一下,我会将 B 上的 F1 分数作为停止标准。其他选择也可能是有效的,但这似乎最有意义,因为应该最大化 F1 分数

应该使用哪一组作为训练集?

如果您选择 A,您将遇到问题,即您的网络学会始终预测更常见的类别。因此,您必须选择 A'。

【讨论】:

感谢您的评论,马丁。我只是想知道我是否可以在 B 上绘制 f 分数并将其用于提前停止,即我将保存在 B 上获得最佳 f 分数的模型。在 B 上绘制的其他选项是什么?相同的交叉熵?这有意义吗?因为我正在对平衡 A' 上的交叉熵进行训练/优化,并在不平衡 B 上绘制与我的验证曲线相同的交叉熵。 所以,从广义上讲,我在想如果优化我的目标函数,即在 A' 上交叉熵并为提前停止(并保存该模型)绘制验证曲线与在 C 上优化 f1 分数相同!!如果答案是肯定的,那我就完蛋了.. @msa:在 A' 上优化交叉熵与在 C 上优化 F1 不同。问题是这是否只是学术差异,两者都会导致相似的模型,或者如果训练有素模型实际上非常不同。我无法真正回答这个问题(但我按照承诺扩展了我的答案) 感谢您的评论!我在 B 上绘制了 f1 分数,结果让我感到有些惊讶。曲线(B 上的 f1 得分)并没有真正下降。同时,即使经过多次训练,它也非常不稳定!在 20 个奇数时期之后,我仍然可以看到 f1 分数有相当大的变化,而且它并没有稳定在某个值上。在我的情况下,它从 0.75 变化到 0.85,我认为这是巨大的。可能是由于事实上,我正在优化 A' 上的交叉熵,它更平衡,B 非常不平衡......您的见解将对此非常有帮助! 如有必要,我可以分享我的图(训练 A' 和验证 B 的精度、召回率和 f1 分数)..

以上是关于在分类中,如何在数据集不平衡的情况下验证模型?的主要内容,如果未能解决你的问题,请参考以下文章

CNN分类中验证损失减少,验证准确率下降

错误评估分类器训练和测试数据集不兼容

Weka 中的训练和测试集不兼容

如何在 sklearn 中对不平衡数据集执行交叉验证

如何在 keras 分类器中使用交叉验证

如何在管道中重新采样文本(不平衡组)?