神经网络常见评价指标超详细介绍(ROC曲线AUC指标AUROC)

Posted wendy_ya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络常见评价指标超详细介绍(ROC曲线AUC指标AUROC)相关的知识,希望对你有一定的参考价值。

目录

一、基本概念

  • 真阳性(TP):判断为真,实际也为真;
  • 伪阳性(FP):判断为真,实际为假;
  • 伪阴性(FN):判断为假,实际为真;
  • 真阴性(TN):判断为假,实际也为假;
  • TPR(真阳性率):在所有实际为真的样本中,被正确预测为真的概率:
    T P R = T P T P + F N TPR=\\fracTPTP+FN TPR=TP+FNTP
  • FPR(伪阳性率):在所有实际为假的样本中,被错误预测为真的概率;
    F P R = F P F P + T N FPR=\\fracFPFP+TN FPR=FP+TNFP

二、ROC曲线

ROC曲线:接受者操作特征曲线(receiver operating characteristic curve)。
ROC空间将伪阳性率(FPR)定义为 X 轴,真阳性率(TPR)定义为 Y 轴。
从 (0, 0) 到 (1,1) 的对角线将ROC空间划分为左上/右下两个区域,在这条线的以上的点代表了一个好的分类结果(胜过随机分类),而在这条线以下的点代表了差的分类结果(劣于随机分类)。
完美的预测是一个在左上角的点,在ROC空间座标 (0,1)点,X=0 代表着没有伪阳性,Y=1 代表着没有伪阴性(所有的阳性都是真阳性);也就是说,不管分类器输出结果是阳性或阴性,都是100%正确。一个随机的预测会得到位于从 (0, 0) 到 (1, 1) 对角线(也叫无识别率线)上的一个点;最直观的随机预测的例子就是抛硬币。

但是仔细想想,实际上越接近曲线表示分类结果越差,越接近左上角和右下角则表示分类结果越好。不难理解,越接近曲线,表示分类的伪阳性率和真阳性率越接近,则表示分类器越难判断出是真实样本还是虚假样本;而越接近左上角代表分类器很容易正确判断出真实样本和虚假样本,越接近右下角则代码越容易将真实样本判断为虚假样本,若将其取反,则会同样会越接近左上角。

两种ROC曲线哪个效果更好❓

我们希望TP尽可能大,而FP尽可能小,因此曲线越靠近左上角效果越好,即B分类效果比A分类效果更好。

三、AUROC(AUC指标)

AUROC(Area Under the Receiver Operating Characteristic curve,接受者操作特征曲线下面积,即ROC曲线下面积)

AUROC通过接受者操作特征曲线(receiver operating characteristic curve)与坐标轴之间的⾯积⼤⼩来反应分类器的性能,其意义在于:
因为是在1x1的方格里求面积,AUROC必在0~1之间
若随机抽取一个阳性样本和一个阴性样本,分类器正确判断阳性样本的值高于阴性样本之机率。
简单说:AUROC值越大的分类器,正确率越高。

从AUROC判断分类器(预测模型)优劣的标准:

  • AUROC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器;
  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值;
  • AUC = 0.5,跟随机猜测一样(例:丢硬币),模型没有预测价值;
  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测;

其意义可以理解为均匀抽取的随机阳性样本(正样本)排名在均匀抽取的随机阴性样本(负样本)之前的期望。AUROC是⼀个介于0到1之间的数值,当AUROC值越接近于1时,表示分类器可以较好的分类正负样本。

四、实例介绍

4.1 公式实现

考虑标签label和预测值pred,其数值如下:
label = [1, 0, 0, 0, 1, 0, 1, 0]
pre = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]

其散点图如下:

怎样才能通过概率得到预测的类别呢?
通常我们需要设置一个阈值,这里以0.5为例,当概率大于等于0.5时,分类器认为这个为真实类别;当概率小于0.5时,分类器认为这个不是真实类别,如下图所示:

我们可以根据这个图得到当阈值为0.5时的混淆矩阵:

实际上阈值可以取[0,1)之间的任意值,理论上可以取无数个混淆矩阵,而把所有的混淆矩阵表示在同一个二维空间中的方法称为ROC曲线

回到之前的栗子,当阈值取[0,0.1)时,分类器任务所有的都是真实类别,其混淆矩阵如下:

T P R = T P T P + F N = 3 3 + 0 = 1 TPR=\\fracTPTP+FN=\\frac33+0=1 TPR=TP+FNTP=3+03=1
F P R = F P F P + T N = 5 5 + 0 = 1 FPR=\\fracFPFP+TN=\\frac55+0=1 FPR=FP+TNFP=5+05=1
对应到二维空间中就是坐标为(1,1)的点

当阈值取[0.1,0.2)时,我们可以得到新的混淆矩阵如下:

T P R = T P T P + F N = 3 3 + 0 = 1 TPR=\\fracTPTP+FN=\\frac33+0=1 TPR=TP+FNTP=3+03=1
F P R = F P F P + T N = 4 4 + 1 = 0.8 FPR=\\fracFPFP+TN=\\frac44+1=0.8 FPR=FP+TNFP=4+14=0.8
对应到二维空间中就是坐标为(0.8,1)的点

以此类推…

最终得到所有坐标点,根据这些坐标点,连成一条线如下图所示:

AUROC(AUC指标)即为右下角的面积:
1 3 ∗ 0.2 / 2 + 1 3 ∗ 0.4 + 0.4 ∗ 1 = 0.566666666666666666 \\frac13*0.2/2+\\frac13*0.4+0.4*1=0.566666666666666666 310.2/2+310.4+0.41=0.566666666666666666

