分类模型评估(PR,ROC曲线)可视化实现

一,概念

总论述

ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题中常用的评估方法,二者既有相同也有不同点。混淆矩阵与PR、ROC曲线之间存在紧密的联系,它们都是用于衡量分类模型性能的重要工具。所以在学习分类模型评估(PR,ROC曲线)可视化实现之前首先要学习混淆矩阵。

1.混淆矩阵

混淆矩阵(Confusion Matrix)是用于可视化分类模型预测结果与真实结果之间的对应关系的表格。它由四个要素组成:真正例(True Positive,TP)、假正例(False Positive,FP)、真反例(True Negative,TN)和假反例(False Negative,FN)。

以下是混淆矩阵的构成:

  • 真正例(True Positive,TP):表示模型正确地将正例样本分类为正例。
  • 假正例(False Positive,FP):表示模型错误地将反例样本分类为正例。
  • 真反例(True Negative,TN):表示模型正确地将反例样本分类为反例。
  • 假反例(False Negative,FN):表示模型错误地将正例样本分类为反例。

  

TP:正确肯定的数目;
FN:漏报,没有正确找到的匹配的数目;
FP:误报,给出的匹配是不正确的;
TN:正确拒绝的非匹配对数;

可以得到

参考自分类评价指标:ROC曲线和PR曲线详解_pr曲线是什么意思-CSDN博客

2.roc曲线

ROC曲线(Receiver Operating Characteristic curve)是一种用于评估二分类问题中模型性能的可视化工具。它以真正例率(True Positive Rate,也称为召回率)为纵坐标,以假正例率(False Positive Rate)为横坐标,绘制出一条曲线。ROC曲线可以帮助我们了解在不同阈值下分类模型的性能表现。

ROC曲线将在不同的分类阈值下计算不同的TPR和FPR,并以此作为曲线上的点。具体操作步骤如下:

  1. 首先,根据预测结果的概率或分数对样本进行排序。
  2. 设定一个阈值,将所有样本分为正例和负例。
  3. 计算该阈值下的TPR和FPR。
  4. 不断改变阈值,重复步骤3,直到遍历所有的样本。
  5. 将得到的一系列TPR和FPR坐标绘制在二维坐标图上,形成ROC曲线。

除了ROC曲线之外,常用的评估指标还有曲线下方面积(Area Under the ROC Curve, AUC)。AUC值是ROC曲线下方的面积,取值范围在0到1之间。AUC值越接近于1,表示模型性能越好;AUC值越接近于0.5,则表示模型性能越差。

roc曲线如下所示

部分内容参考自ROC曲线和PR曲线的区别及相应的应用场景-CSDN博客

3.pr曲线

PR曲线(Precision-Recall curve)与ROC曲线类似,也是用于评估二分类模型性能的可视化工具。区别在于它以精确率(Precision)为纵坐标,以召回率(Recall)为横坐标,绘制出一条曲线。PR曲线可以帮助我们了解在不同阈值下分类模型的性能表现。

其中Precison和Recall的计算方法如下

参考自ROC曲线和PR曲线的区别及相应的应用场景-CSDN博客

PR曲线将在不同的分类阈值下计算不同的Precision和Recall,并以此作为曲线上的点。具体操作步骤如下:

  1. 首先,根据预测结果的概率或分数对样本进行排序。
  2. 设定一个阈值,将所有样本分为正例和负例。
  3. 计算该阈值下的Precision和Recall。
  4. 不断改变阈值,重复步骤3,直到遍历所有的样本。
  5. 将得到的一系列Precision和Recall坐标绘制在二维坐标图上,形成PR曲线。

pr曲线如下所示

4.ROC曲线和PR曲线的区别及相应的应用场景

ROC曲线的含义和性能评估密切相关。一条越靠近左上角的ROC曲线表示模型在各个阈值下都能保持较高的真正例率(召回率)和较低的假正例率,即模型性能较好。而曲线越接近45度对角线,则表示模型性能较差。

