ROC和AUC定义

ROC全称是“受试者工作特征”(Receiver Operating Characteristic)。ROC曲线的面积就是AUC(Area Under the Curve)。AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)。

Python中sklearn直接提供了用于计算ROC的函数[1],下面就把函数背后的计算过程详细讲一下。

计算ROC需要知道的关键概念

首先,解释几个二分类问题中常用的概念:True Positive, False Positive, True Negative, False Negative。它们是根据真实类别与预测类别的组合来区分的。

假设有一批test样本,这些样本只有两种类别:正例和反例。机器学习算法预测类别如下图(左半部分预测类别为正例,右半部分预测类别为反例),而样本中真实的正例类别在上半部分,下半部分为真实的反例。

  • 预测值为正例,记为P(Positive)
  • 预测值为反例,记为N(Negative)
  • 预测值与真实值相同,记为T(True)
  • 预测值与真实值相反,记为F(False)

  • TP:预测类别是P(正例),真实类别也是P
  • FP:预测类别是P,真实类别是N(反例)
  • TN:预测类别是N,真实类别也是N
  • FN:预测类别是N,真实类别是P

样本中的真实正例类别总数即TP+FN。TPR即True Positive Rate,TPR = TP/(TP+FN)。
同理,样本中的真实反例类别总数为FP+TN。FPR即False Positive Rate,FPR=FP/(TN+FP)。

还有一个概念叫”截断点”。机器学习算法对test样本进行预测后,可以输出各test样本对某个类别的相似度概率。比如t1是P类别的概率为0.3,一般我们认为概率低于0.5,t1就属于类别N。这里的0.5,就是”截断点”。
总结一下,对于计算ROC,最重要的三个概念就是TPR, FPR, 截断点

截断点取不同的值,TPRFPR的计算结果也不同。将截断点不同取值下对应的TPRFPR结果画于二维坐标系中得到的曲线,就是ROC曲线。横轴用FPR表示。

sklearn计算ROC

sklearn给出了一个计算ROC的例子[1]。

y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)

通过计算,得到的结果(TPR, FPR, 截断点)为

fpr = array([ 0. ,  0.5,  0.5,  1. ])
tpr = array([ 0.5,  0.5,  1. ,  1. ])
thresholds = array([ 0.8 ,  0.4 ,  0.35,  0.1 ])#截断点

将结果中的FPR与TPR画到二维坐标中,得到的ROC曲线如下(蓝色线条表示),ROC曲线的面积用AUC表示(淡黄色阴影部分)。

详细计算过程

上例给出的数据如下

y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])

用这个数据,计算TPR,FPR的过程是怎么样的呢?

1. 分析数据

y是一个一维数组(样本的真实分类)。数组值表示类别(一共有两类,1和2)。我们假设y中的1表示反例,2表示正例。即将y重写为:

y_true = [0, 0, 1, 1]

score即各个样本属于正例的概率。

2. 针对score,将数据排序

样本 预测属于P的概率(score) 真实类别
y[0] 0.1 N
y[2] 0.35 P
y[1] 0.4 N
y[3] 0.8 P

3. 将截断点依次取为score值

截断点依次取值为0.1,0.35,0.4,0.8时,计算TPRFPR的结果。

3.1 截断点为0.1

说明只要score>=0.1,它的预测类别就是正例。
此时,因为4个样本的score都大于等于0.1,所以,所有样本的预测类别都为P。

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [1, 1, 1, 1]

TPR = TP/(TP+FN) = 1
FPR = FP/(TN+FP) = 1

3.2 截断点为0.35

说明只要score>=0.35,它的预测类别就是P。
此时,因为4个样本的score有3个大于等于0.35。所以,所有样本的预测类有3个为P(2个预测正确,1一个预测错误);1个样本被预测为N(预测正确)。

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [0, 1, 1, 1]

TPR = TP/(TP+FN) = 1
FPR = FP/(TN+FP) = 0.5

3.3 截断点为0.4

说明只要score>=0.4,它的预测类别就是P。
此时,因为4个样本的score有2个大于等于0.4。所以,所有样本的预测类有2个为P(1个预测正确,1一个预测错误);2个样本被预测为N(1个预测正确,1一个预测错误)。

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [0, 1, 0, 1]

TPR = TP/(TP+FN) = 0.5
FPR = FP/(TN+FP) = 0.5

3.4 截断点为0.8

说明只要score>=0.8,它的预测类别就是P。所以,所有样本的预测类有1个为P(1个预测正确);3个样本被预测为N(2个预测正确,1一个预测错误)。

scores = [0.1, 0.4, 0.35, 0.8]
y_true = [0, 0, 1, 1]
y_pred = [0, 0, 0, 1]

TPR = TP/(TP+FN) = 0.5
FPR = FP/(TN+FP) = 0

心得

用下面描述表示TPR和FPR的计算过程,更容易记住

  • TPR:真实的正例中,被预测正确的比例
  • FPR:真实的反例中,被预测正确的比例

最理想的分类器,就是对样本分类完全正确,即FP=0,FN=0。所以理想分类器TPR=1,FPR=0。

参考:

  1. http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
  2. ROC计算公式,http://blog.yhat.com/posts/roc-curves.html
  3. 《机器学习》,周志华

详解ROC/AUC计算过程相关推荐

  1. php里面的socket编程,详解PHP Socket 编程过程

    详解PHP Socket 编程过程 作者:PHPYuan 时间:2019-03-13 03:41:20 概述 Socket用于进程间通信.进程间通信通常基于客户端-服务端模型.此时,客户端-服务端是可 ...

  2. 多图详解freeBSD8.2安装过程

    多图详解freeBSD8.2安装过程 Wmware新建freeBSD虚拟机,光盘挂载freeBSD.iso.真机光驱放freeBSD光盘,修改bios光驱启动,选择1安装系统,选择4则可以修改root ...

  3. XGBRegressor参数详解以及调参过程

    XGBRegressor参数详解以及调参过程 一.参数 1.通用参数booster.nthread 2.学习目标参数 (1)objective (2)eval_metric (3)seed 3.Tre ...

  4. Mac下使用Fiddler抓包详解(个人使用过程)

    Mac下使用Fiddler抓包详解(个人使用过程) 前言 1.VMware Fusion for Mac 2.win7镜像 3.windows版fiddler mac使用Windows fiddler ...

  5. group convolution (分组卷积)的计算量详解、卷积计算量特征图大小,池化特征图大小、深度通道deep-wise 卷积

    group convolution (分组卷积)的计算量详解.卷积计算量特征图大小,池化特征图大小.深度通道deep-wise 卷积 提示:最近忙着各种提前批的笔试面试,所以没太多空刷题了都,先复盘一 ...

  6. c# 差值 获取时间_详解C# TimeSpan 计算时间差(时间间隔)

    TimeSpan 结构  表示一个时间间隔. 命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 说明: 1.DateTime值类型代表了一个从公元0001年1月1日 ...

  7. 曲线相似度衡量——曲线距离计算Fréchet distance详解与python计算

    弗朗明歇距离(Fréchet distance)论文可以参考: 理论推导 Eiter, Thomas, and Heikki Mannila. "Computing discrete Fré ...

  8. 红黑树操作详解——很形象的过程

    红黑树是一种很好的自平衡二叉排序树,在此,给出一个网友给出的红黑树操作详解: https://segmentfault.com/a/1190000012728513 里面给出了红黑树的详细操作,过程很 ...

  9. response.setHeader()的用法详解及实现文件下载过程中出现问题的分析

    response.setHeader()用法详解,转载记录: 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Prag ...

最新文章

  1. spring Ioc本质
  2. SQL基础学习总结:3(select语句基础算术运算符比较运算符)
  3. python如何跨模块调用变量_Python跨模块用户定义的全局变量:在其他模块运行时调用它们的问题...
  4. 非常复杂,上双11数据大屏背后的秘密:大规模流式增量计算及应用
  5. java atomicinteger_Java多线程进阶(十三)—— J.U.C之atomic框架:AtomicInteger
  6. java内存溢出总结(1.8)
  7. win7硬盘安装工具_如何重装电脑安装Win7 系统?最简单,最便捷的办法,值得收藏...
  8. layer 同步调用_YYText源码解读-YYText同步/异步渲染流程(一)—UIView与CALayer
  9. 选择所有选项的多选复选框列表或复选框下拉列表
  10. Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解
  11. Scala可变参数列表
  12. 【openwrt】初探 基于MT7621
  13. 微信小程序累计独立访客(UV)不低于 1000 是什么意思
  14. CoFlash 基本操作说明和Flash编程算法
  15. 初识Python自动化运维(一)
  16. 如何让php文件常驻内存,【后端开辟】Asf PHP开辟之设置信息常驻体系内存
  17. 【Qt学习】 设计视频播放器界面
  18. 我能想到最幸福的事,是陪你夜坐听风、昼眠听雨
  19. 【大数据AI人工智能】变革人类社会的第四次工业革命——AI人工智能革命已到来
  20. HALCON 光圈和景深的关系

热门文章

  1. 你还在清理进程释放RAM吗?别再损害手机了
  2. zsh退格键变成空格键解决办法
  3. 事件、故障排查处理思路,你值得试试
  4. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java社区智慧养老系统b0lh8
  5. UVA11988 破损的键盘
  6. Python中@符号的用法
  7. ssh框架下的关联表删除(级联删除)
  8. A+精准营销软件系列之Q群营销助手软件功能说明
  9. 疫情一代普通大学生的四年感悟,四年大学带给了我什么
  10. BFC是什么?开启BFC的标志?解决什么问题?