本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com
AUC是机器学习二分类模型中的常用指标,因此经常需要计算模型的AUC指标,
本文先介绍如何使用sklearn包计算AUC,然后讲解sklearn包计算AUC的详细流程,
通过本文可以了解如何计算AUC,并掌握AUC计算的内部逻辑和AUC的计算过程
本节展示如何调用sklearn包来直接计算AUC
sklearn计算AUC的代码
在python中计算AUC最方便的是调用sklearn的metrics包来实现
只需先用roc_curve算出fpr, tpr,再调用auc函数计算auc值即可
利用sklearn计算AUC的具体示例代码如下:
# -----调用sklearn包计算AUC--------
from sklearn import metrics
import numpy as np
#=====================标签与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)
print('thresholds:'+str(thresholds))
print('FPR:'+str(fpr))
print('TPR:'+str(tpr))
# ---------计算AUC------------
auc = metrics.auc(fpr, tpr)
print('AUC:'+str(auc))
# ------绘制ROC曲线-----------
import matplotlib.pyplot as plt
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') # 加标题
运行结果
thresholds:[1.8 0.8 0.6 0.5 0.4 0.3 0.28 0.25 0.2 0.18 0.1 ]
FPR:[0. 0. 0.1111 0.2222 0.3333 0.4444 0.4444 0.4444 0.7777 0.8888 1. ]
TPR:[0. 0.1428 0.2857 0.4285 0.4285 0.5714 0.7142 0.8571 0.8571 1. 1. ]
AUC:0.6666666666666666
ROC曲线如下:
本节讲解sklearn内部计算AUC的详细逻辑
AUC的计算过程
那sklearn包是如何计算AUC的呢?以下是笔者扒出源码整理得到的计算过程
AUC的具体计算过程如下(这需要点耐心才能理解):
还可以用上面计得的FPR和TPR画出ROC曲线
🙏提醒
使用sklearn时需要注意哦,metrics.roc_curve默认drop_intermediate为True,
算出的fpr和tpr会删掉线性过渡点(即上面图中标黄的点)哦!
本节讲解如何自行编写代码实现AUC计算-不依赖软件包
计算AUC的代码(不依赖软件包)
通过代码实现上述手算AUC的逻辑,就可以不依赖软件包自行实现AUC的计算
不依赖软件包,自实现AUC计算的代码如下:
# -*- 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包运行结果一致
好了,以上就是实现AUC计算的全部内容了~
End