利用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的加密模块md5、sha、crypt使用实例
Sep 28 Python
Python入门学习之字符串与比较运算符
Oct 12 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
利用python批量给云主机配置安全组的方法教程
Jun 21 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
python函数修饰符@的使用方法解析
Sep 02 Python
python实现电子词典
Mar 03 Python
详解Python 循环嵌套
Jul 09 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
Python list列表删除元素的4种方法
Nov 01 Python
python神经网络学习 使用Keras进行回归运算
May 04 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 5.5版本的array_column()函数
2014/10/24 PHP
PHP生成plist数据的方法
2015/06/16 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
js判断字符长度及中英文数字等
2014/03/19 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
详解参数传递四种形式
2015/07/21 Javascript
完美解决js传递参数中加号和&号自动改变的方法
2016/10/11 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
店长助理岗位职责
2013/12/13 职场文书
中层竞聘演讲稿
2014/01/09 职场文书
美德好少年事迹材料
2014/01/19 职场文书
风险评估实施方案
2014/03/09 职场文书
机关出纳岗位职责
2014/04/03 职场文书
2014年基建工作总结
2014/12/12 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis
MySQL数据库查询之多表查询总结
2022/08/05 MySQL