python计算auc_机器学习笔记:重拾AUC计算公式

python计算auc_机器学习笔记:重拾AUC计算公式作者 机器学习算法 迪吉老农 AUC 这个指标在排序问题里经常用到 之前也有个模糊的印象 就是一个排序正确的比例 这个模糊印象是 分母是选两个例子的的方式数分子是这两个例子的预测顺序正确的次数但是今天看了一个 python 的实现 发现不是很能理解里面的公式 于是赶紧查了一下维基百科的定义 theprobabili

@作者: 机器学习算法 @迪吉老农

AUC这个指标在排序问题里经常用到,之前也有个模糊的印象,就是一个排序正确的比例。

这个模糊印象是,

分母是选两个例子的的方式数

分子是这两个例子的预测顺序正确的次数

但是今天看了一个python的实现,发现不是很能理解里面的公式,于是赶紧查了一下维基百科的定义,

the probability that a classifier will rank a randomly chosen positive instance higher than a randomly chosen negative one (assuming ‘positive’ ranks higher than ‘negative’).

上面的意思是,

分母是分别选一个正例,一个负例的方式数

分子是这两个例子的预测顺序正确的次数

也就是去掉两个负例或者两个正例,这两种情况。想来也是,这种数据属于不知道是对还是错,无法标定,不应该放到准确率中计算。

于是自己试着用一个例子来辅助推导一下公式,如下表所示,

python计算auc_机器学习笔记:重拾AUC计算公式是现实的正负例,

python计算auc_机器学习笔记:重拾AUC计算公式是模型给出的预测的分数,

index

python计算auc_机器学习笔记:重拾AUC计算公式

python计算auc_机器学习笔记:重拾AUC计算公式

0

1

0.9

1

0

0.5

2

1

0.8

3

0

0.7

4

1

0.6

我们需要计算

python计算auc_机器学习笔记:重拾AUC计算公式

其中的

python计算auc_机器学习笔记:重拾AUC计算公式

python计算auc_机器学习笔记:重拾AUC计算公式是随机的一对正负例

python计算auc_机器学习笔记:重拾AUC计算公式

python计算auc_机器学习笔记:重拾AUC计算公式的预测值。

按照定义,分母就是从正例选一个,从负例选一个的方式数,

python计算auc_机器学习笔记:重拾AUC计算公式

分子要看预测的分数,一个直接的想法是去生成一个矩阵,比较预测分数,正例和负例谁大,如下面的表格,

正例

1

3

0

1(.9>.5)

1(.9>.7)

2

1(.8>.5)

1(.8>.7)

4

1(.6>.5)

