本文原作者:陈亮,经授权后发布。
原文链接:https://cloud.tencent.com/developer/article/1522299
机器学习模型的评估指标很多,对于分类问题常会看到AUC作为性能衡量指标,大家往往对AUC值本身感兴趣,如其具体值的物理含义等。本文希望不引入太多公式,简单讨论下AUC指标。
AUC是二分类模型的评价指标。
AUC的通俗解释是:随机给定一个正样本A和一个负样本B,分类器对A预测输出为正样本的概率比分类器对B预测输出为正样本的概率 大的可能性。
即:随机挑选一个标签为1的样本A,再随机挑选一个标签为0的样本B。预测“样本A为1的概率”大于“样本B为1的概率”的概率就是AUC值。所以,AUC = 0.8的意思是说,随机挑选个标签为1的样本,它被排在随机挑的0样本的前面的概率是0.8。显然AUC是0.5的话,就说明这个模型和随便猜没什么两样。
AUC代表分类器的辨识度,AUC越大,往往表明分类辨识效果越好。
AUC的数值与每个预测概率的数值大小无关,在乎的是每个预测概率的排序。假设我们按照概率从大到小排。如果根据预测结果,所有标签为1的样本都排在了标签为0的样本前面,那么AUC就是1。而AUC的最小值为0.5,表示分类器完全无效,同随机猜测正反面一样。
AUC的值是ROC曲线下的面积,也正如其名称Area Under Curve。ROC曲线是统计里面的概率,基于样本的真实类别和预测概率来画的,其x轴是false positive rate,y轴是true positive rate。这就要介绍下这两个rate:对于二分类问题,一个样本只能是0或1两种类别,当用一个分类器进行概率预测的时候,对于真实为0的样本,我们可能预测其为0或1,真实为1的样本,我们也可能预测其为1或0,这样的四种可能性:
真实1真实0预测1true positive样本数量为Afalse positive样本数量为C预测0false negative样本数量为Btrue negative样本数量为D
True positive rate = A/(A+B) False positive rate = C/(C+D)
True positive rate刻画的是分类器所识别出的正样本的比例,反映正类覆盖程度。False positive rate刻画的是分类器错认为正类的负样本占所有负样本的比例。分类模型将各个样本预测归到某个类,结果一般为实数值,如逻辑回归结果为0到1之间的实数值。就会涉及如何确定阈值,使得模型结果大于这个阈值时划为一类,否则划为另一类。假设确定阈值为0.6,大于这个值的样本为正类,小于的为负类,当减少阈值到0.5时,固然能找出更多的正类(提高了所识别出正样本的比例),但同时也将更多负样本当做了正类(升高了错认为正类的负样本占所有负样本的比例)
这样就较好理解上图中,ROC曲线的左下角(0,0)即为预测全部样本都为0时的点(A=0,C=0),右上角的(1,1)即为预测全部样本都为1时的点(B=0,D=0)。
另外ROC是Receiver Operating Characteristic的缩写,翻译为“接受者操作特性曲线”,其漫漫历史有机会再谈。
在大多数机器学习分类任务中,我们都使用AUC作为分类器的性能衡量指标。AUC有些很好的特性:如不用设定阈值、对测试集的正负样本数量比例不敏感、还有可以根据随机分类的AUC值为0.5易作为参考比较。
然而有些场景下AUC值不一定适宜表征分类器性能,对于数据高度不平衡的场景,AUC值会偏高。虽然AUC对不平衡类别不敏感,但是会产生有误导的结果。考虑有大量负样本和极少量正样本的场景,在这种情况下,一个分类器很容易得到负的预测,
import numpy as np
from sklearn import metrics
# 样本数量为N
N = 10000
# 生成80%简单负样本,20%平衡的正负样本
a = [0,0,0,0,0,0,0,0,1,-1]
d = np.random.choice(a, size=N, replace=True, p=None)
label = np.zeros(d.size)
label[d>0] = 1
rand_preds, good_preds, better_preds = [], [], []
for i in d:
rand = abs(i)*np.random.uniform(0,1)
rand_preds.append(rand) # 对简单负样本分类正确,对其余随机预测
good_preds.append(rand+i*0.1) # 对简单负样本分类正确,对其余增加预测度
better_preds.append(rand+i*0.3)
rand_auc = metrics.roc_auc_score(label,rand_preds)
good_auc = metrics.roc_auc_score(label,good_preds)
better_auc = metrics.roc_auc_score(label,better_preds)
print(rand_auc, good_auc, better_auc)
#输出为0.9451,0.9655,0.9918
即使rand_preds仅分类正确简单负样本,依然可以有很高的AUC值0.9451。由于有大量的负样本,三个分类器的AUC性能差别只有2%~3%。
综上,AUC就是所有正样本中随机选取一个样本A,所有负样本中随机选取一个样本B,然后根据分类器对两个随机样本进行预测,把样本A预测为正类的概率=p1,把样本B预测为正类的概率=p0,p1>p0的概率即为AUC。
所以AUC反映的是分类器对样本的排序能力,根据这个解释,易理解AUC=0.5即完全随机对样本分类。另外值得提到的是,虽然AUC对样本类别是否均衡并不敏感(这也是不均衡样本通常用AUC评价分类器性能的一个原因),但是对于数据高度不平衡的场景,AUC值会带来理解偏差。