AUC的计算⽅法
摘要:
在机器学习的分类任务中,我们常⽤许多的指标,诸如召回率(Recall)、准确率(Precision)、F1值、AUC等。
那么,如果⼿动计算AUC应该要怎么计算呢?相信⼤家很多时候都是⽤写好的库直接计算,可能对AUC计算不太了解,下⾯这篇⽂章就简单的概述⼀下AUC的计算⽅法。
(注:本⽂的重点其实不在于阐述什么是AUC。因为⽹上关于这⽅⾯的⽂章实在太多了。但是对于AUC的计算的⽂章相对来说少⼀些) 1.什么是AUC?
相信这个问题很多玩家都已经明⽩了,简单的概括⼀下,AUC(are under curve)是⼀个模型的评价指标,⽤于分类任务。
那么这个指标代表什么呢?这个指标想表达的含义,简单来说其实就是随机抽出⼀对样本(⼀个正样本,⼀个负样本),然后⽤训练得到的分类器来对这两个样本进⾏预测,预测得到正样本的概率⼤于负样本概率的概率。
具体关于AUC含义的分析推荐以下回答:
2.如何计算AUC?
计算AUC时,推荐2个⽅法。
⽅法⼀:
在有M个正样本,N个负样本的数据集⾥。⼀共有M*N对样本(⼀对样本即,⼀个正样本与⼀个负样本)。统计这M*N对样本⾥,正样本的预测概率⼤于负样本的预测概率的个数。
,其中,
这样说可能有点抽象,我举⼀个例⼦便能够明⽩。超市理货员是做什么的
ID label pro
A00.1
B00.4唐诗相思
C10.35
D10.8
假设有4条样本。2个正样本,2个负样本,那么M*N=4。即总共有4个样本对。分别是:
(D,B),(D,A),(C,B),(C,A)。
在(D,B)样本对中,正样本D预测的概率⼤于负样本B预测的概率(也就是D的得分⽐B⾼),记为1
同理,对于(C,B)。正样本C预测的概率⼩于负样本C预测的概率,记为0.
最后可以算得,总共有3个符合正样本得分⾼于负样本得分,故最后的AUC为
在这个案例⾥,没有出现得分⼀致的情况,假如出现得分⼀致的时候,例如:
ID label pro
A00.1
B00.4
C10.4
D10.8
同样本是4个样本对,对于样本对(C,B)其I值为0.5。
最后的AUC为
⽅法⼆:
另外⼀个⽅法就是利⽤下⾯的公式:
这个公式看起来有点吓⼈,⾸先解释⼀下每⼀个符号的意思:
公式的含义见:
,代表第i条样本的序号。(概率得分从⼩到⼤排,排在第rank个位置) 分别是正样本的个数和负样本的个数
只把正样本的序号加起来。
同样本地,我们⽤上⾯的例⼦。
ID label pro
A00.1
B00.4
C10.35
D10.8
将这个例⼦排序。按概率排序后得到:
ID label pro rank
A00.11
C10.352
B00.43
D10.84
按照上⾯的公式,只把正样本的序号加起来也就是只把样本C,D的rank值加起来后减去⼀个常数项
即: ,这个答案和我们上⾯所计算的是⼀样的。
这个时候,我们有个问题,假如出现得分⼀致的情况怎么办?下⾯举⼀个例⼦说明:
ID label pro
A10.8
随机数函数B10.7
C00.5
D00.5
E10.5
F10.5
G00.3
在这个例⼦中,我们有4个取值概率为0.5,⽽且既有正样本也有负样本的情况。计算的时候,其实原则就是相等得分的rank取平均值。具体来说如下:
先排序:
ID label pro rank
G00.31
F10.52
E10.53
D00.54
C00.55
B10.76
A10.87
这⾥需要注意的是:相等概率得分的样本,⽆论正负,谁在前,谁在后⽆所谓。
由于只考虑正样本的rank值:
对于正样本A,其rank值为7
对于正样本B,其rank值为6
对于正样本E,其rank值为(5+4+3+2)/4
对于正样本F,其rank值为(5+4+3+2)/4
小姑娘卡通图片
最后我们得到:
3.最后的最后,如何⽤程序验证?什么是宏
为了⽅便,我们使⽤sk-learn⾥⾯⾃带的库来简单的验证⼀下我们的例⼦。
其python的代码
import numpy as np
ics import roc_auc_score
y_true = np.array([1,1,0,0,1,1,0])哀的组词
y_scores = np.array([0.8,0.7,0.5,0.5,0.5,0.5,0.3])
print "y_true is ",y_true
print "y_scores is ",y_scores
print "AUC is",roc_auc_score(y_true, y_scores)
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
古币价格表print "y_true is ",y_true
print "y_scores is ",y_scores
地暖的优缺点print "AUC is ",roc_auc_score(y_true, y_scores)