AUC值越大_AUC的一般计算和近似计算方式

d85d0e0aba6fd810686e3dc2ce5409c1.png

AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

本文介绍AUC的一般计算方式,以及AUC的近似计算方式。

文章内容仅供学习使用,如有侵权请联系作者删除。

2e1f327c054fd7f65c6e3d2ab0266ae9.png

点击蓝字关注我哦!

AUC的一般计算方式

标准方式:AUC即ROC曲线下面的面积。

在了解AUC计算之前,必须想知道ROC和混淆矩阵的定义[3]。

混淆矩阵涉及四个概念:

  • 预测类别为1的称为Positive(阳性),预测类别为0的称为Negative(阴性)。

  • 真实类别为1的称为True(真),真实类别为0的称为False(伪)。

组合起来就会得到:

0b3441a385c6aa1f4437d1df02da897d.png

进一步得到True Positive(真阳:即真实label为1,预测也为1)、False Positive(伪阳:即真实label为0,预测为1)

然后可以计算出真阳率(预测为1样本占所有真实为1的样本比例)和伪阳率(预测为1样本占所有真实为0的样本比例):

3330353abbe5cfd44674fae8427b07a3.png

接下来说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

7a2eee519a557ec184df4bd1a093db90.png

可以看到,这里的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()

019d74e2f36b42e81bd3d26fb0e48f45.png

AUC就是ROC曲线下的面积,在这个例子中就算出来就是0.63.

AUC的近似计算

AUC有一个近似计算的方法,大概的思想就是:AUC的含义是模型预测正确大于预测错误的概率,从概率的角度出发,统计给出的数据(好坏标签和预测概率或分数)中预测正确比预测错误大的概率是多大[2]。这里虽然是近似计算,但经过验证计算结果跟实际差别非常小,研究者验证的差别是千分位的级别,可以说非常准确了[2]。

7d4f7f38d343fccb1c511bcadeb369f7.png

这个公式具体是什么含义呢?

  • rank_i:表示第i条样本的序号。(概率得分从小到大排,排在第rank个位置)

  • M,N: 分别是正样本的个数和负样本的个数

  • \SUM_{i \in positiveClass} 表示只把正样本的序号加起来。

举个例子[1]:

66ce51918f4cf0ed743be3a5476371db.png

将这个例子排序。按概率排序后得到:

824148c3c2ed33c9d46e6d6054993bf2.png

按照上面的公式,只把正样本的序号加起来也就是只把样本C,D的rank值加起来后减去一个常数项

f1922afa1b0d5c9e2be148891f454be4.png

而我们直接用刚刚基于roc曲线下面积的计算方式,结果是相同的:

7155e623382e624c79f011fcceab0420.png

当然,我们需要注意出现得分一致的情况。

下面举一个例子说明[1]:

c0143fb87436353c32c7a0340f573045.png

在这个例子中,我们有4个取值概率为0.5,而且既有正样本也有负样本的情况。计算的时候,其实原则就是相等得分的rank取平均值。具体来说如下:先排序:

f71e872e70c4008eca2920f52c3b5b13.png


这里需要注意的是:相等概率得分的样本,无论正负,谁在前,谁在后无所谓。

由于只考虑正样本的rank值:

对于正样本A,其rank值为7

对于正样本B,其rank值为6

对于正样本E,其rank值为(5+4+3+2)/4

对于正样本F,其rank值为(5+4+3+2)/4

最后我们得到:0.833333

8f64a6b4c9f29f9a2b015fb3ea680672.png

而我们直接用刚刚基于roc曲线下面积的计算方式,结果是相同的:

42ee558f0f2dcd206b580b926994fd66.png

参考文献:

[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值