iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现计算AUC的方式有哪些
  • 268
分享到

Python实现计算AUC的方式有哪些

2023-07-02 17:07:32 268人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

今天小编给大家分享一下python实现计算AUC的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。介绍AUC(Are

今天小编给大家分享一下python实现计算AUC的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

介绍

AUC(Area Under Curve)被定义为ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。

实现代码

import numpy as npfrom sklearn.metrics import roc_auc_scorey_true = [1,1,0,0,1,1,0]y_pred = [0.8,0.7,0.5,0.5,0.5,0.5,0.3]print(roc_auc_score(y_true, y_pred))# 下面实现的是方法1# https://blog.csdn.net/lieyingkub99/article/details/81266664?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242def cal_auc1(y_true, y_pred):    n_bins = 10    postive_len = sum(y_true)  # M正样本个数    negative_len = len(y_true) - postive_len  # N负样本个数    total_case = postive_len * negative_len  # M * N样本对数    pos_histogram = [0 for _ in range(n_bins)]  # 保存每一个概率值下的正样本个数    neg_histogram = [0 for _ in range(n_bins)]  # 保存每一个概率值下的负样本个数    bin_width = 1.0 / n_bins    for i in range(len(y_true)):        nth_bin = int(y_pred[i] / bin_width)  # 概率值转化为整数下标        if y_true[i] == 1:            pos_histogram[nth_bin] += 1        else:            neg_histogram[nth_bin] += 1    print(pos_histogram)    print(neg_histogram)    accumulated_neg = 0    satisfied_pair = 0    for i in range(n_bins):        satisfied_pair += (pos_histogram[i] * accumulated_neg + pos_histogram[i] * neg_histogram[i] * 0.5)        print(pos_histogram[i], neg_histogram[i], accumulated_neg, satisfied_pair)        accumulated_neg += neg_histogram[i]     return satisfied_pair / float(total_case)print(cal_auc1(y_true, y_pred))# 下面实现的是方法2# Https://blog.csdn.net/lieyingkub99/article/details/81266664?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242def cal_auc2(y_true, y_pred):    n_bins = 10    postive_len = sum(y_true)  # M正样本个数    negative_len = len(y_true) - postive_len  # N负样本个数    total_case = postive_len * negative_len  # M * N样本对数    prob_rank = [0 for _ in range(n_bins)]  # 保存每一个概率值的rank    prob_num = [0 for _ in range(n_bins)]  # 保存每一个概率值出现的次数    bin_width = 1.0 / n_bins    raw_arr = []    for i in range(len(y_true)):        raw_arr.append([y_pred[i], y_true[i]])    arr = sorted(raw_arr, key=lambda d: d[0]) # 按概率由低到高排序    for i in range(len(arr)):        nth_bin = int(arr[i][0] / bin_width)  # 概率值转化为整数下标        prob_rank[nth_bin] = prob_rank[nth_bin] + i + 1        prob_num[nth_bin] = prob_num[nth_bin] + 1    satisfied_pair = 0    for i in range(len(arr)):        if arr[i][1] == 1:            nth_bin = int(arr[i][0] / bin_width)  # 概率值转化为整数下标            satisfied_pair = satisfied_pair + prob_rank[nth_bin] / prob_num[nth_bin]    return (satisfied_pair - postive_len * (postive_len + 1) / 2 ) / total_case   print(cal_auc2(y_true, y_pred)) # 根据roc曲线,找不同点算下面积, 需要点足够多def cal_auc3(y_true, y_pred):    """Summary    Args:        raw_arr (TYPE): Description    Returns:        TYPE: Description    """    raw_arr = []    for i in range(len(y_true)):        raw_arr.append([y_pred[i], y_true[i]])    print(raw_arr)    arr = sorted(raw_arr, key=lambda d:d[0], reverse=True)    pos, neg = 0., 0.    for record in arr:        if record[1] == 1.:            pos += 1        else:            neg += 1     fp, tp = 0., 0.    xy_arr = []    for record in arr:        if record[1] == 1.:            tp += 1        else:            fp += 1        xy_arr.append([fp/neg, tp/pos])    print(xy_arr)    auc = 0.    prev_x = 0.    prev_y = 0.    for x, y in xy_arr:        if x != prev_x:            auc += ((x - prev_x) * (y + prev_y) / 2.)            prev_x = x            prev_y = y        print(auc)    import numpy as np    from sklearn.metrics import roc_auc_score    y_true = [1, 1, 0, 0, 1, 1, 0]    y_pred = [0.8, 0.7, 0.5, 0.5, 0.5, 0.5, 0.3]    print(roc_auc_score(y_true, y_pred))

方法补充

下面是小编为大家找到的另外三个计算AUC的代码,会输出三种方法各自的auc,以及通过面积计算AUC时的ROC曲线。

在通过面积计算AUC的方法中,没有遍历数据的预测概率作为分类阈值,而是对[0,1]区间等分得到一系列阈值。

# AUC的计算import numpy as npimport matplotlib.pyplot as pltfor e in range(3):    print("\nRound: ", e+1)    num = 1000    auc1 = auc2 = auc3 = 0.    # 准备数据    pred_prob = list(np.random.unifORM(low=0,high=1, size=[num]))    labels = [int(prob>0.5) for prob in list(np.random.uniform(low=0,high=1, size=[num]))]    # 检查数据    # print("pred_prob:\n", pred_prob)    # print("labels:\n", labels)    # 方法一,面积加和    roc_point = []    for i in range(num):        i = pred_prob[i]        TP = 0  # 真阳样本数        FP = 0  # 假阳样本数        TP_rate = 0.  # 真阳率        FP_rate = 0.  # 假阳率        pos_num = 0   # 预测真样本数        # 计数过程        for ind, prob in enumerate(pred_prob):            if prob>i:                pos_num += 1            if prob>i and labels[ind]>0.5:                TP+=1            elif prob>i and labels[ind]<0.5:                FP+=1        if pos_num!=0:            TP_rate = TP / sum(labels)            FP_rate = FP / (num-sum(labels))        roc_point.append([FP_rate, TP_rate])  # 记录ROC中的点    # 画出ROC曲线    roc_point.sort(key=lambda x: x[0])    plt.plot(np.array(roc_point)[1:, 0], np.array(roc_point)[1: ,1])    plt.xlabel("FPR")    plt.ylabel("TPR")    plt.show()    # 计算每个小长方形的面积,求和即为auc    lastx = 0.    for x,y in roc_point:        auc1 += (x-lastx)*y  # 底乘高        lastx = x    print("方法一 auc:", auc1)    # 方法二,利用AUC关于排列概率的定义计算    auc2 = 0    P_ind = []  # 正样本下标    F_ind = []  # 负样本下标    P_F = 0  # 正样本分数高于负样本的数量    F_P = 0  # 负样本分数高于正样本的数量    #  计数过程    for ind, val in enumerate(labels):        if val > 0.5:            P_ind.append(ind)        else:            F_ind.append(ind)    for Pi in P_ind:        for Fi in F_ind:            if pred_prob[Pi] > pred_prob[Fi]:                P_F += 1            else:                F_P += 1    auc2 = P_F/(len(P_ind)*len(F_ind))    print("方法二 auc:", auc2)    # 方法三,方法二的改进,简化了计算,降低了时间复杂度    new_data = [[p, l] for p, l in zip(pred_prob, labels)]    new_data.sort(key=lambda x:x[0])    # 求正样本rank之和    rank_sum = 0    for ind, [prob,label] in enumerate(new_data):        if label>0.5:            rank_sum+=ind    auc3 = (rank_sum - len(P_ind)*(1+len(P_ind))/2) / (len(P_ind)*len(F_ind))    print("方法三 auc:", auc3)

运行结果

Python实现计算AUC的方式有哪些

Python实现计算AUC的方式有哪些

以上就是“Python实现计算AUC的方式有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网Python频道。

--结束END--

本文标题: Python实现计算AUC的方式有哪些

本文链接: https://www.lsjlt.com/news/343315.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现计算AUC的方式有哪些
    今天小编给大家分享一下Python实现计算AUC的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。介绍AUC(Are...
    99+
    2023-07-02
  • Python实现计算AUC的三种方式总结
    目录介绍实现代码方法补充介绍 AUC(Area Under Curve)被定义为ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线...
    99+
    2024-04-02
  • Python实现计算AUC的示例代码
    目录为什么这样一个指标可以衡量分类效果auc理解AUC计算方法一方法二实现及验证AUC(Area under curve)是机器学习常用的二分类评测手段,直接含义是ROC曲线下的面积...
    99+
    2024-04-02
  • python现金流计算的方法有哪些
    今天小编给大家分享一下python现金流计算的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。常用现金流的计算1.固...
    99+
    2023-06-27
  • 分布式系统中的 Python 算法实现方式有哪些?
    分布式系统是指由多个独立的计算机节点组成的系统,它们之间通过网络进行通信,共同完成一个任务。Python 是一种高级编程语言,它在分布式系统中的应用越来越广泛。本文将介绍分布式系统中的 Python 算法实现方式。 一、MapReduce ...
    99+
    2023-09-16
    编程算法 分布式 linux
  • js实现倒计时的方式有哪些
    小编给大家分享一下js实现倒计时的方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一般倒计时的时间都是后台传来的然后渲染...
    99+
    2024-04-02
  • 计算机cpu超频的方式有哪些
    这篇文章主要介绍了计算机cpu超频的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇计算机cpu超频的方式有哪些文章都会有所收获,下面我们一起来看看吧。  电脑的超频就是通过计算机操作者的超频方式将CP...
    99+
    2023-06-04
  • Python协程的实现方式有哪些
    什么是协程在 Python 中,协程(Coroutine)是一种轻量级的并发编程方式,可以通过协作式多任务来实现高效的并发执行。使用 yield 关键字挂起函数的执行,以及保存当前执行状态,是协程的特殊之处。因此,协程可视为一种特殊的生成器...
    99+
    2023-05-20
    Python
  • Python实现单例模式的方式有哪些
    这篇“Python实现单例模式的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python实现单例模式的方式有哪些...
    99+
    2023-06-30
  • numpy 中dot()函数的计算方式有哪些
    这篇文章主要介绍了numpy 中dot()函数的计算方式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下所示:a = np.arange(1,&n...
    99+
    2023-06-15
  • python的gui编程实现方式有哪些
    Python的GUI编程实现方式有以下几种: Tkinter:Tkinter是Python自带的GUI库,可以创建基于Tk的GU...
    99+
    2023-10-23
    python
  • 对python实现加密的方式有哪些
    小编给大家分享一下对python实现加密的方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 基础知识扫盲 对称加密 ...
    99+
    2024-04-02
  • 云计算数据加密方式有哪些
    云计算中的数据加密方式有以下两种内容感知加密内容感知加密一般用于数据防泄露,由内容感知软件理解数据或格式,并基于策略设置加密,其加密过程不需要用户的干预即可对数据的安全进行保障。保格式加密保格式加密是通过检测数据的敏感程度来决定加密及维持数...
    99+
    2024-04-02
  • Python 编程算法在 Unix 容器中的实现方式有哪些?
    随着云计算的快速发展,容器技术也越来越受到关注。在 Unix 系统中,容器技术主要由 Docker 和 Kubernetes 等开源软件实现。Python 作为一种流行的编程语言,在容器中的应用也越来越多。那么,在 Unix 容器中,Py...
    99+
    2023-06-15
    编程算法 unix 容器
  • python计算技巧有哪些
    这篇文章将为大家详细讲解有关python计算技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。计算技巧#向下取整print 5.0//2>>> 2# ...
    99+
    2023-06-17
  • c语言移位运算的实现方式有哪些
    C语言中移位运算有两种方式:左移和右移。1. 左移运算:用">"表示,将一个数的各二进位全部右移若干位,低位丢弃,高位补0或补1,取...
    99+
    2023-09-14
    c语言
  • 云服务器ecs实例类型计算方式有哪些
    云服务器ECS实例类型是一种常见的计算方式,它可以根据不同的配置和编程语言而具体划分为以下几种。 虚拟机模式。这种方式是将整个操作系统或应用程序作为资源池进行管理和分配。这种模式下,用户可以在任何时间和任何位置上访问和管理资源。 块模式...
    99+
    2023-10-27
    实例 类型 方式
  • 有哪些LFU实现方式
    本篇内容主要讲解“有哪些LFU实现方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些LFU实现方式”吧!LFU实现力扣原题描述如下:请你为 最不...
    99+
    2024-04-02
  • java实现锁的方式有哪些
    Java实现锁的方式有以下几种: synchronized关键字:使用synchronized关键字可以在方法或者代码块上加锁,...
    99+
    2023-10-24
    java
  • vbs ping实现的方式有哪些
    这篇文章将为大家详细讲解有关vbs ping实现的方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。对于vbs中ping的实现可以通过两种方式 :调用系统ping命令;使用wmi查询pingstat...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作