ROC曲线和PR曲线和AUG
一、ROC曲线和PR曲线各是什么?
PR(Precision - Recall)曲线
PR曲线实则是以precision(精准率)和recall(召回率)这两个为变量而做出的曲线,其中recall为横坐标,precision为纵坐标。
那么问题来了,什么是精准率?什么是召回率?这里先做一个解释。
在二分类问题中,分类器将一个实例的分类标记为是或否,可以用一个混淆矩阵来表示,如下图所示。
注:
把正例正确地分类为正例,表示为TP(true positive),把正例错误地分类为负例,表示为FN(false negative)。
把负例正确地分类为负例,表示为TN(true negative),把负例错误地分类为正例,表示为FP(false positive)。
【举个栗子:A是只猫(正例),B是只仓鼠(负例),A在二分类中被划分为猫则为TP,被划分为仓鼠则为FN。B在二分类中被划分为仓鼠则为TN,被划分为猫则为。】
从混淆矩阵可以得出精准率与召回率:
精准率:precision = TP/(TP + FP)
召回率:recall = TP/(TP + FN)
(注意:分子相同,都是预测正确的正样本数量,区别在于精准率的分母为“预测为正样本的总数”,是为了看预测的正样本对了多少;而召回率的分母为“正样本总数”,是为了看正样本召回了多少。)
接下来补充一个重点:
一条PR曲线要对应一个阈值。通过选择合适的阈值,比如50%,对样本进行划分,概率大于50%的就认为是正例,小于50%的就是负例,从而计算相应的精准率和召回率。
举个例子如下:(true这列表示正例或者负例,hyp这列表示阈值0.5的情况下,概率是否大于0.5)
那么根据这个表格我们可以计算:TP=6,FN=0,FP=2,TN=2。故recall=6/(6+0)=1,precison=6/(6+2)=0.75,那么得出坐标(1,0.75)。同理得到不同阈下的坐标,即可绘制出曲线(PS:下图的PR曲线不是上表的)。
PR曲线如下:
如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言后者的性能优于前者,例如上面的A和B优于学习器C。但是A和B的性能无法直接判断,我们可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点或者是F1值。平衡点(BEP)是P=R时的取值,如果这个值较大,则说明学习器的性能较好。而F1 = 2 * P * R /( P + R ),同样,F1值越大,我们可以认为该学习器的性能较好。
ROC(receiver operating characteristic)曲线
有了前面的PR的铺垫,ROC曲线就会更好理解了。
在ROC曲线中,横轴是假正例率(FPR),纵轴是真正例率(TPR)。
1、真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。
2、负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。
我们可以发现:TPR=Recall。
ROC曲线也需要相应的阈值才可以进行绘制,原理同上的PR曲线。
下图为ROC曲线示意图,因现实任务中通常利用有限个测试样例来绘制ROC图,因此应为无法产生光滑曲线,如右图所示。
绘图过程:给定m个正例子,n个反例子,根据学习器预测结果进行排序,先把分类阈值设为最大,使得所有例子均预测为反例,此时TPR和FPR均为0,在(0,0)处标记一个点,再将分类阈值依次设为每个样例的预测值,即依次将每个例子划分为正例。设前一个坐标为(x,y),若当前为真正例,对应标记点为(x,y+1/m),若当前为假正例,则标记点为(x+1/n,y),然后依次连接各点。
ROC曲线图中的四个点
第一个点:(0,1),即FPR=0, TPR=1,这意味着FN=0,并且FP=0。这是完美的分类器,它将所有的样本都正确分类。
第二个点:(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。
第三个点:(0,0),即FPR=TPR=0,即FP=TP=0,可以发现该分类器预测所有的样本都为负样本(negative)。
第四个点:(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,ROC曲线越接近左上角,该分类器的性能越好。
一个对比:
PR曲线与ROC曲线的相同点是都采用了TPR (Recall),都可以用AUC来衡量分类器的效果。不同点是ROC曲线使用了FPR,而PR曲线使用了Precision,因此PR曲线的两个指标都聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。
二、编程实现AUC的方法,并指出复杂度?
AUC (Area under Curve):ROC曲线下的面积,介于0.1和1之间,作为数值可以直观的评价分类器的好坏,值越大越好。
可解读为:从所有正例中随机选取一个样本A,再从所有负例中随机选取一个样本B,分类器将A判为正例的概率比将B判为正例的概率大的可能性。
AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
所以根据定义:我们最直观的有两种计算AUC的方法
1、绘制ROC曲线,ROC曲线下面的面积就是AUC的值
2、假设总共有(m+n)个样本,其中正样本m个,负样本n个,总共有mn个样本对,计数,正样本预测为正样本的概率值大于负样本预测为正样本的概率值记为1,累加计数,然后除以(mn)就是AUC的值
编程实现:
def get_roc(pos_prob,y_true):
"""
pos_prob:得到的概率
y_true:分类的标签
"""
pos = y_true[y_true==1] # 正例
neg = y_true[y_true==0] # 负例
threshold = np.sort(pos_prob) [::-1] # 按概率大小逆序排列,作为阈值0<threshold<1
y = y_true[pos_prob.argsort()[::-1]]
tpr_all = [0] ; fpr_all = [0] # TPR and FPR
tpr = 0 ; fpr = 0
x_step = 1/ float(len(neg))
y_step = 1/ float(len(pos))
y_sum = 0 # 用于计算AUC
for i in range(len(threshold)):
if y[i] == 1:
tpr += y_step
tpr_all.append(tpr)
fpr_all.append(fpr)
else:
fpr += x_step
fpr_all.append(fpr)
tpr_all.append(tpr)
y_sum += tpr
return tpr_all,fpr_all,y_sum*x_step # 获得总体TPR,FPR和相应的AUC
排序复杂度:O(log2(P+N))
计算AUC的复杂度:O(P+N)
参考:
三、AUC指标有什么特点?放缩结果对AUC是否有影响?
AUG更多的用于机器学习和统计中。
01.AUC反映的是分类器对样本的排序能力。根据这个解释,如果我们完全随机的对样本分类,那么AUC应该接近0.5。另外值得注意的是,AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。
AUC(Area under Curve)指的是ROC曲线下的面积,介于0和1之间。AUC作为数值可以直观地评价分类器的好坏,值越大越好。它的统计意义是从所有正样本随机抽取一个正样本,从所有负样本随机抽取一个负样本,当前score使得正样本排在负样本前面的概率。
02.放缩结果对AUC没有影响
参考:面试问题总结
参考: