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指标。