0(.6<.7>

然后去计算矩阵的sum就是正确排序数

python计算auc_机器学习笔记:重拾AUC计算公式

但是这个计算方式有性能问题,类似于冒泡排序的计算量

python计算auc_机器学习笔记:重拾AUC计算公式;高效一点的实现就是先全排序,复杂度是

python计算auc_机器学习笔记:重拾AUC计算公式,生成一个下面的表中rank值,表明每个值排在第几个位置,

index

python计算auc_机器学习笔记:重拾AUC计算公式

python计算auc_机器学习笔记:重拾AUC计算公式

tied_rank

0

1

0.9

5

1

0

0.5

1

2

1

0.8

4

3

0

0.7

3

4

1

0.6

2

注释,这里的tied_rank是指,分数一样的话,几个平分一个rank,比如,

>>> tied_rank([1.0, 0.1, 0.8, 0.7, 0.6])

[5.0, 1.0, 4.0, 3.0, 2.0]

>>> tied_rank([1.0, 0.1, 0.7, 0.7, 0.6])

[5.0, 1.0, 3.5, 3.5, 2.0]

继续说回来,如果一个正例在整体中从低分到高分,排在第

python计算auc_机器学习笔记:重拾AUC计算公式个,那么他比

python计算auc_机器学习笔记:重拾AUC计算公式个数大。不过,里面既有正例也有负例,我们必须知道里面的正例/负例数才行。所以还需要一个只保留正例的计算,如下表。假设他在正例中排第

python计算auc_机器学习笔记:重拾AUC计算公式,在全体中排第

python计算auc_机器学习笔记:重拾AUC计算公式,那么他比

python计算auc_机器学习笔记:重拾AUC计算公式个负例大,也就是我们在分子中,要进行求和的对象。

index

python计算auc_机器学习笔记:重拾AUC计算公式

python计算auc_机器学习笔记:重拾AUC计算公式

tied_rank

pos_rank

0

1

0.9

5

3

2

1

0.8

4

2

4

1

0.6

2

1

所以,分子的计算可以写成,

python计算auc_机器学习笔记:重拾AUC计算公式

上面的公式又可以化简,这是因为

python计算auc_机器学习笔记:重拾AUC计算公式其实是是固定的值,只和正例的数目有关系,

python计算auc_机器学习笔记:重拾AUC计算公式

所以最终的公式为

python计算auc_机器学习笔记:重拾AUC计算公式

最后,贴一下网上开源的代码benhamner/Metrics,里面就是这个计算公式。

def auc(actual, posterior):

“””

Computes the area under the receiver-operater characteristic (AUC)

This function computes the AUC error metric for binary classification.

Parameters

———-

actual : list of binary numbers, numpy array

The ground truth value

posterior : same type as actual

Defines a ranking on the binary numbers, from most likely to

be positive to least likely to be positive.

Returns

——-

score : double

The mean squared error between actual and posterior

“””

r = tied_rank(posterior)

num_positive = len([0 for x in actual if x==1])

num_negative = len(actual)-num_positive

sum_positive = sum([r[i] for i in range(len(r)) if actual[i]==1])

auc = ((sum_positive – num_positive*(num_positive+1)/2.0) /

(num_negative*num_positive))

return auc

版权声明

以上文章为本人@迪吉老农原创,首发于简书,文责自负。文中如有引用他人内容的部分(包括文字或图片),均已明文指出,或做出明确的引用标记。如需转载,请联系作者,并取得作者的明示同意。感谢。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176370.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:06
下一篇 2026年3月26日 下午10:06


相关推荐

  • Java集合框架关系图谱

    Java集合框架关系图谱Java集合是用于存储数量不等的对象的容器,还可以保存具有映射关系的关联数组,Collection是集合接口,它提供了对集合对象进行基本操作的通用接口方法。Java集合大致分为下面四种类型:List,Set,Queue,Map。List代表有序,可重复集合,Set代表无序,不可重复集合,Queue代表队列集合,Map代表具有映射关系的集合。Java集合主要有Collection和Map接口派生,…

    2022年6月26日
    54
  • 线性规划

    线性规划1、线性规划1.1线性规划的定义线性规划的标准形式:其中的c和x均为n维列向量,A、Aeq为适当维数的矩阵,b、beq为适当维数的列向量。例如:x1和x2称为决策变

    2022年7月3日
    22
  • Java 调用 DeepSeek API 的 8 个高频坑

    Java 调用 DeepSeek API 的 8 个高频坑

    2026年3月12日
    2
  • 零基础学Java(3)运算符

    零基础学Java(3)运算符运算符运算符用于连接值。Java提供了一组丰富的算术和逻辑运算符以及数学函数。算术运算符在Java中,使用算术运算符+、-、*、/表示加、减、乘、除运算。当参与/运算的两个操作数都是整数时,表示

    2022年7月29日
    7
  • idea如何创建一个javaweb项目_Java创建一个新项目

    idea如何创建一个javaweb项目_Java创建一个新项目Idea创建JavaWeb项目步骤:1、打开IntellijIdeaIDE,然后点击CreateNewProject2、左侧选择JavaEnterprise,右侧选择WebApplication3、这里输入项目名字为firstdemo,然后点击Finish完成。生成如下的项目结构:项目配置:1、在web/WEB-INF下创建两个文件夹classes和lib,classes用来存放编译后输出的classes文件,lib用于存放第三方jar包。..

    2022年8月29日
    7
  • ACM中Java输入输出[通俗易懂]

    ACM中Java输入输出[通俗易懂]最初写算法时,是用Scanner的。因为当时接触的测试数据基本都是以算法的复杂度为主,但是后面遇到大量的输入数据时。发现Scanner远远不能满足条件。下面列出几种常用的输入输出方式。(输出统一用printwriter,系统的system.out太慢,结尾要释放缓存才能输出,不然数据放在缓存中输不出来)1:Scanner这个类最慢,但是最好用,因为这个类没有缓存处理,所以io方面大量输入…

    2022年5月18日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号