本周我们进行机器学习中ROC和PR曲线的绘制
前言
ROC曲线和PR曲线是两种常用的评估二分类模型性能的方法,它们分别反映了模型的查准率和查全率在不同的分类阈值下的变化情况。
ROC曲线
介绍
ROC曲线(receiver operating characteristic)是一种对于灵敏度进行描述的功能图像,又称为感受性曲线(sensitivity curve。ROC曲线可以通过描述真阳性率(TPR)和假阳性率(FPR)来实现。由于是通过比较两个操作特征(TPR和FPR)作为标准,ROC曲线也叫做相关操作特征曲线。
ROC分析给选择最好的模型和在上下文或者类分布中抛弃一些较差的模型提供了工具。ROC曲线首先是由二战中的电子工程师和雷达工程师发明的,他们是用来检测战场中的敌军的,也就是信号检测理论。ROC分析现在已经在相关的领域得到了很好的发展,特别是在医学,无线电领域中,而且最近在机器学习和数据挖掘领域也得到了很好的发展。
PR曲线
介绍
P-R曲线刻画查准率和查全率之间的关系,查准率指的是在所有预测为正例的数据中,真正例所占的比例,查全率是指预测为真正例的数据占所有正例数据的比例。
即:精准率P=TP/(TP + FP) 召回率=TP/(TP+FN)
查准率和查全率是一对矛盾的度量,一般来说,查准率高时,查全率往往偏低,查全率高时,查准率往往偏低,例如,若希望将好瓜尽可能多选出来,则可通过增加选瓜的数量来实现,如果希望将所有的西瓜都选上,那么所有的好瓜必然都被选上了,但这样查准率就会较低;若希望选出的瓜中好瓜比例尽可能高,则可只挑选最有把握的瓜,但这样就难免会漏掉不少好瓜,使得查全率较低。
ROC曲线和PR曲线的绘制方法
首先,需要得到模型对每个样本预测为正例的概率,以及样本的真实标签(0或1)。
然后,将所有样本按照预测概率从高到低排序,并依次将每个样本作为分类阈值,即如果预测概率大于等于该样本的概率,则判为正例,否则判为反例。
接着,根据每个阈值下的预测结果和真实标签,计算出相应的TPR、FPR、Precision和Recall。
最后,以FPR为横轴,TPR为纵轴,绘制ROC曲线;以Recall为横轴,Precision为纵轴,绘制PR曲线。
实验过程
代码
# 导入所需的库
import numpy as np
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score
import matplotlib.pyplot as plt
# 生成随机的预测概率和真实标签
y_score = np.random.rand(100) # 预测概率
y_true = np.random.randint(0, 2, 100) # 真实标签
# 计算ROC曲线和AUC
fpr, tpr, thresholds = roc_curve(y_true, y_score) # FPR, TPR和阈值
roc_auc = auc(fpr, tpr) # AUC
# 计算PR曲线和AUC
precision, recall, thresholds = precision_recall_curve(y_true, y_score) # 精确度,召回率和阈值
pr_auc = average_precision_score(y_true, y_score) # AUC
# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='darkorange', label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', 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()
# 绘制PR曲线
plt.figure()
plt.plot(recall, precision, color='darkorange', label='PR curve (area = %0.2f)' % pr_auc)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall curve example')
plt.legend(loc="lower left")
plt.show()
运行结果:

自定义数据:
y_true = np.array([1,1,0,1,1,1,0,0,1,0,1,0,1,0,0,0,1,0,1,0])
y_score = np.array([0.7,0.87,0.7,0.6,0.55,0.54,0.53,0.52,0.51,0.505,0.4,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.3,0.1])
运行结果:
实验总结
ROC曲线和PR曲线是两种常用的评估二分类模型性能的方法,它们分别反映了模型的查准率和查全率在不同的分类阈值下的变化情况。ROC曲线和PR曲线都可以用来评估模型性能,并且在数据集平衡时二者区别不大。但是在数据集不平衡时,ROC曲线对负样本数量不敏感,可能会给出过于乐观的结果。而PR曲线更关注正样本数量和质量,能够更真实地反映模型性能。因此,在数据集不平衡时推荐使用PR曲线来评估模型。
在ROC空间,ROC曲线越凸向左上方向效果越好。与ROC曲线左上凸不同的是,PR曲线是右上凸效果越好。
ROC和PR曲线都被用于评估机器学习算法对一个给定数据集的分类性能,每个数据集都包含固定数目的正样本和负样本。而ROC曲线和PR曲线之间有着很深的关系。
总之,ROV曲线和PR曲线都是非常有用的工具,通过它们可以直观地看出我们的分类器在不同任务中的性能表现。在实际应用中需要综合考虑任务需求,结合实际情况选择合适的性能评估方法。
本文介绍了ROC曲线和PR曲线在机器学习中用于评估二分类模型性能的方法,尤其强调了在数据集不平衡情况下的适用性,以及两者在不同场景下的优缺点。

1656

被折叠的 条评论
为什么被折叠?



