AUC指标详解

AUC 指标详解

  • AUC (Area Under ROC Curve): ROC曲线下面积;
  • ROC (Receiver Operating Characteristic) 受试者工作特征曲线;
  • TRP (True Positive Rate) 真正例率;
  • FPR (False Positive Rate)假正例率;

指标计算方法

通过本教程,你可以了解不同任务场景下适合使用的AUC计算方法。

当你对机器学习的评价指标已经有了基本认识,你会了解到F1, ACC, AUC等等常用的指标,他们的计算基础都是分类结果的混淆矩阵。通常情况下,当模型类别的区分程度不高时,往往会倾向于将AUC也作为模型的评价指标(比如当模型的预测结果区分度不大,但是相对大小明确,e.g. 标签为0的样本,预测概率为[0.4,0.3,0.3],往往使用acc这样的指标很难预测准确,但是使用auc就对此进行一定的描述),这样的评价指标并不依赖于特定阈值的选择,因此具有很强的可比性。

AUC的计算可以理解为一个遍历阈值的过程,通过不同的阈值画出ROC曲线,计算曲线下面积。
T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP
F P R = F P T N + F P FPR=\frac{FP}{TN+FP} FPR=TN+FPFP
分别以它们为横轴、纵轴作图,就得到了ROC曲线,由于在实际情况下是有限个样本,因此ROC曲线图是由离散的线段构成,因此可以通过分段函数的方式求得准确的AUC。

代码说明

在代码的实际使用中,往往直接调用sklearn的roc_auc_score函数实现该功能,但是在网上并没有找到很详细的sklearn AUC使用指南,因此这里给几个比较简单好理解的例子分类为大家说明一下AUC函数的使用方法。

首先先说明一下AUC计算不同的情况:

在这里插入图片描述

我将实际的任务分为了不同的情况进行考虑,在表格中,我分别标注了不同情况下函数对于输入的size要求。sklearn会根据y_true的尺寸判断任务类型为multi-label还是multi-class。下面我分别举例对几种情况的输入进行举例说明:

from sklearn.metrics import roc_auc_score
import numpy as np

# multi-label binary
multi_label = np.array([[0,1],[0,1],[1,0],[0,1]])
probs = np.array([[0.2, 0.8], [0.3, 0.7], [0.4, 0.6], [0.5, 0.5]])

auc_score_micro = roc_auc_score(multi_label, probs, multi_class='ovr', average='micro')
auc_score_macro = roc_auc_score(multi_label, probs, multi_class='ovr', average='macro')

# multi-label, C>2
multi_label = np.array([[1,0,0],
                        [0,1,0],
                        [1,0,0],
                        [0,0,1]])
probs = np.array([[0.2, 0.8, 0.],
                 [0.3, 0.7, 0.],
                 [0.4, 0.6, 0.],
                 [0.5, 0.3, 0.2]])
auc_score_micro = roc_auc_score(multi_label, probs, multi_class='ovr', average='micro')
auc_score_macro = roc_auc_score(multi_label, probs, multi_class='ovr', average='macro')
auc_score_weighted = roc_auc_score(multi_label, probs, multi_class='ovr', average='weighted')

# multi-class binary
label = np.array([1, 1, 0, 1])
probs = np.array([[0.2, 0.8], [0.3, 0.7], [0.4, 0.6], [0.5, 0.5]])
auc_score_micro = roc_auc_score(label, probs[:,1], multi_class='ovr', average='micro')
auc_score_macro = roc_auc_score(label, probs[:,1], multi_class='ovr', average='macro')


# multi-class, C>2
label = np.array([0,1,0,2])
probs = np.array([[0.2, 0.8, 0.],
                 [0.3, 0.7, 0.],
                 [0.4, 0.6, 0.],
                 [0.5, 0.3, 0.2]])
# auc_score_micro = roc_auc_score(multi_label, probs, multi_class='ovr', average='micro')  # error
auc_score_macro = roc_auc_score(multi_label, probs, multi_class='ovr', average='macro')
auc_score_weighted = roc_auc_score(multi_label, probs, multi_class='ovr', average='weighted')

此外,在某些情况下multi-class和multi-label的计算结果是相同的,在只有两个类别的情况下,micro和macro在multi-class任务上是相同的。
下面将分析得到的相同的结果列在后面,读者可以后续根据代码自行验证。

e = f = b ≠ a ; c ≠ d , d = g e=f=b\neq a; \\ c\neq d, d=g e=f=b=a;c=d,d=g

补充说明

AUC不同的参数multi_class和average在实际的使用中也有所不同,详细的可以通过代码自己尝试。

如果希望在实验中使用AUC,尽管上述不同的方式计算出来的AUC结果可能相同,但是最好根据multi-class和multi-label任务的不同对输入的格式进行区分,以免出现micro和macro平均结果不同的情况,误导实验效果的评估。

关于AUC分数的不同用法,还有很多细节可以学习,详细请移步sklearn的源代码和官方文档就进行学习,相信结合官方文档和上述简单的例子,可以帮助你更快、更准确地理解AUC指标。

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值