一,概念
总论述
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,并以此作为曲线上的点。具体操作步骤如下:
- 首先,根据预测结果的概率或分数对样本进行排序。
- 设定一个阈值,将所有样本分为正例和负例。
- 计算该阈值下的TPR和FPR。
- 不断改变阈值,重复步骤3,直到遍历所有的样本。
- 将得到的一系列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,并以此作为曲线上的点。具体操作步骤如下:
- 首先,根据预测结果的概率或分数对样本进行排序。
- 设定一个阈值,将所有样本分为正例和负例。
- 计算该阈值下的Precision和Recall。
- 不断改变阈值,重复步骤3,直到遍历所有的样本。
- 将得到的一系列Precision和Recall坐标绘制在二维坐标图上,形成PR曲线。
pr曲线如下所示
4.ROC曲线和PR曲线的区别及相应的应用场景
ROC曲线的含义和性能评估密切相关。一条越靠近左上角的ROC曲线表示模型在各个阈值下都能保持较高的真正例率(召回率)和较低的假正例率,即模型性能较好。而曲线越接近45度对角线,则表示模型性能较差。
与ROC曲线相似,PR曲线也是阈值变化而产生变化的。但PR曲线更加关注模型在正例方面的性能表现,而ROC曲线则涵盖了所有分类指标的信息。PR曲线的形状也可以代表模型的性能。同样地,PR曲线下方的区域被称为Average Precision(AveP),AveP越大表示模型的性能越好。
- ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例。
- 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。
- 类别不平衡问题中,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
make_classification
函数用于生成示例数据集。train_test_split
函数用于将数据集划分为训练集和测试集。LogisticRegression
类是用于创建逻辑回归模型的类。precision_recall_curve
,roc_curve
和auc
函数分别用于计算PR曲线、ROC曲线和相应的面积指标。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划分训练集和测试集
-
使用
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训练模型
-
创建了一个逻辑回归模型,使用训练集数据和标签进行模型训练。
-
使用训练好的模型对测试集进行预测,得到了预测的概率或分数
y_scores
。
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 获取预测概率或分数
y_scores = model.predict_proba(X_test)[:, 1]
2.5计算精确率、召回率和阈值等
-
使用
precision_recall_curve
函数计算了精确率、召回率和阈值,这些指标用于绘制PR曲线。 -
使用
roc_curve
函数计算了真正例率、假正例率和阈值,这些指标用于绘制ROC曲线。 -
使用
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曲线的使用不够深入,还不够了解这两种曲线相对应的应用场景,需要对这两种曲线的原理进行深入理解,更加清楚地了解它们之间的区别和应用场景。