一.ROC曲线
1.什么是ROC曲线
ROC曲线(Receiver Operating Characteristic curve)是一种用于评估分类模型性能的工具。它通常用于二分类问题,比如判断病人是否患有某种疾病、邮件是否为垃圾邮件等。
在ROC曲线中,横轴表示伪阳性率(False Positive Rate,FPR),纵轴表示真阳性率(True Positive Rate,TPR),又称为召回率(Recall)或灵敏度(Sensitivity)。ROC曲线的绘制过程是在不同的分类阈值下计算真阳性率和伪阳性率,并将它们绘制成曲线。曲线下面积即为AUC(Area Under the Curve),用于衡量分类器的性能,AUC值越接近1,分类器性能越好。
简单来说,ROC曲线可以帮助我们在不同的分类阈值下评估模型的性能,以及在选择合适的阈值时权衡真阳性率和伪阳性率。
2.ROC曲线的作用
ROC曲线有几个重要的作用:
-
评估模型性能: ROC曲线可以帮助评估分类模型的性能,特别是在处理不平衡数据集时。通过观察ROC曲线的形状和AUC值,可以直观地了解模型对不同类别的分类能力。
-
比较模型: 当有多个分类器对同一问题进行分类时,可以使用ROC曲线和AUC值来比较它们的性能。AUC值越大的模型通常更可靠。
-
选择最佳阈值: ROC曲线可以帮助选择最佳的分类阈值。根据具体应用场景的需求,可以通过观察曲线上的点来权衡真阳性率和伪阳性率,并选择最适合的阈值。
-
调整模型: 通过观察ROC曲线,可以识别模型的优势和劣势,指导进一步的模型调整和改进,以提高分类性能。
总之,ROC曲线是评估和比较分类模型性能的重要工具,可以帮助我们更好地理解模型的行为,并指导我们在实际应用中做出合适的决策。
3.ROC曲线的计算公式
ROC曲线的计算基于真阳性率(TPR)和伪阳性率(FPR),它们的计算公式如下:
真阳性率(TPR)也称为召回率(Recall)或灵敏度(Sensitivity):
伪阳性率(FPR):
其中,TP(True Positive)表示真阳性,即正样本被正确分类为正样本的数量;FN(False Negative)表示假阴性,即正样本被错误地分类为负样本的数量;FP(False Positive)表示假阳性,即负样本被错误地分类为正样本的数量;TN(True Negative)表示真阴性,即负样本被正确分类为负样本的数量。
ROC曲线是以不同的分类阈值为横坐标,TPR(召回率)为纵坐标绘制的。在绘制ROC曲线时,可以通过调整分类阈值来计算不同的TPR和FPR值,并将它们绘制成曲线。
另外,曲线下面积(AUC)也是ROC曲线的一个重要指标,它可以通过对ROC曲线下方的面积进行数值积分来计算,表示模型分类的平均性能。 AUC 的取值范围在0到1之间,AUC 值越接近1,表示模型的性能越好。
如图:
4.优劣比较
1:当一个曲线被另一个曲线完全包含了,则后者性能优于前者。
2:ROC曲线下方的面积(AUC)可以用来作为评估模型模型性能的指标.如当两个模型的ROC曲线发生交叉,则很难说哪一个模型更好,这时候可以用AUC来作为一个比较合理的判据。
二.PR曲线
1.什么是PR曲线
PR曲线(Precision-Recall curve)是另一种评估分类模型性能的工具,通常用于处理不平衡数据集或关注于正类别(少数类别)的分类问题。
在PR曲线中,横轴表示召回率(Recall),纵轴表示精确率(Precision)。召回率是指被模型正确识别为正类别的样本数占所有真实正类别样本数的比例,精确率是指被模型正确识别为正类别的样本数占所有模型判定为正类别的样本数的比例。
2.PR曲线作用
PR(Precision-Recall)曲线是评估分类模型性能的重要工具,其作用主要包括以下几个方面:
-
综合评估模型性能: PR曲线能够综合考虑分类模型的召回率(Recall)和精确率(Precision),因此提供了一个全面的性能评估。在某些情况下,比如处理不平衡数据集或者关注于正类别的分类问题时,PR曲线能够更好地反映模型的真实性能。
-
选择最佳模型: 通过比较不同模型在PR曲线下的面积(AUC-PR),可以帮助选择最佳的分类模型。AUC-PR 值越高,表示模型在不同召回率下的平均精确率越高,因此能够更好地区分正类别和负类别。
-
阈值选择: PR曲线可以帮助选择合适的分类阈值,以平衡召回率和精确率。根据具体的应用场景和需求,可以通过PR曲线找到最适合的分类阈值,使模型在召回率和精确率之间取得平衡,从而达到最佳的分类效果。
-
诊断模型: PR曲线可以帮助诊断模型的性能问题。通过观察PR曲线的形状和变化,可以发现模型在不同召回率下的表现,从而帮助识别模型的优势和不足之处,指导进一步的改进和优化。
综上所述,PR曲线在评估分类模型性能、选择最佳模型、调整分类阈值和诊断模型等方面具有重要作用,是分类模型评估中不可或缺的工具之一。
3.计算P值和R值
混淆矩阵:
在计算P(Precision,精确率)和R(Recall,召回率)时,需要考虑以下指标:
- TP(True Positive,真阳性):被模型正确识别为正类别的样本数量。
- FP(False Positive,假阳性):被模型错误识别为正类别的负样本数量。
- FN(False Negative,假阴性):被模型错误识别为负类别的正样本数量。
根据这些指标,可以使用以下公式计算P和R:
P(精准率)
R(召回率)
简而言之,P值表示模型在所有被判定为正类别的样本中,真正为正类别的比例;而R值表示模型在所有真实正类别样本中,被正确判定为正类别的比例。
在实际应用中,可以通过混淆矩阵(Confusion Matrix)来计算这些指标,混淆矩阵可以明确记录模型对每个类别的分类结果,从而方便计算P和R值。
PR曲线如图:
4.优劣对比:
①曲线越靠近右上方,性能越好。(例如上图黑色曲线)
②当一个曲线被另一个曲线完全包含了,则后者性能优于前者。(例如橘蓝曲线,橘色优于蓝色)
③如果曲线发生交叉(黑橘曲线),判断依据:
3.1:根据曲线下方面积大小判断,面积更大的更优于面积小的。
3.2:根据平衡点F判断:平衡点是查准率与查重率相等时的点。F计算公式为F = 2 * P * R /(P +R ),F值越大,性能越好。
三.ROC曲线与PR曲线的对比
1.相似之处:
评估分类器性能: 两者都是用于评估二分类模型的性能,并且都是基于模型的混淆矩阵计算得出的。
阈值调整: 两者都可以通过调整分类器的阈值来改变分类结果,并且可以根据具体的应用需求来选择最佳的阈值。
2.不同之处
-
度量方式:
- ROC曲线关注的是真正例率(True Positive Rate,召回率)和假正例率(False Positive Rate)之间的关系,其横轴是FPR,纵轴是TPR。
- PR曲线关注的是精确率(Precision)和召回率之间的关系,其横轴是Recall,纵轴是Precision。
-
数据不平衡情况下的适用性:
- ROC曲线在处理数据不平衡问题时具有鲁棒性,即使负类别样本数量远远大于正类别样本数量,ROC曲线也能够提供有效的性能评估。
- PR曲线在处理数据不平衡问题时更为敏感,因为PR曲线的计算基于精确率和召回率,所以当正类别样本数量较少时,其性能评估更能体现模型在正类别上的表现。
-
AUC计算方式:
- ROC曲线下的面积(AUC-ROC)被定义为真正例率和假正例率之间的面积,其范围在0到1之间。
- PR曲线下的面积(AUC-PR)被定义为精确率和召回率之间的面积,其范围也在0到1之间。
-
应用场景:
ROC曲线适用于需要平衡正类别和负类别的问题,比如异常检测、欺诈检测等。 PR曲线适用于关注于正类别的问题,特别是当正类别样本数量较少或者数据不平衡时,PR曲线更能反映模型的性能。 总的来说,ROC曲线和PR曲线都是重要的模型评估工具,在不同的应用场景下具有各自的优势和适用性。选择使用哪种曲线取决于具体的问题背景、数据分布以及评估指标的重要性。
四.绘制ROC曲线和PR曲线
导入所需要的包
from distutils.log import error
import matplotlib
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn. model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import roc_curve
from sklearn.linear_model import LogisticRegression
加载数据集,进行训练,这里使用的是经典用于二分类任务的数据集, 随机森林分类器
# 生成示例数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练随机森林分类器
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
# 预测概率值
y_score = clf.predict_proba(X_test)[:, 1]
计算ROC曲线和PR曲线
# 计算ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
# 计算PR曲线
precision, recall, _ = precision_recall_curve(y_test, y_score)
average_precision = average_precision_score(y_test, y_score)
绘制ROC曲线和PR曲线
# 绘制ROC曲线和PR曲线
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %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('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.subplot(1, 2, 2)
plt.plot(recall, precision, color='blue', lw=2, label='Precision-Recall curve (area = %0.2f)' % average_precision)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc="lower left")
plt.tight_layout()
plt.show()
运行结果如下:
ROC曲线
PR曲线