机器学习---绘制PR曲线和ROC曲线

该文章已生成可运行项目,

1.PR曲线

1.1什么是PR曲线

PR 曲线(Precision-Recall Curve,精确率-召回率曲线)是一个用来评估二分类模型性能的重要工具,特别适合在数据集类别不平衡(positive 类较少)的时候使用

主要参数有:

Precision(精确率):预测为正的样本中,有多少是真的正的

Recall(召回率):所有真正正的样本中,有多少被正确预测出来了

  • TP = True Positive(真正例)

  • FP = False Positive(假正例)

  • FN = False Negative(假负例)

曲线示例:

 注:当 recall 很高时,precision 往往下降,AP表示该曲线下的面积为0.49

1.2PR曲线绘制步骤

步骤一:准备数据

在绘制任何曲线之前,要准备好一组横轴(x)与纵轴(y)对应的数据。这些数据可以是从数学函数生成的(如 y = sin(x)),也可以是实验测量结果、模型预测分数、或从 CSV 文件中读取的真实世界数据。确保这两个数组具有相同的长度,并一一对应

步骤二:选择绘图库

以 Python 为例,最常用的库是 matplotlib,主要是简单灵活,适合绘制各类曲线图。对于更高级的可视化,也可以使用 seaborn(适合统计图)或 plotly(支持交互式图表)

步骤三:绘制曲线

使用绘图库的 plot() 函数将数据画出来。例如:plt.plot(x, y)。可以通过参数控制线条颜色、线型、标签等:plt.plot(x, y, color='red', linestyle='--', label='Sample Curve')。这一步的核心是将数据映射到图表的坐标系统中

步骤四:美化图表

为了让图表更具可读性,通常会加入坐标轴标签(plt.xlabel() / plt.ylabel())、图例(plt.legend())、标题(plt.title())和网格线(plt.grid(True))。如果为了让图表展示得更专业,还可以控制字体大小、线宽、颜色主题等视觉样式

步骤五:显示或保存图像

绘制完成后,可以使用 plt.show() 将图像直接显示在屏幕上。如果要将图保存为图片文件,可以使用 plt.savefig('filename.png')。建议在保存之前先使用 plt.tight_layout() 自动优化布局,避免标签被遮挡

1.3PR曲线绘制实例

(1)计算 Precision(精确率)和 Recall(召回率):

precision, recall, _ = precision_recall_curve(y, y_scores)

(2)计算AP(平均精度):

avg_precision = average_precision_score(y, y_scores)

(3)绘制 PR 曲线:

plt.subplot(1, 2, 2)
plt.plot(recall, precision, color='blue', lw=2, label='PR curve (AP = %0.2f)' % avg_precision)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve (KNN + Cross-Validation)')
plt.legend(loc="lower left")

1.4绘制出的图像效果展示

2.ROC曲线

2.1什么是ROC曲线

ROC 曲线(Receiver Operating Characteristic Curve)是一个用于评估二分类模型性能的工具,特别是在面对不平衡数据集时非常有用。它通过展示不同的分类阈值下模型的表现,帮助我们理解模型的 敏感度(召回率)和 特异度(假正例率)之间的权衡

主要的参数有:

 假正例率(False Positive Rate, FPR):FP(假正例)是将负类预测为正类的样本数,TN(真负例)是正确预测为负类的样本数

真正例率(True Positive Rate, TPR),也叫做 召回率(Recall):TP(真正例)是正确预测为正类的样本数,FN(假负例)是将正类预测为负类的样本数 

 曲线示例:

 2.2ROC曲线绘制步骤

步骤 1:准备数据

确保有一个二分类问题的数据集。数据集应该包括样本的特征(输入数据)和对应的标签(真实类别)。将数据集分为训练集和测试集。

步骤 2:训练模型

选择一个适合二分类的模型(如逻辑回归、支持向量机、决策树等)并在训练集上进行训练。

步骤 3:预测概率

使用训练好的模型在测试集上进行预测,获取每个样本属于正类(或负类)的概率。绘制 ROC 曲线时,关键是利用这些概率,而不是硬预测的类别标签。

步骤 4:计算 ROC 曲线数据

通过不同的阈值来计算模型的 假正例率(FPR)真正例率(TPR)。随着阈值的变化,FPR 和 TPR 会发生变化。你可以根据这些变化绘制 ROC 曲线。

步骤 5:计算 AUC

AUC(Area Under the Curve)是 ROC 曲线下的面积,它用于衡量模型的整体分类性能。AUC 值越接近 1,模型的性能越好。

