ROC曲线

意义

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

例子

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

上图(图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

ROC曲线及AUC的更多相关文章

  1. 机器学习之分类器性能指标之ROC曲线、AUC值

    分类器性能指标之ROC曲线.AUC值 一 roc曲线 1.roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性 ...

  2. ROC曲线、AUC、Precision、Recall、F-measure理解及Python实现

    本文首先从整体上介绍ROC曲线.AUC.Precision.Recall以及F-measure,然后介绍上述这些评价指标的有趣特性,最后给出ROC曲线的一个Python实现示例. 一.ROC曲线.AU ...

  3. ROC曲线的AUC(以及其他评价指标的简介)知识整理

    相关评价指标在这片文章里有很好介绍 信息检索(IR)的评价指标介绍 - 准确率.召回率.F1.mAP.ROC.AUC:http://blog.csdn.net/marising/article/det ...

  4. 混淆矩阵、准确率、精确率/查准率、召回率/查全率、F1值、ROC曲线的AUC值

    准确率.精确率(查准率).召回率(查全率).F1值.ROC曲线的AUC值,都可以作为评价一个机器学习模型好坏的指标(evaluation metrics),而这些评价指标直接或间接都与混淆矩阵有关,前 ...

  5. ROC曲线,AUC面积

    AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间.Auc作为数值可以直观的评价分类器的好坏,值越大越好. 首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本, ...

  6. ROC曲线和AUC值(转)

    http://www.cnblogs.com/dlml/p/4403482.html 分类器性能指标之ROC曲线.AUC值 一 roc曲线 1.roc曲线:接收者操作特征(receiveroperat ...

  7. 混淆矩阵、准确率、召回率、ROC曲线、AUC

    混淆矩阵.准确率.召回率.ROC曲线.AUC 假设有一个用来对猫(cats).狗(dogs).兔子(rabbits)进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结.假设总共 ...

  8. 机器学习常见的几种评价指标:精确率(Precision)、召回率(Recall)、F值(F-measure)、ROC曲线、AUC、准确率(Accuracy)

    原文链接:https://blog.csdn.net/weixin_42518879/article/details/83959319 主要内容:机器学习中常见的几种评价指标,它们各自的含义和计算(注 ...

  9. 【分类模型评判指标 二】ROC曲线与AUC面积

    转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80499031 略有改动,仅供个人学习使用 简介 ROC曲线与AUC面积均是用来 ...

  10. 模型监控指标- 混淆矩阵、ROC曲线,AUC值,KS曲线以及KS值、PSI值,Lift图,Gain图,KT值,迁移矩阵

    1. 混淆矩阵 确定截断点后,评价学习器性能 假设训练之初以及预测后,一个样本是正例还是反例是已经确定的,这个时候,样本应该有两个类别值,一个是真实的0/1,一个是预测的0/1 TP(实际为正预测为正 ...

随机推荐

  1. 20-Ubuntu-文件和目录命令-查看目录树型结构-tree

    tree 以树状图列出当前目录下的文件目录结构 选项 含义 -d 只显示当前目录的子目录树型结构   显示当前目录的子目录和文件树型结构 例: 1.查看文档目录下的子目录和文件树型结构 2.查看文档目 ...

  2. DOM基础及事件基础

    DOM:功能:控制html文档的内容代码:获取页面标签(元素)对象 Element document.getElementById("id值"):通过元素id获取元素对象操作Ele ...

  3. Git查看历史记录的几种方法

  4. Git的配置及克隆项目到本地

  5. GetOpenFilename的基本用法(文件夹实操)

    Sub 数据导入()Dim f, arr, i&, j&, k, m%, n%, p%, sh As Workbookf = Application.GetOpenFilename(f ...

  6. PHP算法之分割平衡字符串

    在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的. 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串. 返回可以通过分割得到的平衡字符串的最大数量. 示例 1: 输入:s = ...

  7. c_数据结构_哈希表

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define ERROR 0 #define ...

  8. python对urlEncode进行解码

    利用python自带的urlib进行编码和解码,没有什么问题.(https://www.hustyx.com/python/) 但如果是用url编码工具(http://tool.chinaz.com/ ...

  9. vue 兄弟组件的传值

    handleLetterClick方法,采用emit 传递给父组件 父组件触发的方法: handleLetterChange方法: 父组件传递给子组件: CityList组件:   兄弟组件的传值可以 ...

  10. redis可视化客户端工具TreeNMS

    TreeNMS是一款redis,Memcache可视化客户端工具,采用JAVA开发,实现基于WEB方式对Redis, Memcached数据库进行管理.维护. 功能包括:状态参数监控,NoSQL数据库 ...