如何使用 F-score 作为误差函数来训练神经网络?

Ari*_*dam 5 python precision-recall tensorflow loss-function

我对神经网络很陌生。我正在 tensorflow 中训练一个网络,但是在我的数据集(它是一个医学数据集)中,正例的数量远远少于负例。所以,我知道根据精度和召回率计算的 F 分数是衡量模型训练效果的一个很好的衡量标准。我之前使用过交叉熵损失或 MSE 之类的误差函数,但它们都是基于准确度计算的(如果我没记错的话)。但是我如何使用这个 F-score 作为误差函数呢?是否有 tensorflow 函数?或者我必须创建一个新的?

提前致谢。

Jin*_*ing 6

似乎已经设计并成功使用了直接针对这些类型的指标进行优化的方法,从而提高了评分和/或训练时间:

https://www.kaggle.com/c/human-protein-atlas-image-classification/discussion/77289

https://www.kaggle.com/c/human-protein-atlas-image-classification/discussion/70328

https://www.kaggle.com/rejpalcz/best-loss-function-for-f1-score-metric

一种这样的方法涉及使用概率的总和来代替计数,用于真阳性、假阳性和假阴性度量的集合。例如,F-beta 损失(F1 的泛化)可以用 Python 中的 Torch 计算如下:

def forward(self, y_logits, y_true):
    y_pred = self.sigmoid(y_logits)
    TP = (y_pred * y_true).sum(dim=1)
    FP = ((1 - y_pred) * y_true).sum(dim=1)
    FN = (y_pred * (1 - y_true)).sum(dim=1)
    fbeta = (1 + self.beta**2) * TP / ((1 + self.beta**2) * TP + (self.beta**2) * FN + FP + self.epsilon)
    fbeta = fbeta.clamp(min=self.epsilon, max=1 - self.epsilon)
    return 1 - fbeta.mean()
Run Code Online (Sandbox Code Playgroud)

本文描述了另一种方法:

https://arxiv.org/abs/1608.04802

所采用的方法优化了统计的下限。还讨论了其他指标,例如 AUROC 和 AUCPR。可以在此处找到这种方法的 TF 实现:

https://github.com/tensorflow/models/tree/master/research/global_objectives


Mat*_*nik 5

我认为您将分类的模型评估指标与训练损失混淆了。

准确度、精确度、F 分数等是根据二元结果和二元预测计算得出的评估指标。

对于模型训练,您需要一个将连续分数(模型输出)与二元结果(例如交叉熵)进行比较的函数。理想情况下,对其进行校准,以便在预测平均值与总体平均值(给定协变量)匹配时将其最小化。这些规则称为适当的评分规则,交叉熵就是其中之一。

另请检查线程is-accuracy-an-improper-scoring-rule-in-a-binary-classification-setting

如果您想以不同的方式权衡正面和负面案例,有两种方法:

  • 在预测新示例时对少数类进行过采样并纠正预测概率。对于更高级的方法,请检查欠采样模块imbalanced-learn以获取概述。
  • 对训练损失使用不同的适当评分规则。例如,这可以在保持校准的同时,在处理正面和负面案例的方式上建立不对称性。是对该主题的回顾。

我建议在实践中仅使用简单的过采样。