AUC值越大_分类器指标ROC曲线和AUC值

AUC值越大_分类器指标ROC曲线和AUC值_第1张图片

一直在忙老师布置的事情,好久都没有更新了。最近在做一个用神经网络搭建模型的分类任务。识别的准确率还不错,当把代码交给师兄的时候,他叫我把分类模型的指标ROC和AUC弄出来,以前学的时候还没有听说过这个知识点。今天把这个整理一下写出来,加深记忆。

正文

对于分类器,或者说分类算法,评价指标主要有precision,recall,F-score1,这几个值可以参考这篇文章:

忆臻:谈谈召回率(R值),准确率(P值)及F值​zhuanlan.zhihu.com
a7ef7dc07be3b2c70f5a1940628529b8.png

以及即将要讨论的ROC和AUC。本文通过对这些指标的原理做一个简单的介绍,然后用python分别实现二分类的ROC曲线。

一 基本概念:

ROC和AUC是专门针对二分类任务,对于多分类任务并不适用。对于一个二分离预测问题,其结果要么是真(p),otherwise 是假(n)。在分类器的输出有4种可能,

  • 1.预测为p,实际为p 这就叫做真正性(TP); 正确的肯定数目
  • 2.预测为p,实际为n 这就叫做假正性(FP). 漏报,没有找到正确匹配的数目
  • 3.预测为n,实际为p 这就叫做假负性(FN); 误报,没有的匹配不正确
  • 4.预测为n,实际为n 这就叫做真负性(TN); 正确的否定数目

一般用1表示正类,0表示负类。

AUC值越大_分类器指标ROC曲线和AUC值_第2张图片

由上图数据可以得到几个指标:

  1. 真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity
  2. 负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity
  3. 真负类率(True Negative Rate)TNR: TN/(FP+TN),代表分类器预测的负类中实际负实例占所有负实例的比例,TNR=1-FPR。Specificity

二 ROC曲线:

接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映者不同判别阈值下,识别正确和识别错误的概率。一般我们在判别正负类的时候阈值设置为0.5,准确度小于0.5为负类0,大于0.5为正类1。但是在ROC曲线上,描述了不同判别阈值时的准确度。如下示例图中,曲线的横坐标为false positive rate(FPR),纵坐标为true positive rate(TPR)。

AUC值越大_分类器指标ROC曲线和AUC值_第3张图片
一张ROC曲线图。

三 如何画ROC曲线(举个栗子)

假设已经得出一系列样本被划分为正类的概率,然后按照大小排序,下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。

AUC值越大_分类器指标ROC曲线和AUC值_第4张图片
预测的结果

接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:

AUC值越大_分类器指标ROC曲线和AUC值_第5张图片

四 AUC值

AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏,值越大越好。AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

五 代码实现画ROC曲线和计算AUC值

截取我代码中的一部分给大家演示,我使用的是一个sklearn的机器学习库,当我们导入数据实际的类型 (正或负类) ,和模型预测样本为正的概率。roc_curve()函数会自动设置阈值计算出FPR和TPR值。

auc函数就是更具计算出的FPR和TPR点值,计算这个曲线下的面积。

from sklearn.metrics import roc_curve, auc                     #导入库


fpr, tpr, thresholds  =  roc_curve(true_val, predictions_val)  #计算真正率和假正率
roc_auc = auc(fpr,tpr)                                         #计算auc的值

true_val:样本的实际类别(0 或者 1)

predictions_val : 预测为正类的概率 (0-1之间)

下图为我画的ROC曲线图,神经网络模型预测的效果还是不错的,auc=0.94,值很接近1,模型的准确率也达到了%96。

AUC值越大_分类器指标ROC曲线和AUC值_第6张图片

附上画图代码

fpr, tpr, thresholds  =  roc_curve(true_val, predictions_val)  #计算真正率和假正率
roc_auc = auc(fpr,tpr)                                         #计算auc的值
plt.figure()
lw = 2
plt.figure(figsize=(10,10))
plt.plot(fpr, tpr, color='darkorange',lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) #假正率为横坐标,真正率为纵坐标做曲线
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

我的代码路径:

https://github.com/ChengBo5/Common_algorithm/tree/master/numeric_feature%E9%A2%84%E6%B5%8B​github.com

参考资料:

1.https://blog.csdn.net/xyz1584172808/article/details/81839230

2.https://www.cnblogs.com/dlml/p/4403482.html

你可能感兴趣的:(AUC值越大,python,计算曲线面积,似然比和p值不同的原因)