首页 > 编程知识 正文

auc的计算方法,AUC面积计算公式

时间:2023-05-04 02:39:27 阅读:126388 作者:2628

AUC计算公式推导基本公式估计

基本排名的公式估计2 .如何计算AUC?

计算AUC时,建议使用两种方法。

方法1 :

在具有m个正样本和n个负样本的数据集中。 共有MN对样本(成对样本,即正样本和负样本)。 在该MN对样本中,正样本的预测概率大于负样本的预测概率的个数。

其中,

这样说可能有点抽象,举个例子就知道了。

假设idlabelproa 00.1 b 00.4 c 10.35 d 10.8有四个示例。 如果有两个正样本和两个负样本,则M*N=4。 也就是说,总共有四个样本对。 分别为:

(d,b ),d,a ),c,b ),c,a )。

在(d,b )样本对中,正样本d预测概率大于负样本b预测的概率(即,d的得分高于b )标记为1

同样,关于c、b。 正样本c的预测概率小于负样本c的预测概率,并标记为0。

最后,最后的AUC可以计算为总共三个正样本分数高于负样本分数,因此

在这个案例中,得分不会一致。 假设得分一致的情况下,例如:

IDlabelproA00.1B00.4C10.4D10.8

同样是4个样本对,但对于样本对(c,b ),I值为0.5。

最后一个AUC是方法二:

另一种方法是利用以下公式:

这个公式看起来有点可怕,首先说明各个符号的意思:

官方的意思是官方的解释3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /

在当地,也使用上面的例子。

idlabelproa 00.1 b 00.4 c 10.35 d 10.8将重新排列此示例。 按概率排序后,如下所示

idlabelproranka 00.11 c 10.352 b 00.43 d 10.84

根据上式,仅将正样本的编号相加,即仅将样本c、d的rank值相加并减去一个常数项

也就是说,这个答案和我们在上面计算的一样。

这个时候,我们有问题。 如果得分一致怎么办? 举一个例子来说明吧。

idlabelproa 10.8 b 10.7 c 00.5 d 00.5 e 10.5 f 10.5 g 00.3

在本例中,取值概率为0.5,并且可能同时具有正采样和负采样。 计算的时候,原则上得分相等的弗兰克取平均值。 具体如下:

先排序:

idlabelprorankg 00.31 f 10.52 e 10.53 d 00.54 c 00.55 b 10.76 a 10.87

应该注意的是,以相等概率得分的样本,无论正负,谁在前、谁在后都可以。

为了只考虑正样本的rank值:

对于正样本a,其rank值为7

对于正样本b,其rank值为6

对于正样本e,其rank值为(5)4)3)2)/4

对于正样本f,其rank值为(5)4)3)2)/4

最后得到的是

3 .最后,你怎么用程序验证?

为了方便起见,让我们使用sk-learn附带的库简单地验证一下示例。,代表第i条样本的序号。(概率得分从小到大排,排在第rank个位置)

importnumpyasnpfromsklearn.metricsimportroc _ AUC _ scorey _ true=NP.array ([ 1,1,0,0,1,1,0 ] ) y _ sc oraray 1 ) y _ scores=NP.array ([ 0.1,0.4,0.35,0.8 ] ) print )、y _ true (print )、y _ scores (is )、y_trutrue

importpandasaspdimportnumpyasnpdefauc (df,label='label ',predict='predict ',prob=False ) : ' '功能:示例的实际label:示例的实际标签(0,1 ); predict:的预测结果(分数或概率均可); prob: predict是否为概率根据实际情况设置,默认假; 输出: auc值。 ' ' ' if prob : df.sort _ values (by=predict,ascending=False, inplace=True ) else:df.sort_values ) by=place=true ) ) se inplace=true(rank=list ) reversed ) range ) 1, rank_mean']df=PD.merge(df,mean,on=predict ) df[label].value_counts ) ) n,m=df [ label ].value 2返回NP.round ((公式1 -公式2 )/(M * N ),4 ) if _ name _=(_ _ main _ ' : NP.random.) ) ) 100000 ).reshape (-1,1 ) label=score*tempthrreshape 10 ) label=NP.array (1ifxthresholdelse0forxinlabel ).resh score axis=1) df=PD.dataframe(data=data,columns=['label ',' predict'] ) AUC=df=df,label='label

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。