如何动态调整准确率与召回率?

概念

对于准确率与召回率的概念,虽然有很多文章介绍了,但是很多人还是不容易形成直觉的理解。这里不谈公式,结合一个通俗的例子,帮助大家理解。

例子:有100个人,1人患有癌症。我们对其进行预测,然后再计算每种预测的准确率与召回率。

准确率与召回率是相对于样本来说的,也就是要先定义什么是正。我们这里将“有癌症”定义为正,那么没有癌症就是负。

他们还有另一对名字,更直观也更容易理解:

  1. 准确率也叫查准率。只管所预测为正的情况下,有多准确。
  2. 召回率也较查全率。只管真实为正的样本中,你找出了几个。
预测情况 准确率/查准率 召回率/查全率
将100人全部预测为有癌症 1% (预测100个为正,结果只有1个是对的) 100%(真实结果中有1个正赝本,被找出来了)
将100人全部预测为没有癌症 未定义 0% (没有找出任何真实的正样本)
预测了2个有癌症,其中有一个是正确的 50% (2个中有一半正确) 100% (全部找出了真实的正样本)
全部预测正确 100% 100%
全部预测错误 0% 0%

动态调整模型的准确率与召回率

有什么用?

在不同的任务中,可能对准确率与召回率有不同的要求。本篇文章要讨论的问题是在模型已经训练完成后,如果在不重新训练模型的情况下,调整其预测的准确率与召回率。也就是说,将一个模型发布后,不同的使用者可以使用同一个模型去完整不同的任务。

二分类

在二分类任务中,模型输出一般为0到1之间的一个数值,记为,如果大于0.5,我们预测为正,否则为负。这里的0.5代表一个阈值,记为,则分类标准如下:

要调整准确率与召回率,直接调整s就行了。增大s,准确率上升,召回率下降;减少s,准确率下降,召回率上升。

如何理解?

模型的输出可以代表信心(也就是模型预测样本为正的确信程度)。阈值增加,则表示需要更大的信心才会预测为正,这时准确率必然增加;同时,阈值的增加导致所预测正样本的减少,找出正样本的可能性就会降低,从而导致召回率的下降。

多分类

在多分类任务中,模型会输出一个Category分布,比如3分类,一个可能的输出是[0.1, 0.2, 0.7]。在深度学习模型中,我们一般使用一个softmax函数来生成中的分布。记前一层的输出为, 最终的输出为, 则:

要调整类别1所对应的准确率召回率,我们直接调整就行了(增加/减少一个值)。增加,类别1的的召回率增加,准确率下降;同时,类别2、类别3的召回率下降,准确率增加。

如何理解?

增加,类别1所对应的概率会增加,其它类别的概率则会降低。人为提升概率,会导致其预测正样本的概率增加,从而导致召回率的上升,其它类别的情况则相反。

序列标注

在NLP中,分词、词性、NER都被转化为序列标注任务进行处理。序列标注任务也就是序列分类任务。学会了分类任务准确率召回率调整方法,调整序列标注任务也就不难了。以NER任务为例:

标签 ...
O
B-LOC
I-LOC
... ... ...

现在主流的序列标注模型是BI-LSTM-CRF、BERT-CRF等,都是先使用一个神经网络计算每个字每个类别的分数,然后再通过CRF层进行调整。我们可以通过调整进入CRF之前的分数,从而达到调整准确率与召回率的目的。(BI-LSTM-CRF和CRF的PyTorch通用实现可以参考开源库bi-lstm-crf)

在上面的表格种,每一列对应一个字的多分类的分数,这些分数的范围没有经过归一化,范围是整个,但是调整的方法还是一样的,直接修改这些分数就行了。

比如通过增加"O"标签对应的分数,"O"标签对应的最终概率就会提升,跟实体相关的标签(B-LOC, I-LOC, ...)的概率则会下降,这样NER的召回率就会下降,准确率则会上升。

如果确定调整的数值?

通过实验法,拿一个带标注的数据集作为测试集,使用不同的调整数值,跑完整个测试集上,并计算准确率与召回率。这样就会得到2根曲线,一条对应准确率、一条对应召回率,横坐标对应不同的调整数值。然后根据需要选择对应的调整数值即可。

你可能感兴趣的:(如何动态调整准确率与召回率?)