AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。
本文介绍AUC的一般计算方式,以及AUC的近似计算方式。
文章内容仅供学习使用,如有侵权请联系作者删除。
点击蓝字关注我哦!
AUC的一般计算方式
标准方式:AUC即ROC曲线下面的面积。
在了解AUC计算之前,必须想知道ROC和混淆矩阵的定义[3]。
混淆矩阵涉及四个概念:
预测类别为1的称为Positive(阳性),预测类别为0的称为Negative(阴性)。
真实类别为1的称为True(真),真实类别为0的称为False(伪)。
组合起来就会得到:
进一步得到True Positive(真阳:即真实label为1,预测也为1)、False Positive(伪阳:即真实label为0,预测为1)
然后可以计算出真阳率(预测为1样本占所有真实为1的样本比例)和伪阳率(预测为1样本占所有真实为0的样本比例):
接下来说ROC:
ROC曲线的横轴是FPRate,纵轴是TPRate分类器给出预测的概率之后,我们需要设定已给阈值来把各个预测值划分为预测为正/负。即,小于等于这个阈值的所有样本预测为负,大于这个阈值的样本预测为正。
ROC计算的是每一个Threshold对应的一组True Positive Rate和False Positive Rate。知乎作者:太空来的小土豆
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.metrics import roc_curve, auc# Calculate 'True Positive Rate' and 'False Positive Rate' of each thresholdscores = np.array([ 0.95, 0.9, 1, 0.9, 0.9, 0.8, 0.8, 0.7, 0.7, 0.7, 0.7, 0.6, 0.6, 0.6, 0.6, 0.5, 0.5, 0.5, 0.5, 0.4, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.0, 0.2, 0.1, 0.11])true_values = np.array([0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1])fpr, tpr, thresholds = roc_curve(true_values, scores, pos_label=1)d = {'Threshold': thresholds, 'True Positive Rate': tpr, 'False Positive Rate': fpr}metric_table = pd.DataFrame(d, columns = ['Threshold', 'True Positive Rate', 'False Positive Rate'])metric_table
可以看到,这里的threshold就是刚刚样本预测值中的那些唯一值,即:set(scores)
接下来绘制roc曲线
# Plot ROC Curveroc_auc = auc(fpr, tpr)plt.figure()plt.plot(fpr, tpr, color='red', lw=2, marker='o', label='ROC curve (area = %0.2f)' % roc_auc)x = [0, 1]y = [0, 1]plt.plot(x, y, color='black', lw=2, linestyle='--')plt.xlim([0.0, 1.0])plt.ylim([0.0, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('ROC Curve')plt.legend()plt.grid(alpha=0.2)plt.show()
AUC就是ROC曲线下的面积,在这个例子中就算出来就是0.63.
AUC的近似计算
AUC有一个近似计算的方法,大概的思想就是:AUC的含义是模型预测正确大于预测错误的概率,从概率的角度出发,统计给出的数据(好坏标签和预测概率或分数)中预测正确比预测错误大的概率是多大[2]。这里虽然是近似计算,但经过验证计算结果跟实际差别非常小,研究者验证的差别是千分位的级别,可以说非常准确了[2]。
这个公式具体是什么含义呢?
rank_i:表示第i条样本的序号。(概率得分从小到大排,排在第rank个位置)
M,N: 分别是正样本的个数和负样本的个数
\SUM_{i \in positiveClass} 表示只把正样本的序号加起来。
举个例子[1]:
将这个例子排序。按概率排序后得到:
按照上面的公式,只把正样本的序号加起来也就是只把样本C,D的rank值加起来后减去一个常数项
而我们直接用刚刚基于roc曲线下面积的计算方式,结果是相同的:
当然,我们需要注意出现得分一致的情况。
下面举一个例子说明[1]:
在这个例子中,我们有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
最后我们得到:0.833333
而我们直接用刚刚基于roc曲线下面积的计算方式,结果是相同的:
参考文献:
[1] AUC的计算方法
https://blog.csdn.net/qq_22238533/article/details/78666436
[2] AUC,ROC快速计算——Python代码
https://blog.csdn.net/sinat_30715661/article/details/89160969
[3] 如何理解机器学习和统计中的AUC?
https://www.zhihu.com/question/39840928
[4] AUC计算方法总结
https://blog.csdn.net/pzy20062141/article/details/48711355