前言

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的计算量

运行的结果为:

如果本机没安装pylab可以直接注释依赖以及画图部分

注意

上面贴的代码:

1、只能计算二分类的结果(至于二分类的标签随便处理)

2、上面代码中每个score都做了一次阈值,其实这样效率是相当低的,可以对样本进行采样或者在计算横轴坐标时进行等分计算

更多Python画ROC曲线和AUC值计算相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

python画出roc曲线 auc计算逻辑_Python画ROC曲线和AUC值计算相关推荐

  1. python 一张图画多条线_Python画多条线在一个图里

    概要: python的matplotlib作图很强大,本文教你用6种不同方式解决将多种数据曲线画到一起. 问题: 今天,老板又要一个数据报表,小明选择用 python来实现."用matplo ...

  2. python找出矩阵中的最大值_Python例题:找到并输出矩阵中的最大值

    早就听说Python是一门很强大的语言,不过一直没有什么机会去学.直到前一段时间我的技术群里有人问我了一道Python的题目,本着帮助他人.充实自己的想法,我二话不说就去查找资料,做出了这道题.也算是 ...

  3. python制作会动的表情包_python画微信表情符的实例代码

    #@project = facepalm #@file = main #@author = Maoliang Ran #@create_time = 2018/8/28 22:57 import tu ...

  4. python画半圆的指令是什么_python画圆的方式是什么

    python画圆的方式是什么 发布时间:2020-09-03 11:04:03 来源:亿速云 阅读:72 作者:小新 python画圆的方式是什么?这个问题可能是我们日常学习或工作经常见到的.希望通过 ...

  5. python给出数据点进行插值_Python对数据进行插值和下采样的方法

    使用Python进行插值非常方便,可以直接使用scipy中的interpolate import numpy as np x1 = np.linspace(1, 4096, 1024) x_new = ...

  6. python找出矩阵中的最大值_Python / Scipy:找到矩阵的“有界”最小值/最大值

    我认为指出我的问题最简单,一般情况很难解释. 说我有一个矩阵 a with dimensions NxMxT, 人们可以将T视为时间维度(使问题更容易).设(n,m)为通过NxM的指数.我可以调用(n ...

  7. 用python打印出一个人的照片_python爬取图片实例 - 一个人看日出,一个人看夕阳,一个人走路,一个人欢笑 - OSCHINA - 中文开源技术交流社区...

    小李飞刀图片:http://www.verycd.com/entries/507389/images/view/778356 # -*- coding: utf-8 -*- import reques ...

  8. python找出10000以内的质数_python求10000以内的质数_10000以内的质数

    展开全部 [ P1- P10] 2 3 5 7 11 13 17 19 23 29 [ P11- P20] 31 37 41 43 47 53 59 61 67 71 [ P21- P30] 73 7 ...

  9. python科赫曲线的代码_python – 实现Koch曲线?

    我正在查看Koch Snowflake(here)的维基百科页面,并且被徽标/乌龟风格的所有示例所困扰.所以我开始自己制作返回列表或坐标. 我的实现是在python中,我基本上扯掉了python tu ...

最新文章

  1. [雪峰磁针石博客]kotlin书籍汇总
  2. Python 中的用户自定义类型
  3. 系统架构设计师与系统分析师历年实体分析与解答下载_医疗知识图谱问答系统探究(一)...
  4. 如何迁移开源 Flink 任务到实时计算Flink版?实战手册来帮忙!
  5. Bug in Code CodeForces - 420C (计数,图论)
  6. BZOJ2843:极地旅行社
  7. 配置和使用OCS 2007会议功能
  8. Mysql——Innodb和Myisam概念与数据恢复
  9. C语言复习---获取矩阵的对角和
  10. 2020公务员考试应届毕业生的身份界定
  11. mongovue mysql_mongoVUE的增删改查操作使用说明(转)
  12. 如何禁用电脑文件共享
  13. 辽宁师范大学计算机科学与技术在哪个校区,2021年辽宁师范大学有几个校区,大一新生在哪个校区...
  14. 数组 保存学生的成绩
  15. css立体3d效果动画,css3 实现动画,变换基点及3D效果~
  16. 【Verilog语法1】加载存储器$readmemh和$readmemb函数的使用
  17. Kafka动态认证SASL/SCRAM配置+整合springboot配置
  18. 朴素贝叶斯--过滤垃圾邮件实例
  19. fMRI学习笔记:预处理及数据分析(使用spm12)
  20. linux 查看 x64 x86 arm64 以及它们的区别

热门文章

  1. 【soft6星评论】黑科技不够黑!小米股价还要跌?
  2. 一线大厂程序员谈回长沙感受:这不是退路,而是新的开始
  3. 国际顶级会议期刊级别介绍
  4. MATLAB sub2ind函数的使用
  5. 2018 acm-icpc南京站 复盘
  6. coredns 更新部署
  7. java中对字符串进行解析_Java中字符串解析
  8. 解决虚拟机上创建共享文件夹,不能显示文件
  9. IPSEC安全传输总结------何为安全?如何保障企业的数据流安全传递?
  10. OkHttp原理解析(一)