详解ROC/AUC计算过程
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(正例),真实类别也是PFP
:预测类别是P,真实类别是N(反例)TN
:预测类别是N,真实类别也是NFN
:预测类别是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
, 截断点
。
截断点
取不同的值,TPR
和FPR
的计算结果也不同。将截断点
不同取值下对应的TPR
和FPR
结果画于二维坐标系中得到的曲线,就是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时,计算TPR
和FPR
的结果。
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。
参考:
- http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
- ROC计算公式,http://blog.yhat.com/posts/roc-curves.html
- 《机器学习》,周志华
详解ROC/AUC计算过程相关推荐
- php里面的socket编程,详解PHP Socket 编程过程
详解PHP Socket 编程过程 作者:PHPYuan 时间:2019-03-13 03:41:20 概述 Socket用于进程间通信.进程间通信通常基于客户端-服务端模型.此时,客户端-服务端是可 ...
- 多图详解freeBSD8.2安装过程
多图详解freeBSD8.2安装过程 Wmware新建freeBSD虚拟机,光盘挂载freeBSD.iso.真机光驱放freeBSD光盘,修改bios光驱启动,选择1安装系统,选择4则可以修改root ...
- XGBRegressor参数详解以及调参过程
XGBRegressor参数详解以及调参过程 一.参数 1.通用参数booster.nthread 2.学习目标参数 (1)objective (2)eval_metric (3)seed 3.Tre ...
- Mac下使用Fiddler抓包详解(个人使用过程)
Mac下使用Fiddler抓包详解(个人使用过程) 前言 1.VMware Fusion for Mac 2.win7镜像 3.windows版fiddler mac使用Windows fiddler ...
- group convolution (分组卷积)的计算量详解、卷积计算量特征图大小,池化特征图大小、深度通道deep-wise 卷积
group convolution (分组卷积)的计算量详解.卷积计算量特征图大小,池化特征图大小.深度通道deep-wise 卷积 提示:最近忙着各种提前批的笔试面试,所以没太多空刷题了都,先复盘一 ...
- c# 差值 获取时间_详解C# TimeSpan 计算时间差(时间间隔)
TimeSpan 结构 表示一个时间间隔. 命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 说明: 1.DateTime值类型代表了一个从公元0001年1月1日 ...
- 曲线相似度衡量——曲线距离计算Fréchet distance详解与python计算
弗朗明歇距离(Fréchet distance)论文可以参考: 理论推导 Eiter, Thomas, and Heikki Mannila. "Computing discrete Fré ...
- 红黑树操作详解——很形象的过程
红黑树是一种很好的自平衡二叉排序树,在此,给出一个网友给出的红黑树操作详解: https://segmentfault.com/a/1190000012728513 里面给出了红黑树的详细操作,过程很 ...
- response.setHeader()的用法详解及实现文件下载过程中出现问题的分析
response.setHeader()用法详解,转载记录: 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Prag ...
最新文章
- spring Ioc本质
- SQL基础学习总结:3(select语句基础算术运算符比较运算符)
- python如何跨模块调用变量_Python跨模块用户定义的全局变量:在其他模块运行时调用它们的问题...
- 非常复杂,上双11数据大屏背后的秘密:大规模流式增量计算及应用
- java atomicinteger_Java多线程进阶(十三)—— J.U.C之atomic框架:AtomicInteger
- java内存溢出总结(1.8)
- win7硬盘安装工具_如何重装电脑安装Win7 系统?最简单,最便捷的办法,值得收藏...
- layer 同步调用_YYText源码解读-YYText同步/异步渲染流程(一)—UIView与CALayer
- 选择所有选项的多选复选框列表或复选框下拉列表
- Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解
- Scala可变参数列表
- 【openwrt】初探 基于MT7621
- 微信小程序累计独立访客(UV)不低于 1000 是什么意思
- CoFlash 基本操作说明和Flash编程算法
- 初识Python自动化运维(一)
- 如何让php文件常驻内存,【后端开辟】Asf PHP开辟之设置信息常驻体系内存
- 【Qt学习】 设计视频播放器界面
- 我能想到最幸福的事,是陪你夜坐听风、昼眠听雨
- 【大数据AI人工智能】变革人类社会的第四次工业革命——AI人工智能革命已到来
- HALCON 光圈和景深的关系