ROC曲线以及PR曲线的原理以及python实现

一、PR曲线

1.1原理

   PR曲线是Precision-Recall(精确率-召回率)曲线的简称,用于评估二分类模型在不同阈值下的性能表现。PR曲线的横轴是召回率(Recall),纵轴是精确率(Precision),通过绘制不同阈值下的精确率和召回率之间的关系,可以直观地展示模型在不同阈值下的整体性能。

召回率是衡量模型对实际正例样本的识别能力,即模型能够正确预测出多少实际正例。计算公式为:Recall=TP/(FN+TP)​。

准确率是衡量模型在预测为正例的样本中真正为正例的比例,即模型预测为正例的样本中有多少是真正的正例。计算公式为:Precision=TP/(FP+TP)​。

以下有一个例子:有十条狗,5条患有狂犬病,另外5条未患有狂犬病

实际情况预测结果
未患病患病
未患病患病
未患病未患病
未患病未患病
未患病患病
患病未患病
患病未患病
患病患病
患病患病
患病未患病

根据上表可得:

TP(True Positive):2 即实际情况为“患病”,预测结果为“患病”的。
FP(False Positive):3 即实际情况为“未患病”,预测结果为“患病”的人数。
TN(True Negative):2 即实际情况为“未患病”,预测结果为“未患病”的人数。
FN(False Negative):3 即实际情况为“患病”,预测结果为“未患病”的人数。

召回率Recall=TP/(FN+TP)​=2/(3+2)=0.4

准确率Precision=TP/(FP+TP)​=2(2+3)=0.4

因此,在这个例子中,召回率和查准率都是0.4。这意味着我们的模型能够正确地识别出40%的真实正例,并且在所有预测为正例的样本中有40%是真正的正例。

1.2代码实现

import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve

# 真实标签和预测概率
y_true = [0, 0, 1, 1]
y_scores = [0.11, 0.45, 0.35, 0.8]

# 计算 Precision-Recall 曲线的数据
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)

# 绘制 PR 曲线
plt.plot(recall, precision)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.show()

运行结果:

二、ROC曲线

2.1、原理

ROC(Receiver Operating Characteristic)曲线是一种常用的二分类模型性能评估工具,它以真阳率(True Positive Rate,TPR)为纵轴,假阳率(False Positive Rate,FPR)为横轴绘制,这两个重要的性能指标是绘制ROC曲线的基础。

真阳率(TPR)也称为灵敏度(Sensitivity)或命中率(Recall),表示模型正确预测为正例的样本占所有正例样本的比例,计算公式为 TPR = TP / (TP + FN),其中 TP 表示真正例数量,FN 表示假反例数量。

假阳率(FPR)表示模型错误预测为正例的样本占所有负例样本的比例,计算公式为 FPR = FP / (FP + TN),其中 FP 表示假正例数量,TN 表示真反例数量。

再以上面的患病为例子:

实际情况预测结果
未患病患病
未患病患病
未患病未患病
未患病未患病
未患病患病
患病未患病
患病未患病
患病患病
患病患病
患病未患病

TP(True Positive):2 即实际情况为“患病”,预测结果为“患病”的。
FP(False Positive):3 即实际情况为“未患病”,预测结果为“患病”的人数。
TN(True Negative):2 即实际情况为“未患病”,预测结果为“未患病”的人数。
FN(False Negative):3 即实际情况为“患病”,预测结果为“未患病”的人数。

真阳率:TPR = TP / (TP + FN)=2/(2+3)=0.4

假阳率:FPR = FP / (FP + TN)=3/(3+2)=0.4

2.2代码实现

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# 真实标签和预测概率
y_true = [0, 0, 1, 1]
y_scores = [0.11, 0.45, 0.35, 0.8]

# 计算 ROC 曲线的数据
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
roc_auc = auc(fpr, tpr)

# 绘制 ROC 曲线
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--')  # 对角线
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')
plt.legend(loc="lower right")
plt.show()

运行结果:

三、实验小结

PR曲线以查准率(Precision)为纵轴,召回率(Recall)为横轴,可以反映出模型在不同阈值下的精确度和召回率之间的平衡关系。适用于数据不平衡的情况,例如正例样本较少的分类问题。

ROC(Receiver Operating Characteristic Curve)曲线以真阳率(TPR)为纵轴,假阳率(FPR)为横轴,可以反映出模型在不同阈值下的灵敏度和特异度之间的平衡关系。通过改变模型的分类阈值,观察模型在不同条件下的误判情况。

两者曲线相比,ROC曲线适用于数据分布均衡的二分类问题,能够全面评估模型在不同阈值下的性能。而PR曲线适用于数据不平衡的二分类问题,重点关注模型的查准率和召回率。

通过ROC曲线和PR曲线可以直观地了解模型在不同条件下的表现,并根据实际需求选择合适的分类阈值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值