1.自己写的计算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


 # -*- coding: utf-8 -*-
"""
Created on Wed May 3 10:48:28 2017 @author: Vincent
"""
import numpy as np
from sklearn import metrics
y = np.array( [1, 0, 0, 1, 1, 1, 0, 1, 1, 1])
pred = np.array([0.9, 0.9,0.8, 0.8, 0.7,0.7,0.7,0.6,0.5,0.4])
fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=1)
print(metrics.auc(fpr, tpr))
def getAuc(labels, pred) :
'''将pred数组的索引值按照pred[i]的大小正序排序,返回的sorted_pred是一个新的数组,
sorted_pred[0]就是pred[i]中值最小的i的值,对于这个例子,sorted_pred[0]=8
'''
sorted_pred = sorted(range(len(pred)), key = lambda i : pred[i])
pos = 0.0 #正样本个数
neg = 0.0 #负样本个数
auc = 0.0
last_pre = pred[sorted_pred[0]]
count = 0.0
pre_sum = 0.0 #当前位置之前的预测值相等的rank之和,rank是从1开始的,所以在下面的代码中就是i+1
pos_count = 0.0 #记录预测值相等的样本中标签是正的样本的个数
for i in range(len(sorted_pred)) :
if labels[sorted_pred[i]] > 0:
pos += 1
else:
neg += 1
if last_pre != pred[sorted_pred[i]]: #当前的预测概率值与前一个值不相同
#对于预测值相等的样本rank需要取平均值,并且对rank求和
auc += pos_count * pre_sum / count
count = 1
pre_sum = i + 1 #更新为当前的rank
last_pre = pred[sorted_pred[i]]
if labels[sorted_pred[i]] > 0:
pos_count = 1 #如果当前样本是正样本 ,则置为1
else:
pos_count = 0 #反之置为0
else:
pre_sum += i + 1 #记录rank的和
count += 1 #记录rank和对应的样本数,pre_sum / count就是平均值了
if labels[sorted_pred[i]] > 0:#如果是正样本
pos_count += 1 #正样本数加1
auc += pos_count * pre_sum / count #加上最后一个预测值相同的样本组
auc -= pos *(pos + 1) / 2 #减去正样本在正样本之前的情况
auc = auc / (pos * neg) #除以总的组合数
return auc
print(getAuc(y, pred))

2.awk代码

 #计算auc,输入分别为预测值(可以乘以一个倍数之后转化为整数),该相同预测值的样本个数,该相同预测值的正样本个数
sort -t $'\t' -k 1,1n | awk -F"\t" 'BEGIN{
OFS="\t";
now_q="";
begin_rank=1;
now_pos_num=0;
now_neg_num=0;
total_pos_rank=0;
total_pos_num=0;
total_neg_num=0;
}function clear(){
begin_rank += now_pos_num + now_neg_num;
now_pos_num=0;
now_neg_num=0;
}function update(){
now_pos_num += pos_num;
now_neg_num += neg_num;
}function output(){
n = now_pos_num + now_neg_num;
avg_rank = begin_rank + (n-1)/2;
tmp_all_pos_rank = avg_rank * now_pos_num;
total_pos_rank += tmp_all_pos_rank;
total_pos_num += now_pos_num;
total_neg_num += now_neg_num;
}{
q=$1;
show=$2;
clk=$3;
pos_num=clk;
neg_num=show-clk;
if(now_q!=q){
if(now_q!=""){
output();
clear();
}
now_q=q;
}
update(); }END{
output();
auc=0;
m=total_pos_num;
n=total_neg_num;
if(m>0 && n>0){
auc = (total_pos_rank-m*(m+1)/2) / (m*n);
}
print auc;
}'

