如何最大化召回率?

数据挖掘 机器学习 神经网络 深度学习 喀拉斯 图像分类
2021-09-23 01:38:07

我对机器学习有点陌生。

我正在使用神经网络对图像进行分类。有两个可能的类。Sigmoid在最后一层使用激活,所以图像的分数在 0 到 1 之间。

当神经网络不确定图像的类别时,我预计分数有时会接近 0.5,但所有分数要么是 1.0000000e+00(我猜是因为四舍五入)要么非常接近于零(例如 2.68440009e -15)。一般来说,这是好事还是坏事?如何避免这种行为?

在我的用例中,我想通过设置较低的阈值来优化召回率,但由于我上面描述的原因,这没有影响。

更一般地说,在训练神经网络只关心我的非临时损失时,如何最大限度地减少假阴性的数量?我可以稍微降低准确性以增加召回率。

4个回答

要回答最后一个问题,假设您有一个二元分类问题。通常,如果 的输出Sigmoid大于0.5,则将类标记为正,如果小于 ,则将其标记为负0.5为了提高召回率,您可以将此阈值更改为小于0.5,例如0.2对于您可能需要更高精度的任务,您可以将阈值增加到比0.5.

关于您问题的第一部分,它在很大程度上取决于您的数据及其特征空间。存在数据在更高维度上线性可分的问题,这意味着您可以轻松地仅使用单个神经元通过单个超平面对数据进行分类。如果碰巧你有这么好的准确性,除非你试图找到交叉验证错误的值,否则你什么也说不出来。通过解释训练数据值与交叉验证或测试数据之间的差异,您可以确定您的分类器是否表现良好。

训练以避免假阴性

你的网络学习什么取决于你传递给它的损失函数。通过选择此功能,您可以强调各种事情 - 整体准确性、避免误报、误报等。

在您的情况下,您可能将交叉熵损失与 softmax 分类器结合使用。虽然 softmax 在所有类中组合时将预测值压缩为 1,但交叉熵损失将惩罚实际地面实况与预测之间的距离。在这个计算中,它不会考虑“假阴性”预测的值是多少。换句话说:损失函数只关心正确的类及其相关的预测,而不关心所有其他类的值。

由于您想避免误报,因此这种行为可能正是您所需要的。但是,如果您还想要实际类和错误预测之间的距离,另一个考虑错误值的损失函数甚至可能会更好地为您服务。给你的高精度,这会带来整体性能下降的风险。

那该怎么办?

做出错误的预测并对此非常肯定并不少见。您可以查看数以百万计的内容,因此您最好的猜测可能是调查错误。例如,您可以使用混淆矩阵来识别哪些类与哪些混合的模式。如果存在结构,您可能需要某个类别的更多样本,或者您的训练数据中可能存在标记错误。

另一种方法是手动查看所有(或部分)错误示例。一些非常基本的东西,例如在表格中列出错误并尝试查找特定特征,可以指导您完成需要做的事情。例如,如果您的网络通常会错误地处理“困难”示例,这将是可以理解的。但是可能还有其他一些清晰的系统由于缺少数据而导致您的网络尚未启动?

我想在这里提一件事。您正在使用哪种损失函数?根据您的结果,我推断如果您使用 Keras,您正在使用带有参数的交叉熵from_logits = True(这将解释上述现象),并且您可以选择from_logits = True将其设置为 false。我还建议使用label_smoothing = 0.1或更多(取决于您的需要)。如果是您的情况,我会留给您指向 TensorFlow 交叉熵文档的链接。

您可以训练网络以优化召回率而不是准确率。

from tensorflow.keras.metrics import Recall
model.compile(metrics=[Recall()])

您可以增加课程的权重。

model.fit(class_weight={0: 1., 1: 3.}) #weight class 0 once and class 1 three times