机器学习-PR和ROC曲线

引言

分类问题在机器学习中扮演着至关重要的角色,其性能评估是我们不可或缺的任务之一。尽管准确率(Accuracy)是最常用的评估指标之一,但在某些情况下,它可能会带来误导性的结果,特别是在处理不平衡数据集时。举例来说,一个总是预测“负例”的模型可能会因高准确率而被视为优秀,然而,这并不代表它在真实任务中的实用性。因此,我们需要深入研究其他性能指标,其中Precision-Recall(PR)曲线和Receiver Operating Characteristic(ROC)曲线就是两个极具价值的工具。

混淆矩阵

混淆矩阵是在分类问题中用于评估模型性能的一种表格形式。它以模型的预测结果与真实标签之间的关系为基础,提供了对分类器性能的详细洞察。混淆矩阵通常是一个二维矩阵,其中行代表真实标签,列代表模型的预测结果。在一个典型的二分类问题中,混淆矩阵包括四个重要的元素:

真正例(True Positive, TP):模型正确地将正例样本预测为正例。
真负例(True Negative, TN):模型正确地将负例样本预测为负例。
假正例(False Positive, FP):模型错误地将负例样本预测为正例(误报)。
假负例(False Negative, FN):模型错误地将正例样本预测为负例(漏报)。

PR曲线

PR曲线是用于评估二分类模型性能的重要工具,特别是在处理不平衡数据集或关注正例类别的情况下。PR曲线以精确率(Precision)和召回率(Recall)为两个关键指标,展示了模型在不同阈值下的表现。

  1. 精确率(Precision):精确率是指模型正确预测为正例的样本中,实际为正例的比例。它衡量了模型的预测中有多少是正确的。

    Precision =TP/(TP + FP)

    其中,TP为真正例数量,FP为假正例数量。

  2. 召回率(Recall):召回率是指实际为正例的样本中,模型正确预测为正例的比例。它衡量了模型是否能够识别出所有的正例。

    Recall = TP/(TP + FN)

    其中,TP为真正例数量,FN为假负例数量。

PR曲线通过在不同的分类阈值下计算精确率和召回率,并将其绘制在二维坐标系中,展示了模型在整个预测范围内的性能表现。通常情况下,PR曲线越靠近右上角,表示模型的性能越好,因为这意味着在保持高精确率的同时,也能获得较高的召回率。

在实际应用中,PR曲线可以帮助我们直观地比较不同模型的性能,特别是在面对不平衡数据集时。另外,PR曲线下面积(Area Under the Curve, AUC-PR)也是一个常用的性能指标,它提供了对整个曲线的综合性评估,数值越高表示模型性能越好。

ROC曲线

ROC曲线是一种用于评估二分类模型性能的工具,它以真正例率(True Positive Rate, TPR)作为纵轴,以假正例率(False Positive Rate, FPR)作为横轴,展示了在不同阈值下的模型性能。


·TPR是指在实际为正例的样本中,模型正确预测为正例的比例,计算公式为 TPR =TP/(TP + FN),其中TP为真正例数量,FN为假负例数量。
·FPR是指在实际为负例的样本中,模型错误预测为正例的比例,计算公式为 FPR =FP/(FP + TN),其中FP为假正例数量,TN为真负例数量。

AUC-ROC:

AUC(Area Under the Curve)是ROC曲线下面积的计算结果,通常用于综合评估模型性能。
AUC的取值范围在0到1之间,越接近1表示模型性能越好,越接近0.5表示模型性能越差(类似于随机猜测)。

绘制PR和ROC曲线

代码实现:

1.首先,我们使用make_classification函数生成一个二分类的合成数据集:

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


# 生成二分类合成数据集
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.2, random_state=42)

2.接着定义一个knn分类器,并进行训练

# 训练K近邻模型
knn = KNeighborsClassifier(n_neighbors=2)
knn.fit(X_train, y_train)

3.绘制PR和ROC曲线

# 获取测试集上的预测结果
y_scores = knn.predict_proba(X_test)[:, 1]

# 计算PR曲线和AUC
precision, recall, _ = precision_recall_curve(y_test, y_scores)
pr_auc = auc(recall, precision)

# 计算ROC曲线和AUC
fpr, tpr, _ = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)

# 绘制PR曲线
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(recall, precision, marker='.')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title(f'PR Curve (AUC = {pr_auc:.2f})')

# 绘制ROC曲线
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, marker='.')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title(f'ROC Curve (AUC = {roc_auc:.2f})')

plt.tight_layout()
plt.show()

4.结果展示

5.小结

在机器学习中,对分类模型性能的评估至关重要。尽管准确率是最常用的评估指标之一,但在处理不平衡数据集或关注正例类别时,PR(Precision-Recall)曲线和ROC(Receiver Operating Characteristic)曲线提供了更全面的视角。

PR曲线以精确率(Precision)和召回率(Recall)为基准,展示了模型在不同阈值下的性能表现。通过在二维坐标系中绘制精确率和召回率,PR曲线可以直观地显示模型的性能。面积下面积(AUC-PR)提供了对整个曲线的综合评估,数值越高表示模型性能越好。

而ROC曲线则以真正例率(True Positive Rate)和假正例率(False Positive Rate)为基准,展示了模型在不同阈值下的性能。ROC曲线的AUC值(AUC-ROC)用于综合评估模型性能,数值越接近1表示模型性能越好。

通过绘制PR和ROC曲线,并计算对应的AUC值,我们可以更全面地评估分类模型的性能。这种综合评估有助于我们在实际应用中选择最合适的模型,并更好地理解模型在不同阈值下的表现,特别适用于处理不平衡数据集或关注特定类别的情况。 PR和ROC曲线为我们提供了更深入的洞察,帮助我们做出更明智的决策,提高模型的实用性和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值