利用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 相关文章推荐
python2 与python3的print区别小结
Jan 16 Python
python实现C4.5决策树算法
Aug 29 Python
用Python读取几十万行文本数据
Dec 24 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
Django框架模板的使用方法示例
May 25 Python
如何在django中添加日志功能
Feb 06 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
Python线程threading模块用法详解
Feb 26 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 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
实用函数4
2007/11/08 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
万能的php分页类
2017/07/06 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
python多进程使用函数封装实例
2020/05/02 Python
Python实现疫情地图可视化
2021/02/05 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
.net笔试题
2014/03/03 面试题
最新茶叶店创业计划书
2014/01/14 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
机关出纳岗位职责
2014/04/03 职场文书
初级党校心得体会
2014/09/11 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
期末个人总结范文
2015/02/13 职场文书
社区国庆节活动总结
2015/03/23 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers