当前位置: 首页 > news >正文

【机器学习】ROC 曲线与 PR 曲线

目录

一、混淆矩阵:分类评估的基础

二. ROC 曲线 (Receiver Operating Characteristic Curve)

三. PR 曲线 (Precision-Recall Curve)

3.1 核心思想

4. 何时使用 ROC 曲线和 PR 曲线?

实验结果

6. 总结


    在机器学习的分类任务中,我们训练模型的目标是准确地区分不同的类别。然而,模型的性能并非总是完美,它可能会犯一些错误。为了更好地评估和比较不同分类模型的性能,我们需要一些有效的评估指标和可视化工具。其中,ROC (Receiver Operating Characteristic) 曲线PR (Precision-Recall) 曲线 就是两种非常重要的工具,尤其是在处理不平衡数据集时。

本文将深入探讨 ROC 曲线和 PR 曲线的概念、计算方法以及如何使用 Python 中的 scikit-learn 库来绘制它们。

一、混淆矩阵:分类评估的基础

在理解 ROC 和 PR 曲线之前,我们需要先了解混淆矩阵 (Confusion Matrix)。对于一个二分类问题,混淆矩阵是一个 2x2 的表格,它总结了模型预测结果与真实标签之间的关系:

预测为正例 (Positive)预测为负例 (Negative)
真实为正例 (Positive)

真阳性

(True Positive, TP)

假阴性

(False Negative, FN)

真实为负例 (Negative)

假阳性

(False Positive, FP)

真阴性

(True Negative, TN)

基于混淆矩阵,我们可以计算出一些基本的评估指标:

  • 准确率 (Accuracy): \frac{TP+TN}{TP+TN+FP+FN}​,表示模型预测正确的样本比例。
  • 精确率 (Precision): \frac{TP}{TP+FP},表示在所有预测为正例的样本中,真正例的比例。
  • 召回率 (Recall) (也称为灵敏度或真正例率):\frac{ TP}{ TP+FN}​,表示在所有真实为正例的样本中,被模型正确预测为正例的比例。
  • 假阳性率 (False Positive Rate, FPR):\frac{ FP}{ FP+TN}​,表示在所有真实为负例的样本中,被模型错误预测为正例的比例。
  • 真阳性率 (True Positive Rate, TPR) (与召回率相同): \frac{TP}{TP+FN}

二. ROC 曲线 (Receiver Operating Characteristic Curve)

ROC 曲线是一种以 假阳性率 (FPR) 为横轴,真阳性率 (TPR) 为纵轴绘制的曲线。它展示了在不同的分类阈值下,模型的 TPR 和 FPR 之间的权衡关系。

大多数分类器会输出一个概率值或置信度分数,用于判断样本属于哪个类别。我们可以通过调整这个分类阈值来改变模型的预测结果。例如,如果我们提高阈值,模型会更保守地将样本预测为正例,这通常会降低 FPR,但也可能降低 TPR。ROC 曲线则将所有可能的阈值对应的 (FPR, TPR) 点连接起来,形成一条曲线。

AUC (Area Under the ROC Curve)

AUC 是 ROC 曲线下的面积,它是一个介于 0 和 1 之间的值。AUC 值越大,表示模型的整体性能越好。

  • AUC = 1: 完美分类器。
  • AUC = 0.5: 模型的性能与随机猜测相当。
  • AUC < 0.5: 模型的性能比随机猜测还要差(通常表示模型学习的方向错误,可以考虑反转预测结果)。

三. PR 曲线 (Precision-Recall Curve)

PR 曲线是一种以 召回率 (Recall) 为横轴,精确率 (Precision) 为纵轴绘制的曲线。它展示了在不同的分类阈值下,模型的精确率和召回率之间的权衡关系。

3.1 核心思想

与 ROC 曲线类似,PR 曲线也是通过调整分类阈值来观察模型性能的变化。PR 曲线更关注正例的预测情况。

Average Precision (AP)

AP 是 PR 曲线下的面积,它衡量了在不同召回率水平上的平均精确率。AP 值越高,表示模型的性能越好。

4. 何时使用 ROC 曲线和 PR 曲线?

  • ROC 曲线: 通常在正负样本比例相对平衡的情况下使用。它对类别不平衡问题不太敏感。ROC 曲线关注的是模型区分正负样本的能力。

  • PR 曲线: 更适用于正负样本比例非常不平衡的情况下。当正例非常稀少时,即使模型预测了一些假阳性,其假阳性率 (FPR) 可能仍然很低,导致 ROC 曲线看起来不错。然而,此时的精确率 (Precision) 可能会很低,PR 曲线能够更敏感地反映出这个问题。PR 曲线更关注模型在正例上的预测能力。

