AUC(Area Under roc Curve )计算
2016-05-02 23:21
357 查看
ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary
classifier)的优劣。
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曲线越平滑。
Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。
imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。
python
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计算省略。
直接根据真实值(0/1)、预测值(proba值)计算出auc值,中间过程的roc计算省略。
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(AreaUnder Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。
为什么使用ROC曲线
既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(classimbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。
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计算省略。
相关文章推荐
- bzoj 2045: 双亲数
- django框架从零开始_002_helloworld
- python基础练习(五)—— 数据清洗补全处理
- 商品信息列表WEB版的CRUD
- python语言入门
- Java Future
- PHP魔术方法之__call与__callStatic方法
- centos6.5 多网卡配置冗余(bond)
- Servlet之HttpServlet源码介绍
- BroadcastReceiver的原理和使用
- 二叉树之基本操作
- 微软面试100题-65
- 使用VS开发C语言
- hdu 5677 ztr loves substring 二维费用背包+回文
- 支付宝异步通知(notify_url)与return_url.
- 常用树类数据结构总结-二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)的性能分析
- Unity3d面试3
- JAVA并发实现二(线程中止)
- X-Y Problem
- SharePoint 2013 激活标题字段外的Menu菜单