利用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中的struct模块
Apr 28 Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
Python使用PIL库实现验证码图片的方法
Mar 11 Python
Python简单网络编程示例【客户端与服务端】
May 26 Python
python中format()函数的简单使用教程
Mar 14 Python
浅谈python中字典append 到list 后值的改变问题
May 04 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
python中reload重载实例用法
Dec 15 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去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
PHP微信支付开发实例
2016/06/22 PHP
eclipse php wamp配置教程
2016/06/30 PHP
自写的一个jQuery圆角插件
2010/10/26 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
25岁生日感言
2014/01/13 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
网络营销计划
2015/01/17 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
关于环保的广播稿
2015/12/17 职场文书
浅析NIO系列之TCP
2021/06/15 Java/Android
Redis入门基础常用操作命令整理
2022/06/01 Redis