如何使用 F-score 作为误差函数来训练神经网络?
How to use F-score as error function to train neural networks?
我对神经网络还很陌生。我正在用 tensorflow 训练一个网络,但在我的数据集中(它是一个医学数据集),正例的数量远少于负例。
所以,我知道根据精确率和召回率计算出的 F 分数是衡量模型训练效果的一个很好的指标。
我以前用过像交叉熵损失或MSE这样的误差函数,但它们都是基于精度计算的(如果我没记错的话)。但是如何将这个 F-score 用作误差函数呢?有张量流函数吗?或者我必须创建一个新的?
提前致谢。
我认为您将 class化的模型评估指标与训练损失混淆了。
准确性、精确度、F 分数等是根据二元结果和二元预测计算的评估指标。
对于模型训练,您需要一个函数来比较连续分数(您的模型输出)和二元结果——例如交叉熵。理想情况下,这是经过校准的,以便在预测均值与总体均值(给定协变量)匹配时将其最小化。这些规则称为proper scoring rules,交叉熵就是其中之一。
同时检查线程is-accuracy-an-improper-scoring-rule-in-a-binary-classification-setting
如果你想不同地权衡正例和负例,两种方法是
- 对少数 class 进行过采样,并在对新示例进行预测时更正预测概率。对于更高级的方法,请查看
imbalanced-learn
的欠采样模块以获得概览。
- 对训练损失使用不同的正确评分规则。这允许例如在保持校准的同时,在处理正面和负面案例的方式上建立不对称性。 Here 是对主题的评论。
我建议在实践中只使用简单的过采样。
似乎已经设计并成功使用了直接针对这些类型的指标进行优化的方法,从而提高了评分和/或训练时间:
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()
本文介绍了另一种方法:
https://arxiv.org/abs/1608.04802
所采用的方法针对统计数据的下限进行了优化。还讨论了其他指标,例如 AUROC 和 AUCPR。可以在此处找到这种方法在 TF 中的实现:
https://github.com/tensorflow/models/tree/master/research/global_objectives
损失值和准确率是不同的概念。损失值用于训练神经网络。但是,准确性或其他指标是对培训结果的评价。
我对神经网络还很陌生。我正在用 tensorflow 训练一个网络,但在我的数据集中(它是一个医学数据集),正例的数量远少于负例。 所以,我知道根据精确率和召回率计算出的 F 分数是衡量模型训练效果的一个很好的指标。 我以前用过像交叉熵损失或MSE这样的误差函数,但它们都是基于精度计算的(如果我没记错的话)。但是如何将这个 F-score 用作误差函数呢?有张量流函数吗?或者我必须创建一个新的?
提前致谢。
我认为您将 class化的模型评估指标与训练损失混淆了。
准确性、精确度、F 分数等是根据二元结果和二元预测计算的评估指标。
对于模型训练,您需要一个函数来比较连续分数(您的模型输出)和二元结果——例如交叉熵。理想情况下,这是经过校准的,以便在预测均值与总体均值(给定协变量)匹配时将其最小化。这些规则称为proper scoring rules,交叉熵就是其中之一。
同时检查线程is-accuracy-an-improper-scoring-rule-in-a-binary-classification-setting
如果你想不同地权衡正例和负例,两种方法是
- 对少数 class 进行过采样,并在对新示例进行预测时更正预测概率。对于更高级的方法,请查看
imbalanced-learn
的欠采样模块以获得概览。 - 对训练损失使用不同的正确评分规则。这允许例如在保持校准的同时,在处理正面和负面案例的方式上建立不对称性。 Here 是对主题的评论。
我建议在实践中只使用简单的过采样。
似乎已经设计并成功使用了直接针对这些类型的指标进行优化的方法,从而提高了评分和/或训练时间:
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()
本文介绍了另一种方法:
https://arxiv.org/abs/1608.04802
所采用的方法针对统计数据的下限进行了优化。还讨论了其他指标,例如 AUROC 和 AUCPR。可以在此处找到这种方法在 TF 中的实现:
https://github.com/tensorflow/models/tree/master/research/global_objectives
损失值和准确率是不同的概念。损失值用于训练神经网络。但是,准确性或其他指标是对培训结果的评价。