今天由我来向大家介绍何为PR曲线和ROC曲线,以及如何绘制。那么在我介绍之前,我们先来了解何为性能度量。
简介
性能度量:衡量模型泛化能力的评价标准(反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。模型的好坏,不仅取决于算法和数据,还决定于任务需求。)
一、PR曲线
在介绍如何绘制PR曲线之前,我们先来介绍什么是PR曲线以及PR曲线的作用以及什么是查准率和查全率。
1.1PR曲线的定义
P为precision即精准率(查准率),R为recall即召回率,所以P-R曲线是反映了准确率与召回率之间的关系。一般横坐标为recall,纵坐标为precision。
1.2PR曲线的作用
PR曲线常被用在信息提取领域,同时当我们的数据集中类别分布不均衡时我们可以用PR曲线代替。是数据挖掘中常见的评价指标。
1.3如何计算P值和R值
介绍之前我们先来了解何为混淆矩阵。
结合老师上课所讲的好瓜坏瓜的例子,如下图所示,我们能知道如何计算P值和R值
按照官方一点的说法,我们要先了解真正例 (true positive)、假正例 (false positive)、真反倒 (true negative) 、假反例 (false negative),如下图所示
真实情况 | 预测结果 | |
正例 | 反例 | |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(反正例) | TN(真反例) |
查准率P和查全率R由图可得
P和R的定义如下:
查准率: 预测正例中真正例所占的比例。
查全率: 预测真正例占正例的比例。
1.4如何理解PR曲线
由图可知如何比较PR曲线的优劣性:
1、曲线越靠近右上方,性能越好。(例如上图黑色曲线)
2、当一个曲线被另一个曲线完全包含了,则后者性能优于前者。(例如橘蓝曲线,橘色优于蓝 色)
3、如果曲线发生交叉(黑橘曲线),判断依据:
3.1:根据曲线下方面积大小判断,面积更大的更优于面积小的。
3.2:根据平衡点F判断:平衡点是查准率与查重率相等时的点。F计算公式为 ,F值越大,性能越好。
1.5绘制PR曲线
导入需要的包
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve
加载数据集,进行训练
y_true = np.array([1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0])
y_scores = np.array([0.9, 0.75, 0.86, 0.47, 0.55, 0.56, 0.74, 0.62, 0.5, 0.86, 0.8, 0.47, 0.44, 0.67, 0.43, 0.4, 0.52, 0.4, 0.35, 0.1])
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
PR曲线的绘制
plt.figure("P-R Curve")
plt.title('Precision/Recall Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.plot(recall,precision)
plt.show()
运行结果
二、ROC曲线
在介绍如何绘制ROC曲线之前,我们先来介绍什么是ROC曲线以及ROC曲线的作用以及什么是真正利率和假正利率。
2.1ROC曲线的定义
ROC全称Receiver Operating Characteristic,即受试者工作特征,坐标图式的分析工具。ROC 曲线的纵轴是"真正例率" (True Positive Rate,简称 TPR),横轴是"假正例率" (False PositiveRate, FPR)。
2.2ROC曲线的作用
在机器学习和数据挖掘领域同样是对学习器的泛化性能进行评估。
2.3如何计算TPR和FPR
真正率TPR
假正率FPR
2.4如何理解ROC曲线
当ROC曲线接近于(1,0)点,表明模型泛化性能越好,接近对角线时,说明模型的预测结果为 随机预测结果。
由图可知如何比较ROC曲线的优劣性:
1、当一个曲线被另一个曲线完全包含了,则后者性能优于前者。
2、ROC曲线下方的面积(AUC)可以用来作为评估模型模型性能的指标。如当两个模型的ROC曲线发生交叉,则很难说哪一个模型更好,这时候可以用AUC来作为一个比较合理的判据。ROC曲线一般都处于y=x这条直线的上方,所以取值范围在0.5和1之间,使用AUC作为评价指标是因为ROC曲线在很多时候并不能清晰地说明哪个分类器的效果更好,而AUC作为一个数值,其值越大代表分类器效果更好。
2.5绘制ROC曲线
导入需要的包
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve
加载数据集,进行训练
# y: 样本标签
# scores: 模型对样本属于正例的概率输出
y = np.array([1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0])
scores = np.array([0.9, 0.75, 0.86, 0.47, 0.55, 0.56, 0.74, 0.62, 0.5, 0.86, 0.8, 0.47, 0.44, 0.67, 0.43, 0.4, 0.52, 0.4, 0.35, 0.1])
fpr,tpr, thresholds = metrics.roc_curve(y,scores)
ROC曲线的绘制
plt.figure("ROC Curve")
plt.title('TPR/FPR Curve')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.plot(fpr,tpr)
plt.show()
运行结果
三、对比PR曲线和ROC曲线
1、PR曲线因为涉及到精确率precision计算,容易受到样本分布的影响。而ROC曲线本质上是正样本或者负样本召回率计算,不收样本分布的影响。
2、ROC曲线主要应用于测试集中的样本分布的较为均匀的情况,且当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。
3、实际问题中,正负样本数量往往很不均衡,PR曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。
4、当正负样本比例失调时,ROC曲线变化不大,此时用PR曲线更加能反映出分类器性能的好坏。
问题及总结
问题及解决过程
运行代码后显示没有matplotlib库,原因是电脑的python安装了matplotlib库,但运行的python环境未安装matplotlib库,在运行的python环镜中安装matplotlib库后运行成功。
总结
这次实验我学习了PR曲线和ROC曲线,包括它们的定义、作用,并学会了如何绘制他们,这两种曲线与我们的生活息息相关,我们可以运用它们解决如挑西瓜之类的问题。虽然实现了PR曲线和ROC曲线的绘制,但仍有很多不足,还不能熟练的运用这两种曲线,仍要加强对python的使用,总的来说是一次收获满满的实验。