老饼讲解:一步一步上手学习
AUC是机器学习二分类模型中的常用指标,因此经常需要计算模型的AUC指标,本文先介绍如何使用sklearn包计算AUC,然后讲解sklearn包计算AUC的详细流程,通过本文可以了解sklearn计算AU的内部逻辑和计算过程。
AUC与ROC的介绍请参考《一篇入门-AUC与ROC曲线》,这里我们只介绍AUC的计算过程和如何画ROC。
这里我们先展示一下调用sklearn计算AUC的方法,以及AUC的计算结果,下面再讲如何自己计算。
在python中计算AUC最方便的是调用sklearn的metrics包来实现,只需先用roc_curve算出fpr, tpr,再调用auc函数计算auc值即可。 利用sklearn计算AUC的具体示例代码如下:
# 本代码用于展示:如何通过sklearn来计算AUC
# 本代码来自《老饼讲解-机器学习》:www.bbblearn.com
# -------------
from sklearn import metrics
import numpy as np
import matplotlib.pyplot as plt
#===========标签与score数据========================
# 计算AUC可以输入类别的概率,也可以输入评分,即score的范围不一定需要在[0,1]之间
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,然后绘制ROC与计算AUC==========================
fpr, tpr, thresholds = metrics.roc_curve(lable,score,drop_intermediate=False) # 计算fpr, tpr和阈值
print('\nthresholds:'+str(thresholds)) # 打印阈值
print('\nFPR:'+str(fpr)) # 打印阈值对应的fpr
print('\nTPR:'+str(tpr)) # 打印阈值对应的tpr
# ---------计算AUC------------
auc = metrics.auc(fpr, tpr) # 计算AUC
print('AUC:'+str(auc)) # 打印AUC
# ------绘制ROC曲线-----------
plt.plot(fpr,tpr, marker='o',markerfacecolor='r', markersize=5) # 绘制ROC曲线
plt.fill_between(fpr,0, 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') # 加标题
plt.show() # 展示画布代码运行结果如下:

ROC曲线如下:

本节讲解sklearn内部计算AUC的详细逻辑。
那sklearn包是如何计算AUC的呢?以下是笔者扒出源码整理得到的计算过程
AUC的具体计算过程如下(这需要点耐心才能理解):

还可以用上面计得的FPR和TPR画出ROC曲线,如下:

🙏提醒:使用sklearn时需要注意哦,metrics.roc_curve默认drop_intermediate为True,算出的fpr和tpr会删掉线性过渡点(即上面图中标黄的点)哦!
本节讲解如何自行编写代码实现AUC计算-不依赖软件包。
通过代码实现上述手算AUC的逻辑,就可以不依赖软件包自行实现AUC的计算,
不依赖软件包,自实现AUC计算的代码如下:
# 本代码用于展示:如何自行计算AUC和绘制ROC
# 本代码来自老饼讲解-机器学习:www.bbblearn.com
# -------------
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 # 初始化面积为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() # 计算总面积,就得到AUC
#=======打印结果===================================
print('\n=====FPR和TPR====================\n',df) # 打印FPR和TPR
print('\n=====AUC====================\nAUC:',auc) # 打印AUC 代码运行结果如下:

从结果可见,自行计算结果与sklearn包运行结果一致。
好了,以上就是实现AUC计算的全部内容了~从这里我们就彻底知道sklearn是怎么计算出AUC的了,总的来说,其实就是算出FPR和TPR,然后计算出每段的面积就可以了。
评论