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



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

提前谢谢。

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

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β损失(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()

本文介绍了一种替代方法:

https://arxiv.org/abs/1608.04802

所采取的方法优化了统计数据的下限。还讨论了AUROC和AUCPR等其他指标。这种方法在TF中的实现可以在这里找到:

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

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

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

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

还要检查线程是否安全-不正确-循环-二进制规则-分类-设置

如果你想以不同的方式衡量阳性和阴性病例,有两种方法是

  • 对少数类进行过采样,并在预测新示例时更正预测概率。对于更高级的方法,请查看imbalanced-learn的欠采样模块以获得概述
  • 对于训练失利,使用不同的正确评分规则。这允许在保持校准的同时,在如何处理阳性和阴性病例方面建立不对称性。以下是对该主题的回顾

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

损失值和准确性是一个不同的概念。损失值用于训练NN。然而,准确性或其他指标是对训练结果的评估。

最新更新