AUC的是如何计算的

本文主要讲解AUC是如何计算的,通过本文了解AUC的具体计算过程

文章先介绍如何使用sklearn包计算AUC,这是实际中常用的方法

然后讲解sklearn包计算AUC的详细流程,并用代码自行实现AUC的计算

01.调用sklearn计算AUC

调用sklearn包计算AUC的代码

# -----调用sklearn包计算AUC--------
from sklearn import metrics
import numpy as np 
import pandas as pd
#=====================标签与score数据=============================
lable = np.array([0, 1 ,0,1 ,1,1 ,0 ,1,0,1,0,0,0,0,1,0])
score = np.array([0.2, 0.28,0.1 ,0.6,0.5, 0.3, 0.6, 0.8,0.2,0.25,0.4,0.2,0.5,0.3,0.18,0.18])
#=====================标签与score数据=============================
fpr, tpr, thresholds = metrics.roc_curve(lable,score,drop_intermediate=False)
auc = metrics.auc(fpr, tpr)
print('FPR:'+str(fpr))
print('TPR:'+str(tpr))
print('AUC:'+str(auc))

运行结果

FPR:[0.  0.   0.11111111 0.22222222 0.33333333 0.44444444   0.44444444 0.44444444 0.77777778 0.88888889 1.  ]
TPR:[0. 0.14285714 0.28571429 0.42857143 0.42857143 0.57142857  0.71428571 0.85714286 0.85714286 1.   1.  ]
AUC:0.6666666666666666

02.计算逻辑

使用sklearn时需要注意,

metrics.roc_curve默认drop_intermediate为True,

算出的fpr和tpr会删掉线性过渡点(即上面图中标黄的点)!

03.自写代码实现  

按照以上逻辑,编写代码如下:

# -*- coding: utf-8 -*-
"""
AUC计算与ROC曲线绘画
"""
import numpy as np 
import pandas as pd
#=====================标签与score数据=============================
lable = np.array([0, 1 ,0,1 ,1,1 ,0 ,1,0,1,0,0,0,0,1,0])
score = np.array([0.2, 0.28,0.1 ,0.6,0.5, 0.3, 0.6, 0.8,0.2,0.25,0.4,0.2,0.5,0.3,0.18,0.18])
#===================计算FPR和TPR==========================================
df = pd.DataFrame({'score':score,'label':lable})                                      # 生成【分值,标签】的DataFrame
df = df.sort_values('score',ascending=False).reset_index(drop=True)                   # 对分值进行排序
df['last_score'] = df['score'].diff(-1)!=0                                            # 标记是否是同一个socre值的最后一条数据
df['csum0']      = (df['label']==0).cumsum()                                          # 0类样本的累计条数
df['csum1']      = (df['label']==1).cumsum()                                          # 1类样本的累计条数
df['fpr']        =  df['csum0']/(df['label']==0).sum()                                # 计算fpr:0类样本的累计占比
df['tpr']        =  df['csum1']/(df['label']==1).sum()                                # 计算tpr:1类样本的累计占比
df               = df[df['last_score']==True]
start_row = pd.DataFrame( {'score':score.max()+1,'fpr':0,'tpr':0},pd.Index(range(1))) # 起始行[0,0]
df        = pd.concat([start_row,df[['score','fpr','tpr']]]).reset_index(drop=True)   # 添加起始行到df
#=============绘画ROC曲线===================================
import matplotlib.pyplot as plt
plt.plot(df['fpr'],df['tpr'], marker='o', markerfacecolor='r', markersize=5)           # 绘制ROC曲线
plt.fill_between(df['fpr'],0, df['tpr'], facecolor='green', alpha=0.3)                 # 给ROC区域添加颜色
plt.xlim(0,1);plt.ylim(0,1);                                                           # 限制x,y轴的范围
plt.title('ROC');plt.xlabel('fpr');plt.ylabel('tpr')                                   # 加标题
#===============计算AUC======================================
df['area'] = 0                                                                         # 初始化面积为0
for i in range(1,df.shape[0]):
    df.loc[i,'area'] = (df['tpr'][i]+df['tpr'][i-1])*(df['fpr'][i]-df['fpr'][i-1])/2   # 添加每小段的面积
auc = df['area'].sum()
#=======打印结果=======================================
print('=====FPR和TPR====================')
print(df)
print('=====AUC====================')
print('AUC:'+str(auc))

运行结果:

=====FPR和TPR====================
    score   fpr     tpr       area
0    1.80  0.000000  0.000000  0.000000
1    0.80  0.000000  0.142857  0.000000
2    0.60  0.111111  0.285714  0.023810
3    0.50  0.222222  0.428571  0.039683
4    0.40  0.333333  0.428571  0.047619
5    0.30  0.444444  0.571429  0.055556
6    0.28  0.444444  0.714286  0.000000
7    0.25  0.444444  0.857143  0.000000
8    0.20  0.777778  0.857143  0.285714
9    0.18  0.888889  1.000000  0.103175
10   0.10  1.000000  1.000000  0.111111
=====AUC====================
AUC:0.6666666666666667

从结果可见,自行计算结果与sklearn包运行结果一致。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值