• ROC曲线及AUC


    ROC曲线

    意义

    ROC曲线指受试者工作特征曲线 / 接收器操作特性曲线(receiver operating characteristic curve),是反映敏感性和特异性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线,曲线下面积越大,诊断准确性越高。在ROC曲线上,最靠近坐标图左上方的点为敏感性和特异性均较高的临界值。

    例子

    ROC曲线

    如上图(图1,引用自维基百科),ROC曲线的横坐标为false positive rate(FPR)1-特异性,纵坐标为true positive rate(TPR)敏感性。
    ROC曲线各参数意义

    上图(图2,引用自豆瓣)为混淆矩阵以及ROC曲线各个参数的意义。

    TruePositives 为在事先确定好的阈值的情况下,分类器将实际为Yes的样本正确预测为Yes,换个说法就是一个人找医生看病,医生按自己的经验诊断后认定这个人患有疾病,而且这个人确实患有该种疾病,正确的正例;

    FalsePositives 即分类器将实际为No的样本错误的预测为Yes,误诊,错误的正例;

    FalseNegatives 即分类器将实际为Yes的样本错误预测为No,可以形容为漏诊,错误的负例;

    TrueNegatives 即分类器将实际为No的样本正确预测为No,良心医生,告诉看病的人确实没病,赶紧回家吧,正确的负例。

    综上所述,我们期望的是所有的预测都可以完美的符合实际情况,即tp rate=1且fp rate=0。所以结合起来ROC曲线越靠左上越符合我们的期望,但是仅看ROC曲线无法区分不同分类器的好坏,所以引入了人AUC值,详细介绍在后面。
    图1中的虚线为一个随机猜测的结果对照,即只猜对了一半,简单的说就是二选一毫无根据的瞎蒙。

    (数据挖掘概念与技术 中文第三版 p237/261 p243/268)

    AUC值

    AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

    ROC曲线画法

    基本思想

    ROC曲线的垂直轴表示TPR,水平轴表示FPR,从左下角开始(TPR=FPR=0),检查列表顶部元素的实际类编号。若为正确分类的正元组,则TP增加,从而TPR增加,在图中向上移动并绘制一个点。若把一个负元组分类为正,则FP和FPR增加,在图中向右移动并绘制一个点。

    步骤

    • 统计数据标签值ground_truth(及y)中分类为0和分类为1的数据数目:
      pos_num=sum(ground_truth==1);neg_num=sum(ground_truth);
    • 对利用模型求出的预测值predict由低到高进行排序;对应数据原来所在位置进行索引记录,用于重新排序ground_truth.利用函数sort实现,sort详情请查看help文档:
      [pre,Index]=sort(predict); ground_truth=ground_truth(Index);
    • 对ground_truth和predict遍历i=1:n,n是测试集数目。其目的是随着predict中概率的增加,随着增加判断正负样本的阈值;也就是说取遍历到的predict值为阈值,大于阈值的假设预测为正样本(阈值右边),小于阈值的假设预测为负样本(阈值左边)。
      所以同时我们可得到真正TP 和假正FP值:TP=sum(ground_truth(i:n)1);FP=sum(ground_truth(i:n)0);
      这时我们就可以求取TPR 和FPR了:TPR=TP/pos_num; FPR=FP/neg_num; 把求取到的值保存起来(x(i),y(i)),因为这就是我们要在图上画的点。
    • 返回曲线与坐标轴间的面积auc。我们的目的是测量数据的准确率,这个面积就是一个量度,auc越大,准确率越高。
      auc=auc+(y(i)+y(i-1))*(x(i-1)-x(i))/2;

    实现ROC曲线的代码如下:

    %  predict       - 分类器对测试集的分类结果
    %  ground_truth - 测试集的正确标签,这里只考虑二分类,即0和1
    %  auc            - 返回ROC曲线的曲线下的面积
    function auc = plot_roc( predict, ground_truth )
    %初始点为(1.0, 1.0)
    %计算出ground_truth中正样本的数目pos_num和负样本的数目neg_num
    
    pos_num = sum(ground_truth==1);
    neg_num = sum(ground_truth==0);
    
    m=size(ground_truth,1);
    [pre,Index]=sort(predict);
    ground_truth=ground_truth(Index);
    x=zeros(m+1,1);
    y=zeros(m+1,1);
    auc=0;
    x(1)=1;y(1)=1;
    
    for i=2:m
        TP=sum(ground_truth(i:m)==1);FP=sum(ground_truth(i:m)==0);
        x(i)=FP/neg_num;
        y(i)=TP/pos_num;
        auc=auc+(y(i)+y(i-1))*(x(i-1)-x(i))/2;
    end;
    
    x(m+1)=0;y(m+1)=0;
    auc=auc+y(m)*x(m)/2;
    plot(x,y);
    end
    
  • 相关阅读:
    4. 归并排序
    3. 堆排序
    2. 希尔排序
    1. 选择排序、插入排序、冒泡排序
    1. 拓扑排序
    8. 最大堆
    7. B+树
    6. B树
    5. 二叉查找树、平衡二叉树、红黑树的效率比较
    4. 红黑二叉树
  • 原文地址:https://www.cnblogs.com/henserlinda/p/6665300.html
Copyright © 2020-2023  润新知