计算auc的代码-python

自己写的计算auc的代码,用scikit-learn的auc计算函数sklearn.metrics.auc(xyreorder=False)做了一些测试,结果是一样的,如有错误,欢迎指正。

思路:1.首先对预测值进行排序,排序的方式用了python自带的函数sorted,详见注释。

   2.对所有样本按照预测值从小到大标记rank,rank其实就是index+1,index是排序后的sorted_pred数组中的索引

   3.将所有正样本的rank相加,遇到预测值相等的情况,不管样本的正负性,对rank要取平均值再相加

4.将rank相加的和减去正样本排在正样本之后的情况,再除以总的组合数,得到auc



 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Wed May  3 10:48:28 2017
 4
 5 @author: Vincent
 6 """
 7 import numpy as np
 8 from sklearn import metrics
 9 y = np.array(   [1,     0,  0,   1,   1,  1,  0,  1,  1,  1])
10 pred = np.array([0.9, 0.9,0.8, 0.8, 0.7,0.7,0.7,0.6,0.5,0.4])
11 fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=1)
12 print(metrics.auc(fpr, tpr))
13 def getAuc(labels, pred) :
14     ‘‘‘将pred数组的索引值按照pred[i]的大小正序排序,返回的sorted_pred是一个新的数组,
15        sorted_pred[0]就是pred[i]中值最小的i的值,对于这个例子,sorted_pred[0]=8
16     ‘‘‘
17     sorted_pred = sorted(range(len(pred)), key = lambda i : pred[i])
18     pos = 0.0 #正样本个数
19     neg = 0.0 #负样本个数
20     auc = 0.0
21     last_pre = pred[sorted_pred[0]]
22     count = 0.0
23     pre_sum = 0.0  #当前位置之前的预测值相等的rank之和,rank是从1开始的,所以在下面的代码中就是i+1
24     pos_count = 0.0  #记录预测值相等的样本中标签是正的样本的个数
25     for i in range(len(sorted_pred)) :
26         if labels[sorted_pred[i]] > 0:
27             pos += 1
28         else:
29             neg += 1
30         if last_pre != pred[sorted_pred[i]]: #当前的预测概率值与前一个值不相同
31             #对于预测值相等的样本rank需要取平均值,并且对rank求和
32             auc += pos_count * pre_sum / count
33             count = 1
34             pre_sum = i + 1     #更新为当前的rank
35             last_pre = pred[sorted_pred[i]]
36             if labels[sorted_pred[i]] > 0:
37                 pos_count = 1   #如果当前样本是正样本 ,则置为1
38             else:
39                 pos_count = 0   #反之置为0
40         else:
41             pre_sum += i + 1    #记录rank的和
42             count += 1          #记录rank和对应的样本数,pre_sum / count就是平均值了
43             if labels[sorted_pred[i]] > 0:#如果是正样本
44                 pos_count += 1  #正样本数加1
45     auc += pos_count * pre_sum / count #加上最后一个预测值相同的样本组
46     auc -= pos *(pos + 1) / 2 #减去正样本在正样本之前的情况
47     auc = auc / (pos * neg)  #除以总的组合数
48     return auc
49 print(getAuc(y, pred))
时间: 2024-10-02 22:30:18

计算auc的代码-python的相关文章

python计算auc指标

本文和大家分享的主要是python计算auc指标相关内容,一起来看看吧,希望对大家学习python有所帮助. 1.安装scikit-learn 1.1Scikit-learn 依赖 · Python (>= 2.6 or >= 3.3), · NumPy (>= 1.6.1), · SciPy (>= 0.9). 分别查看上述三个依赖的版本, python -V        结果:Python 2.7.3 python -c 'import scipy; print scipy.

python实现逆波兰计算表达式的代码

如下资料是关于python实现逆波兰计算表达式的代码. symbol_priority = {} symbol_priority[0] = ['#'] symbol_priority[1] = ['('] symbol_priority[2] = ['+', '-'] symbol_priority[4] = [')'] def comparePriority(symbol, RPN_stack, symbol_stack): '''Compare priority between two sy

python学习之——计算给出代码中注释、代码、空行的行数

题目:计算给出代码中注释.代码.空行的行数 来源:网络 思路:注释行以 ‘#’开头,空行以 ‘\n’ 开头,以此作为判断 def count_linenum(fname): fobj = open(fname,"rU") #print fobj.readlines() count_blankline = 0 count_notes = 0 count_code = 0 for eachLine in fobj: if eachLine[0] == '\n': count_blankli

MATLAB画ROC曲线,及计算AUC值

根据决策值和真实标签画ROC曲线,同时计算AUC的值 function auc = roc_curve(deci,label_y) %%deci=wx+b, label_y, true label [val,ind] = sort(deci,'descend'); roc_y = label_y(ind); stack_x = cumsum(roc_y == -1)/sum(roc_y == -1); stack_y = cumsum(roc_y == 1)/sum(roc_y == 1); a

具体knn算法概念参考knn代码python实现

具体knn算法概念参考knn代码python实现上面是参考<机器学习实战>的代码,和knn的思想 # _*_ encoding=utf8 _*_ import numpy as npimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data # 导入手写体识别的数据mnist = input_data.read_data_sets("../data", one_hot=T

QuantLib 金融计算——自己动手封装 Python 接口(1)

目录 QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 如何封装 Python 接口? 自己封装 Python 接口 封装 Array 和 Matrix 类 QuantLibEx 和官方包混合使用 附录:接口文件.setup.py 和 __init__.py QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 已经开始在 PyPi 上发布封装好的 Python 接口,安装和使用非常方便,与普通的包别无二致.并且

QuantLib 金融计算——自己动手封装 Python 接口(2)

目录 QuantLib 金融计算--自己动手封装 Python 接口(2) 概述 如何封装一项复杂功能? 寻找最小功能集合的策略 实践 估计期限结构参数 修改官方接口文件 下一步的计划 QuantLib 金融计算--自己动手封装 Python 接口(2) 概述 对于一项简单功能,通常只需要包装少数几个类就可以,正如<自己动手封装 Python 接口(1)>演示的那样. 下面,将演示如何包装 QuantLib 中的复杂功能,最终实现从固息债交易数据中估计期限结构模型的参数. 如何封装一项复杂功能

用GetTickCount()计算一段代码执行耗费的时间的小例子

var aNow,aThen,aTime:Longint; begin aThen := GetTickCount(); Sleep(1000);//代码段 aNow := GetTickCount(); aTime := aNow-aThen; ShowMessage(IntToStr(a)); end; 用GetTickCount()计算一段代码执行耗费的时间的小例子,布布扣,bubuko.com

JS计算网页停留时间代码

JS计算网页停留时间的代码. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312&