摘要:https://blog.csdn.net/qq_22238533/article/details/78666436 在机器学习的分类任务中,我们常用许多的指标,诸如召回率(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对样本里,正样本的预测概率大于负样本的预测概率的个数。 ![]() ![]() 这样说可能有点抽象,我举一个例子便能够明白。
假设有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为 ![]() 在这个案例里,没有出现得分一致的情况,假如出现得分一致的时候,例如:
同样本是4个样本对,对于样本对(C,B)其I值为0.5。 最后的AUC为 ![]() 方法二: 另外一个方法就是利用下面的公式: ![]() 这个公式看起来有点吓人,首先解释一下每一个符号的意思: 公式的含义见: 公式解释 ![]() ![]() ![]() 同样本地,我们用上面的例子。
按照上面的公式,只把正样本的序号加起来也就是只把样本C,D的rank值加起来后减去一个常数项 ![]() 即: ![]() 这个时候,我们有个问题,假如出现得分一致的情况怎么办?下面举一个例子说明:
在这个例子中,我们有4个取值概率为0.5,而且既有正样本也有负样本的情况。计算的时候,其实原则就是相等得分的rank取平均值。具体来说如下: 先排序:
这里需要注意的是:相等概率得分的样本,无论正负,谁在前,谁在后无所谓。 由于只考虑正样本的rank值: 对于正样本A,其rank值为7 对于正样本B,其rank值为6 对于正样本E,其rank值为(5+4+3+2)/4 对于正样本F,其rank值为(5+4+3+2)/4 最后我们得到: ![]() ![]() 其python的代码
import numpy as npfrom sklearn.metrics import roc_auc_scorey_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_trueprint "y_scores is ",y_scoresprint "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_trueprint "y_scores is ",y_scoresprint "AUC is ",roc_auc_score(y_true, y_scores) |
|