您的位置:首页 > 其它

AUC(Area Under roc Curve )计算

2016-05-02 23:21 357 查看
ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary
classifier)的优劣。

如何画ROC曲线

对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值,这又是如何得到的呢?我们先来看一下Wikipedia(http://en.wikipedia.org/wiki/Receiver_operating_characteristic)上对ROC曲线的定义:

In
signal detection theory, a receiver operating characteristic (ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied.
如何理解这里的“discrimination
threashold”呢?我们忽略了分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本)。通过更深入地了解各个分类器的内部机理,我们总能想办法得到一种概率输出。通常来说,是将一个实数范围通过某个变换映射到(0,1)区间。
假如我们已经得到了所有样本的概率输出(属于正样本的概率),现在的问题是如何改变“discrimination threashold”?我们根据每个测试样本属于正样本的概率值从小到大排序。
从小到大设置阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到很多组FPR和TPR的值,将它们画在ROC曲线上。当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。

AUC值的计算

AUC(Area
Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

为什么使用ROC曲线

既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class
imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

python
sklearn实现

sklearn.metrics.roc_curve(true_y. pred_proba_score, pos_labal)

计算roc曲线,roc曲线有三个属性:fpr, tpr,和阈值,因此该函数返回这三个变量

[python] view
plain copy

 

 





import numpy as np  

from sklearn.metrics import roc_curve  

y = np.array([1,1,2,2])  

pred = np.array([0.1, 0.4, 0.35, 0.8])  

fpr, tpr, thresholds = roc_curve(y, pred, pos_label=2)  

fpr      # array([ 0. ,  0.5,  0.5,  1. ])  

tpr      # array([ 0.5,  0.5,  1. ,  1. ])  

thresholds      #array([ 0.8 ,  0.4 ,  0.35,  0.1 ])  

from sklearn.metrics import auc  

metrics.auc(fpr, tpr)  

0.75  

sklearn.metrics.auc(x, y, reorder=False)

计算AUC值,其中x,y分别为数组形式,根据(xi, yi)在坐标上的点,生成的曲线,然后计算AUC值。

sklearn.metrics.roc_auc_score(true_y, pred_proba_y)

直接根据真实值(0/1)、预测值(proba值)计算出auc值,中间过程的roc计算省略。

TensorFlow实现

tf.contrib.metrics.streaming_auc(predictions, labels, weights=None, num_thresholds=200, metrics_collections=None, updates_collections=None, curve='ROC', name=None)

直接根据真实值(0/1)、预测值(proba值)计算出auc值,中间过程的roc计算省略。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: