一文详解 ROC/AUC
前言
AUC(area under the curve)是机器学习领域中一种常见且重要的模型评估标注,表示ROC(receiver operator characteristic)曲线下的面积。今天我们就和大家一起来梳理一下有关ROC/AUC的基本知识。
1. 基本概念
& 混淆矩阵
首先我们从混淆矩阵谈起,混淆矩阵中横轴通常表示真实类别(1和0分别对应真、伪),纵轴表示预测类别(1和0分别对应阳、阴),对真实类别和真实类别进行组合,便形成了如下的混淆矩阵:
混淆矩阵
& 准确率
按照混淆矩阵中的符号形式,准确率的公式可以表示为:
准确率是一种非常常见的模型效能度量指标,然而当面对样本不平衡问题时,其度量效果会产生问题。比如在一个总样本中,1类样本占90%,0类样本占10%,样本严重不平衡,此时我们只需要将全部样本预测为1即可得到高达90%的准确率。
& 精准率
精准率(Precision)又称查准率,代表所有被预测为1的样本中实际为1的概率,其公式如下:
& 召回率
召回率(Recall)又称查全率,代表在所有实际为1的样本中被预测为1的概率,其公式如下:
& F1分数
通常情况下,查准率和查全率会随着阈值的变化而变化,我们希望查准率和查全率同时都非常高,然而这两个指标实际是此消彼长的关系,无法做到双高。对此,我们就需要一个新的指标 —— F1分数。F1分数同时考虑了查准率和查全率,通过选取最高的F1来确定分类阈值,F1公式如下:
3. ROC/AUC 介绍
在正式介绍ROC/AUC之前,我们还要再了解几个指标。
& 灵敏度
& 特异度
& 真阳率 (TPR)
真阳率和召回率一样,代表在所有实际为1的样本中被预测为1的概率,其公式如下:
& 假阳率 (FPR)
假阳率代表在所有实际为0的样本中被预测为1的概率,其公式如下:
& ROC/AUC
ROC曲线中的主要两个指标就是真阳率和假阳率,通过遍历不同的阈值也就得到了整条曲线,曲线下的面积也就是AUC。
ROC/AUC
3. ROC曲线的阈值问题
看完上述内容后,很多同学可能还并不是很能理解ROC曲线,下面我们通过一张图来进一步来解释一下。
ROC曲线阈值变化图
图中蓝橙两条曲线反映了1和0两类真实数据的分布情况,黑色的直线表示分类器的阈值,模型将黑线左边的样本标签预测为0,黑线右边的预测为1,因此也就产生了TP、FP、TN、FN四个值,进而我们也就可以计算真阳率和假阳率。当我们对不同的阈值进行遍历时,产生的 (假阳率, 真阳率) 坐标点也就可以连成ROC曲线,进而求得曲线下面积AUC。
4. 换一种方式理解AUC
AUC其实也可以这样理解:随机从正样本和负样本中各选一个,分类器对于该正样本打分大于该负样本打分的概率。
假设数据集一共有M个正样本,N个负样本,预测值也就是M+N个。我们将所有样本按照预测值进行从小到大排序,并排序编号由1到M+N。
对于正样本概率最大的,假设排序编号为 ,比它概率小的负样本个数 =
对于正样本概率第二大的,假设排序编号为 ,比它概率小的负样本个数 = ;
以此类推......
对于正样本概率最小的,假设排序编号为 ,比它概率小的负样本个数 =
那么在所有情况下,正样本打分大于负样本打分的个数就等于:
AUC的正式计算公式就是:
4. 多分类问题中的AUC
可以把多分类分成n个二分类来解决。比如a、b、c三分类问题可以转化为属于a和不属于a、属于b和不属于b、属于c和不属于c,三种情况。求总体评估效果的话再把他们加和求平均就可以了。
同理roc曲线你也可以画出来。另外多分类问题最好每一类分别都看看,因为有可能存在总体效果好,有一部分类别预测的很准,另外一些类别根本分不出来的情况。
5. ROC/AUC 代码
- 二分类
def binary\_class\_auc(X, y, model):
'''
param X: 特征
param y: 标签
param model: 训练好的模型
return: roc曲线图
'''
from sklearn import metrics
y_score = model.predict_proba(X)
fpr, tpr, threshold = metrics.roc_curve(y, y_score[:,1])
roc_auc = metrics.auc(fpr, tpr)
plt.plot(fpr, tpr, label='AUC = %0.3f' % roc_auc)
plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', alpha=.8)
plt.legend(loc='lower right')
plt.show()
binary_class_auc(x_test, y_test, model)
- 多分类
def mul\_class\_auc(X, y, model, class\_number):
'''
param X: 特征
param y: 标签
param model: 训练好的模型
param class\_number: 分类数
return: roc曲线图
'''
from sklearn import metrics
y_score = model.predict_proba(X)
y_one_hot = label_binarize(y, np.arange(class_number))
fpr, tpr, threshold = metrics.roc_curve(y_one_hot.ravel(), y_score.ravel())
roc_auc = metrics.auc(fpr, tpr)
plt.plot(fpr, tpr, label='AUC = %0.3f' % roc_auc)
plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', alpha=.8)
plt.legend(loc='lower right')
plt.show()
mul_class_auc(x_test, y_test, model, 3)
参考资料
https://www.zhihu.com/question/304639772/answer/546024842
https://zhuanlan.zhihu.com/p/92218196
https://www.zhihu.com/question/39840928/answer/241440370
END
添加助手微信回复研究方向或专业即可加入我们的微信交流群或QQ交流群
扫码关注我们
祝大家offer多多,秋招顺利!!!