详解ROC/AUC计算过程

2017 年 10 月 7 日 数据挖掘入门与实战 要学习更多点这→



大数据挖掘DT数据分析  公众号: datadw


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. 《机器学习》,周志华



人工智能大数据与深度学习

搜索添加微信公众号:weic2c


长按图片,识别二维码,点关注



大数据挖掘DT数据分析

搜索添加微信公众号:datadw


教你机器学习,教你数据挖掘


长按图片,识别二维码,点关注



登录查看更多
1

相关内容

Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
【新书】Pro 机器学习算法Python实现,379页pdf
专知会员服务
199+阅读 · 2020年2月11日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【推荐系统/计算广告/机器学习/CTR预估资料汇总】
专知会员服务
87+阅读 · 2019年10月21日
sklearn 与分类算法
人工智能头条
7+阅读 · 2019年3月12日
机器学习中如何处理不平衡数据?
机器之心
13+阅读 · 2019年2月17日
BAT机器学习面试题1000题(376~380题)
七月在线实验室
9+阅读 · 2018年8月27日
详解常见的损失函数
七月在线实验室
20+阅读 · 2018年7月12日
免费|机器学习算法Python实现
全球人工智能
5+阅读 · 2018年1月2日
动手写机器学习算法:异常检测 Anomaly Detection
七月在线实验室
11+阅读 · 2017年12月8日
机器学习(27)【降维】之主成分分析(PCA)详解
机器学习算法与Python学习
9+阅读 · 2017年11月22日
机器学习(16)之支持向量机原理(二)软间隔最大化
机器学习算法与Python学习
6+阅读 · 2017年9月8日
机器学习(15)之支持向量机原理(一)线性支持向量机
机器学习算法与Python学习
6+阅读 · 2017年9月1日
Weight Poisoning Attacks on Pre-trained Models
Arxiv
5+阅读 · 2020年4月14日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Arxiv
12+阅读 · 2019年4月9日
The Matrix Calculus You Need For Deep Learning
Arxiv
12+阅读 · 2018年7月2日
Arxiv
26+阅读 · 2018年2月27日
VIP会员
相关资讯
sklearn 与分类算法
人工智能头条
7+阅读 · 2019年3月12日
机器学习中如何处理不平衡数据?
机器之心
13+阅读 · 2019年2月17日
BAT机器学习面试题1000题(376~380题)
七月在线实验室
9+阅读 · 2018年8月27日
详解常见的损失函数
七月在线实验室
20+阅读 · 2018年7月12日
免费|机器学习算法Python实现
全球人工智能
5+阅读 · 2018年1月2日
动手写机器学习算法:异常检测 Anomaly Detection
七月在线实验室
11+阅读 · 2017年12月8日
机器学习(27)【降维】之主成分分析(PCA)详解
机器学习算法与Python学习
9+阅读 · 2017年11月22日
机器学习(16)之支持向量机原理(二)软间隔最大化
机器学习算法与Python学习
6+阅读 · 2017年9月8日
机器学习(15)之支持向量机原理(一)线性支持向量机
机器学习算法与Python学习
6+阅读 · 2017年9月1日
Top
微信扫码咨询专知VIP会员