一:基础介绍
1、PR曲线与ROC曲线的定义
把正例正确判定为正例,表示为TP(true positive)
把正例错误判定为负例,表示为FN(false negative)
把负例正确判定为负例,表示为TN(true negative)
把负例错误判定为正例,表示为FP(false positive)
通过混淆矩阵可以计算出精确率precision 召回率recall :
Precision=TP/(TP+FP)
Recall=TP/(TP+FN)
TPR=TP/(TP+FN)
FPR=FP/(FP+TN)
Precision的具体含义其实就是预测为正例的样本中预测正例中所占的比例。
Recall的具体含义就是预测正确的正例的样本在所有真正正例样本中的比例。
TPR的具体含义就是预测正确的正例样本在所有真正正例样本中的比例,跟Recall一样。
TFR的具体含义就是预测正确的反例样本在所有真正反例样本中的比例。
如上,P-R曲线就是Recall为横轴、Precision为纵轴绘制的一条曲线,表示在所取的阈值不一样时,对应的precision值与recall值,然后构成一条曲线。
而ROC曲线则是PR曲线横轴、纵轴的度量发生变化,横轴是FPR,纵轴是TPR。
PR曲线
在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为"最可能"是正例的样本,排在最后的则是学习器认为"最不可能"是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率,以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称" P-R 曲线"
ROC曲线
ROC 全称是"受试者工作特征" (Receiver Operating Characteristic) 曲线,与P-R曲线相似,我们根据学习器的预测结果对样例进行排序,样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横、纵坐标作图'就得到了”ROC“曲线,与P-R 曲线使用查准率、查全率为纵、横轴不同, ROC 曲线的纵轴是"真正例率" (True Positive Rate,简称TPR) ,横轴是"假正例率" (False PositiveRate,简称FPR)
PR曲线和ROC曲线是不同的两种常用于评估分类模型性能的图形工具。它们都可以有效地表示模型在不同阈值下的表现。但是,这两种曲线所讲述的故事是不同的,并且在特定的场景中,一种可能比另一种更有用。
-
ROC 曲线:ROC 曲线描绘的是模型在各种阈值之下的真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate,FPR)之间的关系。TPR 也就是召回率,FPR 是错误分类为正例的负例所占的比率。ROC 曲线在处理均衡数据集(即正例和负例数量大致相等)时非常有用,或者在我们对阳性和阴性样本的错误判断不做区分的情况下。
-
PR 曲线:PR 曲线显示的是模型在各个阈值下的精确率(Precision)和召回率(Recall)关系。PR 曲线比ROC曲线对不平衡数据集更敏感,因此,当类别分布极度不平衡(例如,正样本很少,负样本很多)时,我们更倾向于使用 PR 曲线来评估模型的表现。
总结起来,如果你处理的问题类别在数据集中比较均衡,或者你认为阳性和阴性样本的错误判断同等重要,那么 ROC 曲线就可以很好地满足你的需求;但如果你的问题类别在数据集中不平衡,那么 PR 曲线能给出更准确的模型性能评估。
需要注意的是,这两个曲线只是分析工具,并不能为我们做出决策。选择哪一个作为评估工具需要根据实际问题的具体情况来决定。
PR曲线的简单实现:
自定义数据集:
TP=np.array([5,4,4,3,3,3,3,3,3,3,2])
FN=np.array([0,1,1,2,2,2,2,2,2,2,3])
FP=np.array([5,2,2,0,0,0,0,0,0,0,0])
代码:
import matplotlib.pyplot as plt
import numpy as np
if __name__=='__main__':
TP=np.array([5,4,4,3,3,3,3,3,3,3,2])
FN=np.array([0,1,1,2,2,2,2,2,2,2,3])
FP=np.array([5,2,2,0,0,0,0,0,0,0,0])
P=TP/(TP+FP)
R=TP/(TP+FN)
plt.plot(R, P)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.show()
运行结果:
ROC曲线的简单实现:
自定义数据集:
TP=np.array([5,4,4,3,3,3,3,3,3,3,2])
FN=np.array([0,1,1,2,2,2,2,2,2,2,3])
FP=np.array([5,2,2,0,0,0,0,0,0,0,0])
TN=np.array([0,3,3,5,5,5,5,5,5,5,5])
代码:
import matplotlib.pyplot as plt
import numpy as np
if __name__=='__main__':
TP=np.array([5,4,4,3,3,3,3,3,3,3,2])
FN=np.array([0,1,1,2,2,2,2,2,2,2,3])
FP=np.array([5,2,2,0,0,0,0,0,0,0,0])
TN=np.array([0,3,3,5,5,5,5,5,5,5,5])
TPR=TP/(TP+FN)
FPR=FP/(FP+TN)
plt.plot(FPR, TPR)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()
运行结果:
实验总结:
在这次实验中,学习了PR曲线与ROC曲线相关的内容知识。本次实验我们学习了PR曲线和ROC曲线,了解它们的应用场景,并且能够使用Python进行相关的实验操作和结果分析。