利用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生成指定长度的随机数密码
Jan 23 Python
python设置检查点简单实现代码
Jul 01 Python
详解Python的Django框架中的中间件
Jul 24 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
Python中xrange与yield的用法实例分析
Dec 26 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
python实现逐个读取txt字符并修改
Dec 24 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
python、Matlab求定积分的实现
Nov 20 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
Apr 21 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.MVC的模板标签系统(一)
2006/09/05 PHP
PHP个人网站架设连环讲(四)
2006/10/09 PHP
生成静态页面的PHP类
2006/11/25 PHP
php中几种常见安全设置详解
2010/04/06 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
document.createElement()用法
2013/03/13 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
js实现缓动动画
2020/11/25 Javascript
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
python drf各类组件的用法和作用
2021/01/12 Python
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
现金会计岗位职责
2013/12/05 职场文书
技术合作协议书范本
2014/04/18 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
委托公证书样本
2015/01/23 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang