本文主要介绍几种常用的用于分类的性能评估指标,同时介绍如何绘制ROC曲线以及计算AUC值的便捷方法。最后再附上一个绘制ROC曲线和计算AUC的Python源码实现。

Precision和Recall

首先我们来看看下面这个混淆矩阵:

pred_label/true_label

Positive

Negative

Positive

TP

FP

Negtive

FN

TN

如上表所示,行表示预测的label值,列表示真实label值。TP,FP,FN,TN分别表示如下意思:

TP(true positive):表示样本的真实类别为正,最后预测得到的结果也为正;

FP(false positive):表示样本的真实类别为负,最后预测得到的结果却为正;

FN(false negative):表示样本的真实类别为正,最后预测得到的结果却为负;

TN(true negative):表示样本的真实类别为负,最后预测得到的结果也为负.

根据以上几个指标,可以分别计算出Accuracy、Precision、Recall(Sensitivity,SN),Specificity(SP)。

$$Accuracy = \frac{TP+TN}{TP+FP+TN+FN}$$

$$Precision = \frac{TP}{TP+FP}$$

$$Recall = \frac{TP}{TP+FN}$$

$$SP = \frac{TN}{TN + FP}$$

Accuracy:表示预测结果的精确度,预测正确的样本数除以总样本数。

precision,准确率,表示预测结果中,预测为正样本的样本中,正确预测为正样本的概率;

recall,召回率,表示在原始样本的正样本中,最后被正确预测为正样本的概率;

specificity,常常称作特异性,它研究的样本集是原始样本中的负样本,表示的是在这些负样本中最后被正确预测为负样本的概率。

在实际当中,我们往往希望得到的precision和recall都比较高,比如当FN和FP等于0的时候,他们的值都等于1。但是,它们往往在某种情况下是互斥的。例如,有50个正样本,50个负样本,结果全部预测为正样本,那么TP=50,FP=50,TN=0,FN=0,按照上面的公式计算,可以得到正样本的recall却为1,precision却为0.5.所以需要一种折衷的方式,因此就有了F1-score。

$$ F1-score = \frac{ 2 \times recall \times precision}{ recall + precision}$$

F1-score表示的是precision和recall的调和平均评估指标。

另外还有一个指标,即MCC,该指标对于不均衡数据集的评估非常有效,公式如下:

ROC曲线

ROC(receiver operating characteristic),平面的横坐标是false positive rate(FPR)假阳率,纵坐标是true positive rate(TPR)真阳率。ROC计算过程如下:

首先每个样本都需要有一个label值,并且还需要一个预测的score值(取值0到1);

然后按这个score对样本由大到小进行排序,假设这些数据位于表格中的一列,从上到下依次降序;

现在从上到下按照样本点的取值进行划分,位于分界点上面的我们把它归为预测为正样本,位于分界点下面的归为负样本;

分别计算出此时的TPR(Recall)=TP/P和FPR(1-SP)=FP/N,然后在图中绘制(FPR, TPR)点。

从上往下逐个样本计算,最后会得到一条光滑的曲线 。

然而,千言万语都不如下面这幅图懂得快:

