利用Python画ROC曲线和AUC值计算


Posted in Python onSeptember 19, 2016

前言

ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣。这篇文章将先简单的介绍ROC和AUC,而后用实例演示如何python作出ROC曲线图以及计算AUC。

AUC介绍

AUC(Area Under Curve)是机器学习二分类模型中非常常用的评估指标,相比于F1-Score对项目的不平衡有更大的容忍性,目前常见的机器学习库中(比如scikit-learn)一般也都是集成该指标的计算,但是有时候模型是单独的或者自己编写的,此时想要评估训练模型的好坏就得自己搞一个AUC计算模块,本文在查询资料时发现libsvm-tools有一个非常通俗易懂的auc计算,因此抠出来用作日后之用。

AUC计算

AUC的计算分为下面三个步骤:

    1、计算数据的准备,如果模型训练时只有训练集的话一般使用交叉验证的方式来计算,如果有评估集(evaluate)一般就可以直接计算了,数据的格式一般就是需要预测得分以及其目标类别(注意是目标类别,不是预测得到的类别)

    2、根据阈值划分得到横(X:False Positive Rate)以及纵(Y:True Positive Rate)点

    3、将坐标点连成曲线之后计算其曲线下面积,就是AUC的值

直接上python代码

#! -*- coding=utf-8 -*-
import pylab as pl
from math import log,exp,sqrt


evaluate_result="you file path"
db = [] #[score,nonclk,clk]
pos, neg = 0, 0 
with open(evaluate_result,'r') as fs:
 for line in fs:
 nonclk,clk,score = line.strip().split('\t')
 nonclk = int(nonclk)
 clk = int(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

输入的数据集可以参考svm预测结果

其格式为:

nonclk \t clk \t score

其中:
    1、nonclick:未点击的数据,可以看做负样本的数量

    2、clk:点击的数量,可以看做正样本的数量

    3、score:预测的分数,以该分数为group进行正负样本的预统计可以减少AUC的计算量

运行的结果为:

利用Python画ROC曲线和AUC值计算

如果本机没安装pylab可以直接注释依赖以及画图部分

注意

上面贴的代码:

    1、只能计算二分类的结果(至于二分类的标签随便处理)

    2、上面代码中每个score都做了一次阈值,其实这样效率是相当低的,可以对样本进行采样或者在计算横轴坐标时进行等分计算

总结

以上就是这篇文章的全部内容,希望本文的内容能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
跟老齐学Python之私有函数和专有方法
Oct 24 Python
在Python中操作文件之read()方法的使用教程
May 24 Python
Django Admin实现上传图片校验功能
Mar 06 Python
浅谈Python基础之I/O模型
May 11 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
python中有关时间日期格式转换问题
Dec 25 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
Python 实现微信自动回复的方法
Sep 11 Python
Python文件与文件夹常见基本操作总结
Sep 19 #Python
Python实现批量更换指定目录下文件扩展名的方法
Sep 19 #Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 #Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 #Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 #Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 #Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 #Python
You might like
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
smarty模板数学运算示例
2016/12/11 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
JS跨域代码片段
2012/08/30 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
js模拟微博发布消息
2017/02/23 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
解决vue-cli项目打包出现空白页和路径错误的问题
2018/09/04 Javascript
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
详解Python3 基本数据类型
2019/04/19 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
Python requests获取网页常用方法解析
2020/02/20 Python
python自动下载图片的方法示例
2020/03/25 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
编写strcpy函数
2014/06/24 面试题
银行先进个人事迹材料
2014/05/11 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
求职信如何撰写?
2019/05/22 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
php双向队列实例讲解
2021/11/17 PHP