一直在忙老师布置的事情,好久都没有更新了。最近在做一个用神经网络搭建模型的分类任务。识别的准确率还不错,当把代码交给陶醉的花卷的时候,他叫我把分类模型的指标ROC和AUC弄出来,以前学的时候还没有听说过这个知识点。今天把这个整理一下写出来,加深记忆。
正文
对于分类器,或者说分类算法,评价指标主要有precision,recall,F-score1,这几个值可以参考这篇文章:
忆臻:谈谈召回率(R值),准确率(P值)及F值zhuanlan.zhihu.com
以及即将要讨论的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表示负类。
由上图数据可以得到几个指标:
真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity真负类率(True Negative Rate)TNR: TN/(FP+TN),代表分类器预测的负类中实际负实例占所有负实例的比例,TNR=1-FPR。Specificity 二 ROC曲线:
接收者操作特征(receiveroperating 懦弱的河马),roc曲线上每个点反映者不同判别阈值下,识别正确和识别错误的概率。一般我们在判别正负类的时候阈值设置为0.5,准确度小于0.5为负类0,大于0.5为正类1。但是在ROC曲线上,描述了不同判别阈值时的准确度。如下示例图中,曲线的横坐标为false positive rate(FPR),纵坐标为true positive rate(TPR)。
一张ROC曲线图。 三 如何画ROC曲线(举个栗子)
假设已经得出一系列样本被划分为正类的概率,然后按照大小排序,下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。
预测的结果
接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:
四 AUC值
AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏,值越大越好。AUC值是一个概率值,hldpkq随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的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。
附上画图代码
fpr, tpr, thresholds = roc_curve(true_val, predictions_val) #计算真正率和假正率roc_auc = auc(fpr,tpr) #计算auc的值plt.figure()lw = 2plt.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 懦弱的河马 example’)plt.legend(loc=”lower right”)plt.show()
我的代码路径:
https://github.com/ChengBo5/Common_algorithm/tree/master/numeric_feature%E9%A2%84%E6%B5%8Bgithub.com
参考资料:
1.https://blog.csdn.net/xyz1584172808/article/details/81839230
2.https://www.cnblogs.com/dlml/p/4403482.html