『roc曲线绘制动画—图片来自[参考文献5](http://stats.stackexchange.com/questions/105501/understanding-roc-curve/105577).』

AUC计算

AUC(area under the curve)就是ROC曲线下方的面积,取值在0.5到1之间,因为随机猜测得到额AUC就是0.5。面积如下图所示,阴影部分即为AUC面积:

『AUC面积图解—图片来自[参考文献5](http://stats.stackexchange.com/questions/105501/understanding-roc-curve/105577).』

The expectation that a uniformly drawn random positive is ranked before a uniformly drawn random negative.

The expected proportion of positives ranked before a uniformly drawn random negative.

The expected true positive rate if the ranking is split just before a uniformly drawn random negative.

The expected proportion of negatives ranked after a uniformly drawn random positive.

The expected false positive rate if the ranking is split just after a uniformly drawn random positive.

下面来介绍下它的计算方法,AUC的计算主要有以下三种。

第一种:积分思维。这也是在早期机器学习文献中常用的AUC计算方法。从积分的思想中演化而来的。假如我们的测试样本有限,那么我们得到的AUC曲线必然是呈现阶梯形状。因此,计算的AUC也就是这些阶梯下面的面积之和(有没有想起以前学高数时的积分面积哈)。我们可以这样来计算,首先把score值进行排序,假设score越大,此样本属于正类的概率就越大。然后一边扫描一边计算就可以得到我们想要的AUC。但是,这样做会有个缺点,当多个测试样本的score值相等时,我们调整一下阈值,得到的不是往上或者往右的延展,而是斜着向上形成一个梯形。此时,就需要计算这个梯形的面积,这样是比较麻烦。 简单的用代码描述下

1

2

3

4

5

6

7

8

9

10auc = 0.0

height = 0.0

for each training example x_i, y_i:

if y_i = 1.0:

height = height + tpr

else

auc += height * fpr

return auc

第二种:Mann–Whitney U test(MWW)。关于AUC还有一个很有趣的性质,它和Wilcoxon-Mann-Witney Test类似(可以去google搜一下),而Wilcoxon-Mann-Witney Test就是测试任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score。有了这个定义,就可以得到了另外一中计算AUC的方法:计算出这个概率值。我们知道,在有限样本中我们常用的得到概率的办法就是通过频率来估计之。这种估计随着样本规模的扩大而逐渐逼近真实值。样本数越多,计算的AUC越准确类似,也和计算积分的时候,小区间划分的越细,计算的越准确是同样的道理。具体来说就是:统计一下所有的 M×N(M为正类样本的数目,N为负类样本的数目)个正负样本对中,有多少个组中的正样本的score大于负样本的score。当二元组中正负样本的 score相等的时候,按照0.5计算。然后除以MN。实现这个方法的复杂度为O(n^2 )。n为样本数(即n=M+N),公式表示如下:

第三种:该方法和上述第二种方法原理一样,但复杂度降低了。首先对score从大到小排序,然后令最大score对应的sample的rank值为n,第二大score对应sample的rank值为n-1,以此类推从n到1。然后把所有的正类样本的rank相加,再减去正类样本的score为最小的那M个值的情况。得到的结果就是有多少对正类样本的score值大于负类样本的score值,最后再除以M×N即可。值得注意的是,当存在score相等的时候,对于score相等的样本,需要赋予相同的rank值(无论这个相等的score是出现在同类样本还是不同类的样本之间,都需要这样处理)。具体操作就是再把所有这些score相等的样本 的rank取平均。然后再使用上述公式。此公式描述如下:

这三种方法,第一种比较好理解,后面两种确实不太好理解,先记下,慢慢理解。

源码

最后,附上ROC曲线绘制代码。下面使用的思想类似积分,但是求得是AUC的近似值,忽略了梯形部分,Code如下:

依赖库:

numpy

matplotlib

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37# -*- coding: utf-8 -*-

"""

Created on Sat Mar 12 17:43:48 2016

@author: liudiwei

"""

import numpy as np

import matplotlib.pyplot as plt

def plotROC(predScore, labels):

point = (1.0, 1.0) #由于下面排序的索引是从小到大,所以这里从(1,1)开始绘制

ySum = 0.0

numPos = np.sum(np.array(labels)==1.0)

numNeg = len(labels)-numPos

yStep = 1/np.float(numPos)

xStep = 1/np.float(numNeg)

sortedIndex = predScore.argsort() #对predScore进行排序,的到排序索引值

fig = plt.figure()

fig.clf()

ax = plt.subplot(111)

for index in sortedIndex.tolist()[0]:

if labels[index] == 1.0: #如果正样本各入加1,则x不走动,y往下走动一步

delX = 0

delY = yStep;

else: #否则,x往左走动一步,y不走动

delX = xStep

delY = 0

ySum += point[1] #统计y走动的所有步数的和

ax.plot([point[0], point[0] - delX], [point[1], point[1] - delY],c='b')

point = (point[0] - delX, point[1] - delY)

ax.plot([0,1],[0,1],'b--')

plt.xlabel('False positive rate'); plt.ylabel('True positive rate')

plt.title('ROC Curve')

ax.axis([0, 1, 0, 1])

plt.show()

#最后,所有将所有矩形的高度进行累加,最后乘以xStep得到的总面积,即为AUC值

print "the Area Under the Curve is: ", ySum * xStep

对于ROC曲线绘制中的参数,输入的第二个参数是类别标签(如,+1,-1形成的文件,每行表示一个样本的真实类别);第一个参数则是由模型训练出来的预测强度,如Adaboost对样本i预测的结果为0.67,对i+1个样本预测的结果是0.3,等等,每行一个,格式和classLabels一样。最后绘制ROC曲线的同时,也在输出ROC曲线下方的AUC面积。

参考文献

auuc 评估指标_分类之性能评估指标相关推荐

  1. 回归和分类模型性能评估指标MSE,MAE,PR,ROC,AUC

    文章目录 0. 模型评估是什么,为什么 1. 不同类型问题的评估指标 1.1 回归问题 1.2 分类问题 1.2.1 准确率和错误率 1.2.2 精确率和召回率 1.2.3 PR曲线图 1.2.4 F ...

  2. 二分类最优阈值确定_分类问题的评估指标一览

    前言 最近分类问题搞的有点多,但对一些指标依旧有模糊的地方(虽然做了笔记), 事实证明, 笔记笔记,没有进到脑子里呀. 因此,我想着肯定有跟我一样半生半熟的小伙伴在分类指标这块依旧有迷惑,毕竟常用的几 ...

  3. 评估指标_机器学习评估方法与评估指标总结

    离线评估方法 离线评估的基本原理是在离线环境中,将数据集划分为"训练集"和"测试集",用"训练集"训练模型,用"测试集" ...

  4. 服务器系统架构的评估,系统架构师:性能评估

    2.5.4性能评估 性能评估是为了一个目的,按照一定的步骤,选用一定的度量项目,通过建模和实 验,对一个系统的性能进行各项检测,对测试结果作出解释,并形成一份文档的技术. 性能评估的一个目的是为性能的 ...

  5. 软件开发项目指标_重要的软件开发指标

    软件开发项目指标 作为一个行业,我们在衡量我们所做的工作以及做得如何出色方面做得非常差. 除了少数组织购买了昂贵的重量级模型(如CMMI或TSP / PSP(全部都是在微观水平上进行测量)或6 Sig ...

  6. 评估指标_供应链改进常用评估指标

    供应链改善项目大部分是基于供应链SCOR模型开展,在SCOR模型中,涉及到分销.计划.采购.制造.配送.退货等功能环节.而供应链的改善核心内容是流程的优化.规则的确定,最终体现在两大目标:" ...

  7. ner 评估指标_序列标注算法评估模块 seqeval 的使用

    在NLP中,序列标注算法是常见的深度学习模型,但是,对于序列标注算法的评估,我们真的熟悉吗? 在本文中,笔者将会序列标注算法的模型效果评估方法和seqeval的使用. 序列标注算法的模型效果评估 在序 ...

  8. 通达信版弘历软件指标_弘历软件多空王指标

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 市场究竟有没有规律,基本分析认为市场永远是错的,价格的运行是由价值决定的,基本分析的目的就是"纠错":而技术分析却认为市场永远是对的, ...

  9. 通达信板块监控指标_通达信板块监测指标公式

    通达信板块监测指标公式 稀缺资源 :SUM((("880505$C")/REF(("880505$C "),1)-1)*1000,0),COLORWHITE; ...

最新文章

  1. 计算机科学和Python编程导论(三) 一些简单的数值程序
  2. Valgrind使用【转】
  3. linux中关于wifi函数,wifi详解(五)
  4. vue如何取消下拉框按回车自动下拉_Web自动化测试 | Select下拉框
  5. 南京php培训班哪家,南京PHP培训中心哪家比较专业
  6. 算法与数据结构(part2)--Python内置类型性能分析
  7. java找出一组数据缺少最小数组_Java获取一维数组的最小值实现方法
  8. 程序员如何掌握新技术与时俱进
  9. 题库明细 使用C#开发数据库应用系统
  10. 20+移动端硬件,Int8极速推理,端侧推理引擎Paddle Lite 2.0 正式发布
  11. python对城市规划_城市规划哪些环节可以可以用数据完美解决?
  12. Mac基础知识:Mac日历如何添加提醒事件的教程
  13. python照片过人脸_python图片人脸检测
  14. 【一起学习输入法】华宇拼音输入法开源版本解析(5)
  15. mysql 储存特殊符号表情报错
  16. Win8.1 取消开机密码
  17. 牛客练习赛72-Abrz的杯子brz的雪糕
  18. html button去除默认样式
  19. 广东中考数学能用计算机吗,今年中考数学允许带计算器
  20. 十分钟读懂AES加密算法

热门文章

  1. 多级中间表示概述MLIR
  2. 使用Nucleus SE实时操作系统
  3. 【CV】Numpy|Python中矩阵和数组乘法及向量相关问题
  4. mysql navicat导入bcp_SQL Server中BCP导入导出用法详解
  5. python 使用import导入不同文件下的文件
  6. Android EditText 编辑框 获取焦点的方法
  7. Error: Gradle project sync failed. Please fix your project and try again.
  8. Day-16 面向对象03 类与类之间的关系
  9. Auty 2017——WebMonitor接口线上检测平台
  10. Linux常用压缩与解压缩命令