混淆矩阵是理解大多数评价指标的基础,毫无疑问也是理解AUC的基础。丰富的资料介绍着混淆矩阵的概念,这里用一个经典图来解释混淆矩阵是什么。
显然,混淆矩阵包含四部分的信息:html
对照着混淆矩阵,很容易就能把关系、概念理清楚,可是长此以往,也很容易忘记概念。不妨咱们按照位置先后分为两部分记忆,前面的部分是True/False表示真假,即表明着预测的正确性,后面的部分是positive/negative表示正负样本,即表明着预测的结果,因此,混淆矩阵便可表示为正确性-预测结果的集合。如今咱们再来看上述四个部分的概念(均表明样本数,下述省略):python
几乎我所知道的全部评价指标,都是创建在混淆矩阵基础上的,包括准确率、精准率、召回率、F1-score,固然也包括AUC。git
事实上,要一会儿弄清楚什么是AUC并非那么容易,首先咱们要从ROC曲线提及。对于某个二分类分类器来讲,输出结果标签(0仍是1)每每取决于输出的几率以及预约的几率阈值,好比常见的阈值就是0.5,大于0.5的认为是正样本,小于0.5的认为是负样本。若是增大这个阈值,预测错误(针对正样本而言,即指预测是正样本可是预测错误,下同)的几率就会下降可是随之而来的就是预测正确的几率也下降;若是减少这个阈值,那么预测正确的几率会升高可是同时预测错误的几率也会升高。实际上,这种阈值的选取也必定程度上反映了分类器的分类能力。咱们固然但愿不管选取多大的阈值,分类都能尽量地正确,也就是但愿该分类器的分类能力越强越好,必定程度上能够理解成一种鲁棒能力吧。
为了形象地衡量这种分类能力,ROC曲线横空出世!以下图所示,即为一条ROC曲线(该曲线的原始数据第三部分会介绍)。如今关心的是:github
显然,ROC曲线的横纵坐标都在[0,1]之间,天然ROC曲线的面积不大于1。如今咱们来分析几个特殊状况,从而更好地掌握ROC曲线的性质:数据结构
因而,咱们能够获得基本的结论:ROC曲线在斜对角线如下,则表示该分类器效果差于随机分类器,反之,效果好于随机分类器,固然,咱们但愿ROC曲线尽可能除于斜对角线以上,也就是向左上角(0,1)凸。app
ROC曲线必定程度上能够反映分类器的分类效果,可是不够直观,咱们但愿有这么一个指标,若是这个指标越大越好,越小越差,因而,就有了AUC。AUC实际上就是ROC曲线下的面积。AUC直观地反映了ROC曲线表达的分类能力。机器学习
从做者有限的经从来说,AUC最大的应用应该就是点击率预估(CTR)的离线评估。CTR的离线评估在公司的技术流程中占有很重要的地位,通常来讲,ABTest和转全观察的资源成本比较大,因此,一个合适的离线评价能够节省不少时间、人力、资源成本。那么,为何AUC能够用来评价CTR呢?咱们首先要清楚两个事情:函数
咱们不只但愿分类器给出是否点击的分类信息,更须要分类器给出准确的几率值,做为排序的依据。因此,这里的AUC就直观地反映了CTR的准确性(也就是CTR的排序能力)性能
步骤以下:学习
代码以下所示:
import pylab as pl from math import log,exp,sqrt import itertools import operator def read_file(file_path, accuracy=2): db = [] #(score,nonclk,clk) pos, neg = 0, 0 #正负样本数量 #读取数据 with open(file_path,'r') as fs: for line in fs: temp = eval(line) #精度可控 #score = '%.1f' % float(temp[0]) score = float(temp[0]) trueLabel = int(temp[1]) sample = [score, 0, 1] if trueLabel == 1 else [score, 1, 0] score,nonclk,clk = sample pos += clk #正样本 neg += nonclk #负样本 db.append(sample) return db, pos, neg def get_roc(db, pos, neg): #按照输出几率,从大到小排序 db = sorted(db, key=lambda x:x[0], reverse=True) file=open('data.txt','w') file.write(str(db)) file.close() #计算ROC坐标点 xy_arr = [] tp, fp = 0., 0. for i in range(len(db)): tp += db[i][2] fp += db[i][1] xy_arr.append([fp/neg,tp/pos]) return xy_arr def get_AUC(xy_arr): #计算曲线下面积 auc = 0. prev_x = 0 for x,y in xy_arr: if x != prev_x: auc += (x - prev_x) * y prev_x = x return auc def draw_ROC(xy_arr): x = [_v[0] for _v in xy_arr] y = [_v[1] for _v in xy_arr] pl.title("ROC curve of %s (AUC = %.4f)" % ('clk',auc)) pl.xlabel("False Positive Rate") pl.ylabel("True Positive Rate") pl.plot(x, y)# use pylab to plot x and y pl.show()# show the plot on the screen
数据:提供的数据为每个样本的(预测几率,真实标签)tuple
数据连接:https://pan.baidu.com/s/1c1FUzVM,密码1ax8
计算结果:AUC=0.747925810016,与Spark MLLib中的roc_AUC计算值基本吻合
固然,选择的几率精度越低,AUC计算的误差就越大
不少大牛对AUC都有本身的认识和理解,这里围绕和AUC的意义是什么,给出一些能帮助本身理解AUC的 大牛们的回答
[1]From 机器学习和统计里面的auc怎么理解?
[2]From 机器学习和统计里面的auc怎么理解?
[3]From 精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
[4]From 多高的AUC才算高?
其余一些参考资料:
利用Python画ROC曲线和AUC值计算
精确率与召回率,RoC曲线与PR曲线
ROC和AUC介绍以及如何计算AUC
基于混淆矩阵的评价指标
机器学习性能评估指标