计算auc-python/awk的更多相关文章

  1. python计算auc指标

    1.安装scikit-learn 1.1Scikit-learn 依赖 Python (>= 2.7 or >= 3.3), NumPy (>= 1.8.2), SciPy (> ...

  2. Anaconda 用于科学计算的 Python 发行版

    用于科学计算的 Python 发行版: 1.Anaconda  https://www.continuum.io/    公司continuum.  有商业版本. Anaconda is the le ...

  3. split function of Perl,Python,Awk

    使用中常用到Perl,Python,AWK,R, 虽然Java,C,C++,Vala也学过但是就是不喜欢,你说怎么办. 看来一辈子脚本的命. Perl @rray = split /PATTERN/, ...

  4. MATLAB画ROC曲线,及计算AUC值

    根据决策值和真实标签画ROC曲线,同时计算AUC的值 步骤: 根据决策值和真实标签画ROC曲线,同时计算AUC的值: 计算算法的决策函数值deci 根据决策函数值deci对真实标签y进行降序排序,得到 ...

  5. 用于水和水蒸汽物性计算的Python模块——iapws

    无论是火电还是核电,将能量转化为电能的方式主要还是烧开水,即加热水产生高压蒸汽驱动汽轮机做功再发电.在进行热力循环分析.流动传热计算时,需获得水和水蒸汽的物性参数.网上主流的水蒸汽物性计算程序是上海成 ...

  6. 【Anaconda】:科学计算的Python发行版

    [背景] Python易用,但包管理和Python不同版本的问题比较头疼,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.Anaconda等, ...

  7. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  8. 科学计算:Python 分析数据找问题,并图形化

    对于记录的数据,如何用 Python 进行分析.或图形化呢? 本文将介绍 numpy, matplotlib, pandas, scipy 几个包,进行数据分析.与图形化. 准备环境 Python 环 ...

  9. Python计算AUC

    AUC(Area under curve)是机器学习常用的二分类评测手段,直接含义是ROC曲线下的面积.另一种解释是:随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进 ...

  10. [转] MachingLearning中的距离相似性计算以及python实现

    参考:https://blog.csdn.net/gamer_gyt/article/details/75165842#t16  https://blog.csdn.net/ymlgrss/artic ...

随机推荐

  1. android:listView Button 焦点问题

    要想listView的item与其上的button皆能得到焦点响应: 在listView item 的布局中: 在<RelativeLayout>中 android:descendantF ...

  2. c++ vector详解

    容器有太多需要清楚细节的地方,同时也有太多值得学习的地方.下文作为学习.工作中用到vector的总结. 1. 赋值运算=的实现原理 在使用赋值操作时,如果不清楚内部是怎么实现,那么用起来会畏手畏脚. ...

  3. 【Spring系列】Spring IoC

    前言 IoC其实有两种方式,一种是DI,而另一种是DL,即Dependency Lookup(依赖查找),前者是当前软件实体被动接受其依赖的其他组件被IOc容器注入,而后者是当前软件实体主动去某个服务 ...

  4. Android6.0中PowerManagerService分析

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=30510400&id=5569393 概述 一直以来,电源管理是 ...

  5. GlusterFS六大卷模式說明

    GlusterFS六大卷說明   第一,分佈卷 在分布式卷文件被随机地分布在整个砖的体积.使用分布式卷,你需要扩展存储,冗余是重要或提供其他硬件/软件层.(簡介:分布式卷,文件通过hash算法随机的分 ...

  6. Dockerfile ,ADD详细解读

    一.ADD指令 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD  源路径  目标路径 如: #test FROM ubunt ...

  7. Promise在await报错后,如何继续往下跑...

    一.resolve 当a>0时,正常情况依次输出A.B.C console.log("A"); let result = await this.test(); console ...

  8. WCF之HTTPS传输WebConfig配置

    <system.serviceModel> <client> <endpoint address="https://evitest.1010bao.com:88 ...

  9. Unity3D 记第二次面试

    2014-03-10 忍不住投递了几份简历大概有20个,总共收到面试电话2个,十分之一.一个是11号下午4点面试另一个是12号下午3点面试(后来没去至于原因下面有)12号没去,为什么?因为招聘要求“精 ...

  10. iOS - 仿微信朋友圈视频剪切功能

    分析需求 我们先看一看微信的界面 微信效果图 1.页面下部拖动左边和右边的白色竖条控制剪切视频的开始和结束时间,预览界面跟随拖动位置跳到视频相应帧画面,控制视频长度最长15秒,最短5秒 2.拖动下部图 ...