利用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文件和目录操作函数小结
Jul 11 Python
Python中几种导入模块的方式总结
Apr 27 Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 Python
python中类的属性和方法介绍
Nov 27 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
Dec 21 Python
python3实现钉钉消息推送的方法示例
Mar 14 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
python列表生成器迭代器实例解析
Dec 19 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
Python 如何反方向迭代一个序列
Jul 28 Python
Python爬虫之Selenium下拉框处理的实现
Dec 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 缓存实现代码及详细注释
2010/05/16 PHP
深入解析php中的foreach问题
2013/06/30 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
PHP循环结构实例讲解
2014/02/10 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
PHP的PDO连接讲解
2019/01/24 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
利用python程序帮大家清理windows垃圾
2017/01/15 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
Python如何实现邮件功能
2020/05/27 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
美国社交购物市场:MassGenie
2019/02/18 全球购物
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
MongoDB数据库之添删改查
2022/04/26 MongoDB