步骤 6:绘制 ROC 曲线

在图表中,横轴是 假正例率(FPR),纵轴是 真正例率(TPR)。理想的 ROC 曲线应该从坐标原点(0,0)开始,迅速上升并接近坐标点(0,1),显示出模型能够区分正负类的能力。

2.3绘制ROC曲线实例

(1)计算 ROC 曲线数据

fpr, tpr, _ = roc_curve(y, y_scores)

(2)计算 AUC

roc_auc = auc(fpr, tpr)

(3)绘制曲线

plt.subplot(1, 2, 1)
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve (KNN + Cross-Validation)')
plt.legend(loc="lower right")

2.4绘制出的图像效果展示:

上述两个曲线生成的前置条件:

1.所使用的库:

import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_predict, StratifiedKFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score

2. 生成数据集:

X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=4)

3.定义 KNN 模型:

knn = KNeighborsClassifier(n_neighbors=5)

 4.使用 StratifiedKFold 进行交叉验证预测概率

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
y_scores = cross_val_predict(knn, X, y, cv=cv, method='predict_proba')[:, 1]

 目的:

  • 保证类别分布的平衡,尤其适用于类别不平衡问题。

  • 评估模型的泛化能力,提供更可靠的性能评估。

  • 预测概率而非硬分类,为后续的性能评估(如 ROC 和 PR 曲线)提供更丰富的信息。

  • 提供更精确的模型评估,帮助调节分类阈值,优化模型性能。

总结:

  • ROC 曲线 更适用于类别均衡的情况,能够全面地反映模型对正负类的区分能力;

  • PR 曲线 更适用于类别不平衡的情况,尤其是在 正类样本稀缺 时,能够更好地衡量模型在正类上的表现。

PR曲线和ROC曲线的优点和缺点:

PR曲线的优缺点

优点:

PR 曲线非常适合正类样本较少,类别不平衡的情况。它专注于评估模型对正类的预测能力,避免了负类样本对评估结果的干扰。当正类样本稀缺时,PR 曲线能够提供更加有用的性能评估。PR 曲线通过精确率和召回率,直接描述了模型在正类样本上的表现,尤其适合关心正类识别能力的任务,如垃圾邮件分类和疾病诊断。AP(Average Precision)值能够综合多个阈值下的精度和召回率,提供一个全局的性能评估,帮助我们总结模型在不同阈值下的表现。此外,PR 曲线可以帮助根据精确率和召回率的权衡,调整分类阈值,优化模型在正类样本上的表现。

缺点:

PR 曲线不适用于类别平衡的数据集。当正负类样本比例较均衡时,PR 曲线可能过于关注正类,忽略了负类样本的表现。在这种情况下,ROC 曲线可能会更加全面地展示模型性能。PR 曲线只关注正类样本的预测效果,忽略了负类的分类效果,这在负类同样重要的任务中会导致性能评估不足。PR 曲线的 AUC(AP)与 ROC 曲线的 AUC 不完全等价,因此不同任务中的 PR 曲线很难与其他任务的 ROC 曲线直接比较。PR 曲线也较容易受到过拟合的影响,特别是在正类样本稀少的情况下,模型可能在训练数据上表现得很好,但在测试集上效果不好。

ROC曲线的优缺点

优点:

ROC 曲线非常适合正负样本比例相对平衡的情况。当正负类样本比例接近时,ROC 曲线能够较好地展示模型的性能,更好地理解假正例率(FPR)和真正例率(TPR)之间的权衡。由于假正例率的计算是基于负类样本,ROC 曲线通常不会受到负类样本占主导地位的影响。它通过预测概率,在不同阈值下展示模型的表现,帮助我们了解模型在各个分类阈值下的能力。此外,AUC(曲线下面积)值是 ROC 曲线的核心指标,越接近 1,说明模型性能越好,AUC 可以作为不同模型的性能比较标准。

缺点:

ROC 曲线在极度不平衡的类别分布中可能给出过于乐观的评估。因为负类样本占主导地位,即使模型在正类的预测上表现不佳,AUC 值也可能依然较高。这时,ROC 曲线无法有效评估模型在正类上的表现。ROC 曲线只关注假正例率,因此忽视了正类样本的影响。当数据集中负类样本远大于正类时,ROC 曲线无法准确衡量模型对正类样本的识别能力。此外,ROC 曲线并不适用于正负类样本差异极大的情况,这时 PR 曲线可能提供更有效的评估。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值