利用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 yield机制的异步操作同步化编程模型
Mar 18 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
对python添加模块路径的三种方法总结
Oct 16 Python
用python爬取租房网站信息的代码
Dec 14 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
简单了解python数组的基本操作
Nov 26 Python
在Python中通过threshold创建mask方式
Feb 19 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
python单例模式的应用场景实例讲解
Feb 24 Python
Python基础之教你怎么在M1系统上使用pandas
May 08 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
检查url链接是否已经有参数的php代码 添加 ? 或 &
2010/02/09 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
分享php多功能图片处理类
2016/05/15 PHP
php微信开发之关注事件
2018/06/14 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
详解angularjs popup-table 弹出框表格指令
2017/09/20 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
python处理json数据中的中文
2014/03/06 Python
python实现数通设备端口监控示例
2014/04/02 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Python中的Descriptor描述符学习教程
2016/06/02 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
python右对齐的实例方法
2020/07/05 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
浅谈html5 响应式布局
2014/12/24 HTML / CSS
HTML5实现预览本地图片
2016/02/17 HTML / CSS
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
2014年共青团工作总结
2014/12/10 职场文书
大学升旗仪式主持词
2015/07/04 职场文书