AUC、精确率和召回率

  在二分类中我们经常遇见这样那样的指标,而我最搞不清楚或者记不清楚的就是AUC、精确率(Precision或者查准率),召回率(recall或者叫查全率),这次我总结一下我看到的一些攻略,以后再记不清楚的时候就来看看。

精确率(Precision),召回率(recall)

  这两个是最记不清楚的,属于一看就会,一考就忘的知识点,因为太容易混乱了(个人感觉,主要是分母,分子大家都知道是TP),我总结下我个人认为最容易记住的一种方法:首先明确的是这两个指标都是对正样本来说的。

精确率:针对样本预测结果来考虑的。对于样本的正预测结果,就只有两种情况:

  • 1、真实为正样本,预测也是正样本(TP)
  • 2、真实为负样本,预测为了正样本(FP)
    所以最终公式为:P = TP /(TP+FP)

召回率:针对样本真实结果来考虑的。对于正样本的预测结果,就只有两种情况:

    • 1、真实为正样本,预测也是正样本(TP)
    • 2、真实为正样本,预测却为负样本(FN)
      所以最终公式为:R = TP /(TP+FN)

AUC指标

  这个指标其实和上面的精确率和召回率没有太大的联系(只不过指标间叫法不同),不过也是能反应分类器的效果的。AUC其实是一个面积,是ROC曲线下的面积。什么是ROC曲线呢?ROC曲线的x轴为:伪阳性率(false positive rate),ROC曲线的y轴为:真阳性率(true positive rate),计算公式如下:

伪阳性率=(FP)/(FP+TN)

真阳性率=(TP)/(TP+FN)

  注意这个真阳性率的公式其实和前面的Recall计算方式是一样的,因此ROC曲线的y轴其实就是Recall的计算。

  对于一个分类器分类出的结果,我们就可以进行画出这个结果的ROC曲线了,并且进一步求取这个去曲线下面积就可以得到AUC这个指标了。下面举一个例子来说明到底怎么画出这个曲线。

  假设一个分类器f是判断图片是不是猫的图片,我们现在有一组样本x,真实标签是y=(1,0,1,0,0,1,0)我们根据这个f可以预测出x的预测值(这里的预测值应该是样本是猫的概率),y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)。接下来我们需要设置阈值,来确定到底是多少概率以下判断为0(不是猫),这个阈值的确定就会影响到我们最终的推断结果(例如我的阈值设定为0.1,则2号样本也会被判定成猫1,但是我的阈值设定为0.5,那2号样本就会判定成不是猫0)。换句话说,我们定义了不同的阈值将会得到不同的样本的判定结果,不同的判定结果我们将会有不同的(伪阳性率, 真阳性率),当我们的阈值从0遍历到1,我们将会得到一系列的"点"(伪阳性率, 真阳性率),而这些点就是ROC曲线上的点了。例如:

阈值=0.1,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(1,1,1,1,1,1,1),我们可以和真正的标签y=(1,0,1,0,0,1,0),得到伪阳性率=1,真阳性率=1
阈值=0.2,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(1,1,1,1,1,1,1),得到伪阳性率=1,真阳性率=1
阈值=0.3,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(1,0,1,1,1,1,1),得到伪阳性率=0.75,真阳性率=1
阈值=0.4,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(1,0,1,1,0,1,1),得到伪阳性率=0.5,真阳性率=1
......
阈值=0.65,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(1,0,1,0,0,1,0),得到伪阳性率=0,真阳性率=1
阈值=0.75,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(0,0,1,0,0,1,0),得到伪阳性率=0,真阳性率=0.666
阈值=0.85,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(0,0,1,0,0,0,0),得到伪阳性率=0,真阳性率=0.3333
阈值=0.95,则y'=(0.7, 0.2, 0.9, 0.6, 0.3, 0.8, 0.5)——>y'=(0,0,0,0,0,0,0),得到伪阳性率=0,真阳性率=0

  得到了需许多的"点"(1,1)(1,1)(0.75,1)(0.5,1)(0,1)(0,0.66)(0,0.33)(0,0),我们就可以根据这些点画出ROC图像来了(上述例子我们的阈值只取了几个值,实际中应该是0到1的所有很多很多值才能拟合出这个ROC曲线)。既然图像都画出来了,AUC指标也就可以计算出来了。

通过sklearn包来计算AUC指标

  在机器学习Python包sklearn已经为我们集成了这样一个函数,方便我们计算二分类或者多分类的AUC指标。下面是示例代码。

from sklearn.metrics import roc_auc_score

AUC = roc_auc_score(y_true, y_pre, average='macro')

  其中比较重要的参数是:

  • y_true : 真实样本的标签如果是二分类则为[0,1,0,1,1,...],如果是多分类则为[0,1,2,1,3,1,0,0,...]
  • y_pre  : 如果是二分类则为[0.1, 0.34, 0.12,....]每个元素表示属于1的概率。如果是多分类,则为二维度数组[[0.1, 0.2, 0.7],[0.9, 0.04, 0.06],....] 第i行表示第i个样本属于各类的概率值
  • average:{‘micro’, ‘macro’, ‘samples’, ‘weighted’} or None, default=’macro’,这个参数表示在多分类的时候各个种类计算的权重计算方式。

  注意到,y_true和y_pre都需要是numpy数组格式。

 

posted @ 2021-07-20 20:43  Circle_Wang  阅读(657)  评论(0编辑  收藏  举报