使用卷积神经网络进行 F1 最大化。对于不平衡的数据集

数据挖掘 分类
2021-09-22 02:35:57

我正在处理二进制分类的不平衡数据集(大约 70% 到 30%)。我想知道在使用卷积神经网络时优化此类任务的 F1 分数的最佳方法是什么。

到目前为止,我正在对数据集进行采样以创建一个平衡的训练集,并使用 softmax_cross_entropy_with_logits 的平均值(来自 tf)和正则化项作为我的损失。

如何优化 F1 分数?因为它不是凸的,所以我不能把它当作我的损失,对吧?我发现的大多数论文都提到找到最佳阈值。但是,这些都比较老了,有没有更好的方法可以用于卷积神经网络?

2个回答

我有一篇论文,我们尝试通过使用不同的技术来最大化 F1 分数。我们希望像 RankNet 这样的排名算法能够获得比其他算法更好的 F1 分数。但正如您在我们的表格中看到的那样,即使不使用成本矩阵,常规神经网络也足够好。在类平衡之前创建合成样本,甚至使用 MetaCost 也基本上无关紧要。

F1 最大化表

在使用 RankNet 时,我们确实获得了 F1 增益,但这可能是由于我们将排名分数转换为类别的后处理。但这是一种痛苦。我认为你可以得到类似的结果,而不是使用 0.5 作为选择正类的阈值,而是选择一个仅使用训练数据来最大化 F1 分数的阈值。

在研究了一段时间的类不平衡之后,我认为这个主题是轻松获得许多出版物的好方法,但是,在现实世界中,后处理步骤和/或使用成本矩阵来平衡先验已经绰绰有余。

ps:请不要把这个结果当成圣杯。众所周知,神经网络难以优化,尤其是在一系列非常不同的数据集上。如论文中所述,进行了一些交叉验证,但由于时间不够,没有达到我们应有的程度。而且我们不允许那么多迭代。我会尝试在您自己的代码中引入权重和一些简单的东西,看看它是否有所作为。请让我知道它是如何工作的。

直接优化 F1 分数的问题不在于它是非凸的,而在于它是不可微的。典型神经网络的任何损失函数的表面都是高度非凸的。

相反,您可以做的是优化接近 F1 分数的代理函数,或者在最小化时产生良好的 F1 分数。一种方法是像往常一样使用类的权重简单地优化交叉熵 - 请参阅stackoverflow 上的这个答案。