5. Python 代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score

# 随机生成一个二分类数据集
features, labels = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 将数据集划分为训练集和测试集
features_train, features_test, labels_train, labels_test = train_test_split(features, labels, test_size=0.3, random_state=42)

# 初始化并训练随机森林分类器
model = RandomForestClassifier(random_state=42)
model.fit(features_train, labels_train)

# 获取模型在测试集上预测为正类的概率
probabilities = model.predict_proba(features_test)[:, 1]  # 获取第二列,即正类的概率

# 计算 ROC 曲线的 FPR、TPR 和阈值
false_positive_rate, true_positive_rate, thresholds_roc = roc_curve(labels_test, probabilities)
roc_auc_score = auc(false_positive_rate, true_positive_rate)

# 计算 PR 曲线的精确率、召回率和阈值
precision_values, recall_values, thresholds_pr = precision_recall_curve(labels_test, probabilities)
average_precision = average_precision_score(labels_test, probabilities)

# 绘制 ROC 曲线
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(false_positive_rate, true_positive_rate, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc_score:.2f})')
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 (FPR)')
plt.ylabel('True Positive Rate (TPR) / Recall')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")

# 绘制 PR 曲线
plt.subplot(1, 2, 2)
plt.plot(recall_values, precision_values, color='blue', lw=2, label=f'PR curve (AP = {average_precision:.2f})')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall (PR) Curve')
plt.legend(loc="best")

# 显示绘制的图像
plt.tight_layout()
plt.show()

实验结果

ROC曲线解读:

  • 左下角 (0, 0): 表示模型将所有样本都预测为负例。
  • 右上角 (1, 1): 表示模型将所有样本都预测为正例。
  • 左上角 (0, 1): 这是理想的情况,表示模型在不产生任何假阳性的情况下,能够识别出所有的真实正例。
  • 对角线 (y=x): 表示模型的性能与随机猜测相当。
  • 曲线越靠近左上角,模型的性能越好。

PR曲线解读:

  • 右上角 (1, 1): 这是理想的情况,表示模型在识别出所有正例的同时,预测的正例都是正确的。
  • 靠近右上角的曲线表示模型性能越好。
  • 曲线下的面积 (Average Precision, AP) 可以作为衡量 PR 曲线性能的指标。

6. 总结

ROC 曲线和 PR 曲线是评估二分类模型性能的强大工具。ROC 曲线关注模型区分正负样本的能力,而 PR 曲线更关注模型在正例上的预测能力,尤其适用于不平衡数据集。通过理解和绘制这两种曲线,我们可以更全面地了解模型的优缺点,并为模型选择和调优提供有力的支持。在实际应用中,应根据具体的问题和数据的特点选择合适的评估指标和可视化方法。

相关文章:

  • Python 3.13.2 安装教程(附安装包)轻松开启编程之旅
  • c# 系列pdf转图片 各种处理2--net3.1到net8
  • OpenCV鼠标事件
  • TDengine 与 taosAdapter 的结合(二)
  • Elasticsearch8.x集成SpringBoot3.x
  • AI Agent开发大全第十九课-神经网络入门 (Tensorflow)
  • Oracle数据库数据编程SQL<8.1 文本编辑器Notepad++和UltraEdit(UE)对比>
  • UE5 蓝图里的反射
  • 进程内存分布--之smaps呈现memory-layout.cpp内存分布
  • RK3568下GPIO模拟串口
  • 详解数据结构线性表 c++实现
  • 算法进阶指南 货仓选址
  • redis导入成功,缺不显示数据
  • 华为ensp中路由器IPSec VPN原理及配置命令(超详解)
  • Python爬虫教程013:使用CrawlSpider爬取读书网数据并保存到mysql数据库
  • Windows 系统下用 VMware 安装 CentOS 7 虚拟机超详细教程(包含VMware和镜像安装包)
  • 基于 springboot 的在线考试系统
  • React中的跨组件通信
  • 助力三农服务平台设计与实现
  • NVR接入录像回放平台EasyCVR用智能分析高新技术赋能,打造营业厅人员/物品安全的堡垒
  • 19世纪的“表征之场”:弗洛伊德的精神分析椅
  • 国家统计局:下阶段要继续发挥宏观政策作用,促进价格合理回升
  • 上海明天短暂恢复晴热最高32℃,一大波雨水在候场
  • 玉林一河段出现十年最大洪水,一村民被冲走遇难
  • 天问二号探测器顺利转入发射区
  • 国内规模最大女子赛艇官方赛事在沪启航,中外41支队伍逐浪