与ROC曲线相似,PR曲线也是阈值变化而产生变化的。但PR曲线更加关注模型在正例方面的性能表现,而ROC曲线则涵盖了所有分类指标的信息。PR曲线的形状也可以代表模型的性能。同样地,PR曲线下方的区域被称为Average Precision(AveP),AveP越大表示模型的性能越好。

  1. ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例。
  2. 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。
  3. 类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。

应用场景的详细内容见机器学习之类别不平衡问题 (2) —— ROC和PR曲线 - 知乎 (zhihu.com)

二,绘制pr和roc曲线

2.1引入了需要用到的sklearn库中的函数和类

以及用于可视化的matplotlib库中的绘图函数。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_recall_curve, roc_curve, auc
import matplotlib.pyplot as plt
  1. make_classification函数用于生成示例数据集。
  2. train_test_split函数用于将数据集划分为训练集和测试集。
  3. LogisticRegression类是用于创建逻辑回归模型的类。
  4. precision_recall_curveroc_curveauc函数分别用于计算PR曲线、ROC曲线和相应的面积指标。
  5. pyplot子库中的函数用于绘制PR曲线和ROC曲线的图形。

2.2生成示例数据集

通过make_classification函数生成了一个示例数据集X和对应的标签y。其中n_samples指定了样本数量,n_features指定了特征数量,random_state用于控制数据生成的随机性。并展示如下

X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
print("Features (X):")
print(X)
print("Labels (y):")
print(y)

2.3划分训练集和测试集

  1. 使用train_test_split函数将数据集划分为训练集和测试集。其中test_size指定了测试集的比例,random_state用于控制数据划分的随机性。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2.4训练模型

  1. 创建了一个逻辑回归模型,使用训练集数据和标签进行模型训练。

  2. 使用训练好的模型对测试集进行预测,得到了预测的概率或分数y_scores

# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 获取预测概率或分数
y_scores = model.predict_proba(X_test)[:, 1]

2.5计算精确率、召回率和阈值等

  1. 使用precision_recall_curve函数计算了精确率、召回率和阈值,这些指标用于绘制PR曲线。

  2. 使用roc_curve函数计算了真正例率、假正例率和阈值,这些指标用于绘制ROC曲线。

  3. 使用auc函数计算了PR曲线下方的面积(Average Precision)和ROC曲线下方的面积(AUC),这些指标用于评估模型性能。

# 计算精确率、召回率和阈值
precision, recall, thresholds_pr = precision_recall_curve(y_test, y_scores)

# 计算真正例率、假正例率和阈值
fpr, tpr, thresholds_roc = roc_curve(y_test, y_scores)

# 计算PR曲线下方的面积(Average Precision)和ROC曲线下方的面积(AUC)
avep = auc(recall, precision)
roc_auc = auc(fpr, tpr)

2.6绘制了PR曲线

# 绘制PR曲线
plt.figure()
plt.step(recall, precision, where='post', color='b', alpha=0.8)

plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('PR Curve (AveP={:.2f})'.format(avep))
plt.show()

2.7绘制roc曲线

# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (AUC = {:.2f})'.format(roc_auc))
plt.plot([0, 1], [0, 1], color='navy', lw=2, 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('ROC Curve')
plt.legend(loc="lower right")
plt.show()

三,小结心得

1.了解和熟悉模型评估指标:在这个实验中,学习了精确率(Precision)、召回率(Recall)、真正例率(True Positive Rate)和假正例率(False Positive Rate)等常见的二分类模型评估指标。这些指标能够帮助我全面地评估模型的表现。

   2.在这次实验中,我使用train_test_split函数将数据集划分为训练数据和测试数据。如下

这是我·直接使用train_test_split函数,其实需要理解训练数据和测试数据在模型评估中的作用,并根据具体的应用场景合理地划分数据集。这也是本次实验取巧的地方,正确的应该合理的测试和训练数据集来选择合适的划分方法。

  3.对PR曲线和ROC曲线的使用不够深入,还不够了解这两种曲线相对应的应用场景,需要对这两种曲线的原理进行深入理解,更加清楚地了解它们之间的区别和应用场景。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值