4.2 代码实现

计算AUROC指标有两种方法:
方法1:自定义函数

  • 若Sim测试 > Sim不存在,则数值的分子加1(此时证明预测效果良好);
  • 若 Sim测试 = Sim不存在 ,则数值的分子加0.5(此时相当于随机选择);
  • 若Sim测试 < Sim不存在,则数值的分子加0。
    (Sim表示相似值)
    数值的分母是测试集中的边的相似值与不存在的边的相似值比较的次数。比如测试集中2条边,不存在中3条边,那么比较次数就是6次。
    AUC指标即为数值分子与数值分母的比值,AUC大于0.5的程度衡量了算法在多大程度上优于随机选择的算法。

定义AUC函数:

def AUC(label, pre):
    # 计算正样本和负样本的索引,以便索引出之后的概率值
    pos = [i for i in range(len(label)) if label[i] == 1]   #正样本索引
    neg = [i for i in range(len(label)) if label[i] == 0]   #负样本索引
    auc = 0
    for i in pos:
        for j in neg:
            if pre[i] > pre[j]:
                auc += 1
            elif pre[i] == pre[j]:
                auc += 0.5

    return auc / (len(pos) * len(neg))

调用函数:

if __name__ == '__main__':
    label = [1, 0, 0, 0, 1, 0, 1, 0]
    pre = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]
    print(AUC(label, pre))

运行结果:
0.5666666666666667

方法2:使用sklearn算法库的包

导入roc_curve,和auc包:

# 导入sklearn算法库中的包
from sklearn.metrics import roc_curve, auc

主程序:

label = [1, 0, 0, 0, 1, 0, 1, 0]
pre = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]
'''
label是列表形式,对应方法1中的label形式
pre是列表形式,对应方法1中的pre形式
'''
fpr, tpr, th = roc_curve(label, pre, pos_label=1)
print('sklearn', auc(fpr, tpr))

运行结果:
0.5666666666666667


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

参考:

  1. https://baike.sogou.com/v472808.htm
  2. https://blog.csdn.net/Queen0911/article/details/109693384
  3. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html#sklearn.metrics.roc_curve

相关资源可参考:https://download.csdn.net/download/didi_ya/85564779

人工智能——分类器性能指标之ROC曲线AUC值

文章目录


二分类模型预测的结果是否足够好,ROC和AUC是重要指标。

ROC曲线

ROC曲线概念

ROC曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性。

ROC曲线坐标系

横轴:负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例;(1-Specificity)

纵轴:真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率)

ROC曲线重要概念

针对一个二分类问题,将实例分成正类(postive)或者负类(negative)。但是实际中分类时,会出现四种情况.

  1. 若一个实例是正类并且被预测为正类,即为真正类(True Postive TP)
  2. 若一个实例是正类,但是被预测成为负类,即为假负类(False Negative FN)
  3. 若一个实例是负类,但是被预测成为正类,即为假正类(False Postive FP)
  4. 若一个实例是负类,但是被预测成为负类,即为真负类(True Negative TN)

这四种情况在深度学习的结果中又代表如下情况

  • TP:正确的肯定数目

  • FN:漏报,没有找到正确匹配的数目

  • FP:误报,没有的匹配不正确

  • TN:正确拒绝的非匹配数目

列联表如下,1代表正类,0代表负类:

由上表可得出横,纵轴的计算公式:

  • 真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity
  • 负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity
  • 真负类率(True Negative Rate)TNR: TN/(FP+TN),代表分类器预测的负类中实际负实例占所有负实例的比例,TNR=1-FPR。Specificity

特异度(specificity)与灵敏度(sensitivity)

假设采用逻辑回归分类器,其给出针对每个实例为正类的概率,那么通过设定一个阈值如0.6,概率大于等于0.6的为正类,小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。

如下面这幅图,(a)图中实线为ROC曲线,线上每个点对应一个阈值。

横轴FPR:1-TNR,1-Specificity,FPR越大,预测正类中实际负类越多。

纵轴TPR:Sensitivity(正类覆盖率),TPR越大,预测正类中实际正类越多。

理想目标:TPR=1,FPR=0,即图中(0,1)点,故ROC曲线越靠拢(0,1)点,越偏离45度对角线越好,Sensitivity、Specificity越大效果越好。

案例:画ROC曲线

假设已经得出一系列样本被划分为正类的概率,然后按照大小排序,下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。

接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。

举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:

AUC值

AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏,值越大越好。

首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

为什么使用Roc和Auc评价分类器

既然已经这么多标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本也可能随着时间变化。下图是ROC曲线和Presision-Recall曲线的对比:

在上图中,(a)和©为Roc曲线,(b)和(d)为Precision-Recall曲线。

(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,©(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果,可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线变化较大。

以上是关于神经网络常见评价指标超详细介绍(ROC曲线AUC指标AUROC)的主要内容,如果未能解决你的问题,请参考以下文章

机器学习100天(二十一):021 分类模型评价指标-ROC曲线和AUC

机器学习100天(二十一):021 分类模型评价指标-ROC曲线和AUC

R语言临床预测模型的评价指标与验证指标实战:ROC曲线AUC(C-Statistics)

ROC和AUC介绍以及如何计算AUC

机器学习系列-ROC曲线以及AUC计算

人工智能——分类器性能指标之ROC曲线AUC值