在构建模型中,我们经常会用到AUC、ROC等指标来进行模型效果评估
ROC全称是“受试者工作特征”(Receiver Operating Characteristic)。ROC曲线的面积就是AUC(Area Under the Curve)。AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)。
如果大家对二值分类模型熟悉的话,都会知道其输出一般都是预测样本为正例的概率,而事实上,ROC曲线正是通过不断移动分类器的“阈值”来生成曲线上的一组关键点的
Python中sklearn直接提供了用于计算ROC的函数,下面就把函数背后的计算过程讲一下。
1.计算ROC需要知道的概念:
1.二分类常用的概念:True Positive,False Positive,True Negetive, Flase Negetive,根据真实的类别与预测类别的组合来区分的。
假设有一批test样本,这些样本只有两种类别:正例和反例。机器学习算法预测类别如下图(左半部分预测类别为正例,右半部分预测类别为反例),而样本中真实的正例类别在上半部分,下半部分为真实的反例。
预测值为正例,记为P(Positive)
预测值为反例,记为N(Negative)
预测值与真实值相同,记为T(True)
预测值与真实值相反,记为F(False)
正例 |
负例 |
|
预测正 |
真正例 (true positive, TP) |
假正例 (false positive, FP) |
预测负 |
假负例 (false negative, FN) |
真负例 (true negative, TN) |
真正例率:TPR=TP/(TP+FN),所有正例中被预测为正例的比例
假正例率:FPR=FP/(FP+TN), 所有负例中被预测为正的比例
精确率:P=TP/(TP+FP), 预测为正的样本中真正为正的比例
召回率:R=TP/(TP+FN),所有正例中被预测为正例的比例
2.关键概念的计算
TPR:样本中的真实正例类别总数即TP+FN,真正例率:TPR即True Positive Rate,TPR = TP/(TP+FN)。
FPR:样本中的真实反例类别总数为FP+TN。假正例率:FPR即False Positive Rate,FPR=FP/(TN+FP)。
截断点: 机器学习算法对test样本进行预测后,可以输出各test样本对某个类别的相似度概率。比如t1是P类别的概率为0.3,一般我们认为概率低于0.5,t1就属于类别N。这里的0.5,就是”截断点”。
上述三个指标是计算ROC的重要概念。
3.sklearn 计算ROC
示例如下:
import numpy as np
from sklearn import metrics
y=np.array([1,2,2,2,1,1])
scores=np.array([0.2,0.2,0.35,0.9,0.1,0.2])
fpr,tpr,thresholds=metrics.roc_curve(y,scores,pos_label=2)
画图:
import matplotlib.pyplot as plt
plt.title('ROC')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.plot(fpr,tpr,'-*b',label='tuli')
plt.legend()
plt.show()
绘图
计算方式参考:
(5条消息) sklearn计算准确率、精确率、召回率、F1 score_MrLittleDog的博客-CSDN博客_sklearn 准确率
4.ROC-AUC 和PR-AUC
ROC-AUC 指的是 ROC 曲线下的面积,通过在【0,1】范围内设置阈值来计算对应的TPR和FPR,最终将所有的点连起来构成ROC曲线。
PR-AUC 的构造和上述过程基本一致,只是需要再计算出 Precision 和 Recall。
AUC: 随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。
关于AUC的计算可参考: (5条消息) AUC的计算方法_SCUT_Sam-CSDN博客_auc计算公式
#### PR曲线实则是以precision(精准率)和recall(召回率)这两个为变量而做出的曲线,其中recall为横坐标,precision为纵坐标。设定一系列阈值,计算每个阈值对应的recall和precision,即可计算出PR曲线各个点。
程序代码如何实现
####可以使用sklearn.metrics.precision_recall_curve 来计算PR曲线
from sklearn.metrics import precision_recall_curve,auc
precision, recall, thresholds = precision_recall_curve(ture_lab,pre_lab)
####使用AUC函数计算出auc值
auc_precision_recall = auc(recall, precision)
转载自:Pytorch-从一团乱麻到入门:3、模型效果评估指标:ROC、AUC、precision、recall (qq.com)