AUC简介
- AUC是Area Under Curve的首字母缩写,这里的Curve指的就是ROC曲线,AUC就是ROC曲线下面的面积(下面会介绍)
- AUC是模型评价指标,只能评价二分类模型,其他的二分类模型指标有logloss,precision,accuracy等
为什么要用AUC
因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。
在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),此时如果用precision/recall等指标的话,数据分布的波动就会出现预测的较大波动
AUC考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价
下图是ROC曲线和Precision-Recall曲线的对比,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。
可以看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。
AUC计算
-
混淆矩阵
-
混淆矩阵中有着Positive、Negative、True、False的概念,其意义如下:
- 预测类别为1的为Positive(阳性),预测类别为0的为Negative(阴性)
- 预测正确的为True(真),预测错误的为False(伪)
-
True Positive Rate(TPR, 真阳率)
- 所有真实类别为1的样本中,预测类别为1的比例
- TPR = TP/(TP+FN)
-
False Positive Rate(FPR, 伪阳率)
- 所有真实类别为0的样本中,预测类别为1的比例
- FPR = FP/(FP+TN)
-
-
ROC
- ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一个画在二维平面上的曲线——ROC 曲线。平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)
- ROC曲线是一系列threshold下的(FPR,TPR)数值点的连线。此时的threshold的取值分别为测试数据集中各样本的预测概率,但取各个概率的顺序是从大到小的。
-
AUC计算
- 步骤:
- 按预测概率从大到小的顺序排序
- 计算全部概率值下的FPR和TPR,得到点(FPR, TPR)
- 画出最终的ROC曲线和计算AUC值(即面积)
- 可以转化为每个小矩阵来计算
- 举例:
- 在反欺诈场景,设非欺诈类样本为正例,负例占比很少(假设0.1%),如果使用准确率评估,把所有的样本预测为正例便可以获得99.9%的准确率。但是如果使用AUC,把所有样本预测为正例,TPRate和FPRate同时为1,AUC仅为0.5,成功规避了样本不均匀带来的问题。
- 步骤:
python实现
- 数据准备
- 假设我们现在有个测试数据文件 data.txt,格式为 score, pos_label, neg_label
- 0.99,1,0
- 0.88,1,0
- ...
- 0.33,0,1
- 假设我们现在有个测试数据文件 data.txt,格式为 score, pos_label, neg_label
- 代码实现
#! -*- coding=utf-8 -*- import pylab as pl from math import log,exp,sqrt evaluate_result="data.txt" db = [] #[score,nonclk,clk] pos, neg = 0, 0 with open(evaluate_result,'r') as fs: for line in fs: clk,score = line.strip().split(' ') clk = int(clk) nonclk = 1-clk score = float(score) db.append([score,nonclk,clk]) pos += clk neg += nonclk db = sorted(db, key=lambda x:x[0], reverse=True) #计算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]) #计算曲线下面积 auc = 0. prev_x = 0 for x,y in xy_arr: if x != prev_x: auc += (x - prev_x) * y prev_x = x print "the auc is %s."%auc x = [_v[0] for _v in xy_arr] y = [_v[1] for _v in xy_arr] pl.title("ROC curve of %s (AUC = %.4f)" % ('svm',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