机器学习实战模型评估——ROC曲线与PR曲线(K-近邻方法)
ROC曲线与PR曲线
一、ROC曲线与PR曲线简介
(1)ROC曲线
1.ROC曲线的介绍
在信号检测理论中,接收者操作特征曲线,或者叫ROC曲线(英语:Receiver operating characteristic curve),是一种坐标图式的分析工具,用于选择最佳的信号侦测模型、舍弃次佳的模型或者在同一模型中设置最佳阈值。
ROC曲线首先是由二战中的电子工程师和雷达工程师发明的,用来侦测战场上的敌军载具(飞机、船舰),也就是信号检测理论。之后很快就被引入了心理学来进行信号的知觉检测。数十年来,ROC分析被用于医学、无线电、生物学、犯罪心理学领域中,而且最近在机器学习(machine learning)和数据挖掘(data mining)领域也得到了很好的发展。
2.ROC曲线的作用
ROC曲线的绘制过程是在不同的分类阈值下计算真阳性率和伪阳性率,并将它们绘制成曲线。曲线下面积即为AUC(Area Under the Curve),用于衡量分类器的性能,AUC值越接近1,分类器性能越好。ROC曲线可以帮助选择最佳的分类阈值。根据具体应用场景的需求,可以通过观察曲线上的点来权衡真阳性率和伪阳性率,并选择最适合的阈值。
3.ROC曲线的二维坐标轴
ROC曲线所在的二维坐标轴空间的横轴表示伪阳性率(False Positive Rate,FPR),纵轴表示真阳性率(True Positive Rate,TPR):
含义:TP除以第一列,即预测为1实际为1的样本在所有真实1类别中的占比。
含义:FP除以第二列,即预测为1实际为0的样本在所有真实0类别中的占比。
(2)PR曲线
1.PR曲线的介绍
PR曲线(Precision-Recall curve)是另一种评估分类模型性能的工具,通常用于处理不平衡数据集或关注于正类别(少数类别)的分类问题。
2.PR曲线的作用
通过比较不同模型在PR曲线下的面积(AUC-PR),可以帮助选择最佳的分类模型。AUC-PR 值越高,表示模型在不同召回率下的平均精确率越高,因此能够更好地区分正类别和负类别。
3.PR曲线的二维坐标轴
PR曲线中的P代表的是Precision(精准率),R代表的是Recall(召回率),其代表的是精准率与召回率的关系,一般情况下,Precision设置为纵坐标,将Recall设置为横坐标。
含义:TP除以第一列,即预测为1实际为1的样本在所有真实为1类别中的占比。
含义:FP除以第一行,即预测为1实际为1的样本在所有预测为1类别中的占比。
(3)ROC曲线与PR曲线的关系
ROC曲线与PR曲线是一一对应的,如果曲线在ROC空间中占优势,那么它在PR空间中也同样占优势。
大家可以通过观看下面的视频来更加直观的了解ROC曲线与PR曲线的关系。【小萌五分钟】机器学习 | 模型评估: ROC曲线与PR曲线(一): ROC曲线与PR曲线的关系
(4)ROC曲线和PR曲线的适用场景
如果想兼顾正例与负例,则选用ROC曲线;如果在类别不平衡中,或者更看重正例的场景中比如推荐信息检索,则选用PR曲线。
如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合。
同样的,大家可以通过观看下面的视频来更加直观的了解ROC曲线与PR曲线的适用场景。【小萌五分钟】机器学习 | 模型评估: ROC曲线与PR曲线(二): ROC曲线与PR曲线的适用场景
二、ROC与PR曲线的实例
我们将使用 K 近邻算法对生成的分类数据集进行训练,并利用 ROC 曲线和 PR 曲线来评估模型的表现。
(1)导入库
import matplotlib.pyplot as plt
from matplotlib import rcParams
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, precision_recall_curve, auc, average_precision_score
matplotlib.pyplot:用于绘制图形。
make_classification:用于生成一个分类数据集。
train_test_split:用于将数据集分割成训练集和测试集。
KNeighborsClassifier:用于训练 K 近邻模型。
roc_curve 和 precision_recall_curve:用于计算 ROC 曲线和 PR 曲线的坐标。
auc 和 average_precision_score:分别用于计算 AUC(曲线下面积)和 PR 曲线下的平均精确度。
(2)设置全局字体
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False # 解决负号显示问题
(3)生成数据集
我们使用 make_classification 生成了一个具有 1000 个样本和 10 个特征的二分类数据集,并将其划分为训练集和测试集。
X, y = make_classification(n_samples=1000, n_features=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
(4)训练 K 近邻分类器并预测概率
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(X_train, y_train)
y_score = clf.predict_proba(X_test)[:, 1]
因为我们使用的是二分类问题,predict_proba 返回的是每个样本属于两个类别的概率,我们只提取正类的概率。
(5)计算 ROC 和 PR 曲线
fpr, tpr, _ = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
precision, recall, _ = precision_recall_curve(y_test, y_score)
average_precision = average_precision_score(y_test, y_score)
计算 ROC 曲线和 PR 曲线的坐标,并计算了它们的 AUC(曲线下面积)
(6)绘制 ROC 和 PR 曲线
plt.figure(figsize=(10, 5))
# 画ROC曲线
plt.subplot(1, 2, 1)
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC 曲线 (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('ROC 曲线')
plt.legend(loc="lower right")
# 画PR曲线
plt.subplot(1, 2, 2)
plt.plot(recall, precision, color='blue', lw=2, label=f'PR 曲线 (AP = {average_precision:.2f})')
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.xlabel('召回率')
plt.ylabel('精确率')
plt.title('PR曲线')
plt.legend(loc="lower left")
plt.tight_layout()
plt.show()
通过这段代码,我们在同一画布上分别绘制了 ROC 曲线和 PR 曲线,能够直观地评估模型在不同阈值下的性能。
三、结果分析
运行结果图:

-
ROC 曲线:ROC 曲线展示了假阳性率与真阳性率之间的关系。理想情况下,ROC
曲线应尽量接近左上角,这意味着高真阳性率和低假阳性率。AUC 值越接近 1,模型的性能越好。 -
PR 曲线:PR 曲线展示了精确率与召回率的关系。理想情况下,PR
曲线应尽量接近右上角,意味着在保持高召回率的同时,也能保持较高的精确率。平均精确度(AP)越大,模型表现越好。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐






所有评论(0)