利用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 相关文章推荐
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
详解python发送各类邮件的主要方法
Dec 22 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
Python实现的简单计算器功能详解
Aug 25 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
浅析NumPy 切片和索引
Sep 02 Python
如何利用python发送邮件
Sep 26 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
Python importlib模块重载使用方法详解
Oct 13 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
smarty实例教程
2006/11/19 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
Vue指令指令大全
2019/02/09 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
pymysql模块的操作实例
2019/12/17 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
一套Java笔试题
2016/08/20 面试题
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
Order by的几种用法
2013/06/16 面试题
软件设计的目标是什么
2016/12/04 面试题
Java程序员综合测试题
2014/04/25 面试题
采购助理岗位职责
2014/02/16 职场文书
单位员工收入证明样本
2014/10/09 职场文书
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
部分武汉产收音机展览
2022/04/07 无线电
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB