利用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 相关文章推荐
Pycharm学习教程(3) 代码运行调试
May 03 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
python实现简易版计算器
Jun 22 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
使用python语言,比较两个字符串是否相同的实例
Jun 29 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
django admin组件使用方法详解
Jul 19 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
python集合能干吗
Jul 19 Python
Django如何创作一个简单的最小程序
May 12 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利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
Python中的super用法详解
2015/05/28 Python
python win32 简单操作方法
2017/05/25 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
keras:model.compile损失函数的用法
2020/07/01 Python
Python requests上传文件实现步骤
2020/09/15 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
幼儿园教师辞职信
2014/01/18 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
计划生育工作总结2015
2015/04/03 职场文书
甲午风云观后感
2015/06/02 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript