【机器学习】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 曲线更关注模型在正例上的预测能力,尤其适用于不平衡数据集。通过理解和绘制这两种曲线,我们可以更全面地了解模型的优缺点,并为模型选择和调优提供有力的支持。在实际应用中,应根据具体的问题和数据的特点选择合适的评估指标和可视化方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python高阶函数-map

map() 是 Python 内置的一个高阶函数&#xff0c;它接收一个函数和一个可迭代对象作为参数&#xff0c;将函数依次作用在可迭代对象的每个元素上&#xff0c;并返回一个迭代器&#xff08;Python 3.x 中&#xff09;。 基本语法 map(function, iterable, ...)function: 应用于…

上海餐饮市场数据分析与可视化

上海作为中国的经济中心和国际化大都市,其餐饮市场具有高度的多样性和竞争性。随着消费者需求的不断变化,餐饮行业的从业者和投资者需要深入了解市场现状和趋势,以便制定更有效的商业策略。本文将通过数据分析和可视化技术,深入探讨上海餐饮市场的现状和趋势,为餐饮从业者…

MySQL基础 [五] - 表的增删查改

目录 Create&#xff08;insert&#xff09; Retrieve&#xff08;select&#xff09; where条件 ​编辑 NULL的查询 结果排序(order by) 筛选分页结果 (limit) Update Delete 删除表 截断表&#xff08;truncate&#xff09; 插入查询结果&#xff08;insertselect&…

SQL:Primary Key(主键)和Foreign Key(外键)

目录 1. Key&#xff08;键&#xff09; 2. Index&#xff08;索引&#xff09; 3.Key和Index的区别 4. Primary Key&#xff08;主键&#xff09; 5. Foreign Key&#xff08;外键&#xff09; 6.主键和外键的关系 温馨提示&#xff1a; 闪电按钮不同的执行功能 首先&…

2025年- H1-Lc109-160. 相交列表--java版

1.题目描述 2.思路 “双指针切换链表头” 思路一&#xff1a;双指针路径对齐 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 让两个指针走相同的总路径长度&#xff01; 设&#xff1a; 链表 A 独有部分长度是 lenA 链表 B …

PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例

1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…

基础算法篇(4)(蓝桥杯常考点)—数据结构(进阶)

前言 这期将会讲到基础算法篇里面的数据结构&#xff08;进阶&#xff09;&#xff0c;主要包括单调栈&#xff0c;单调队列&#xff0c;并查集&#xff0c;扩展域并查集&#xff0c;带权并查集&#xff0c;字符串哈希&#xff0c;Trie树。 数据结构(进阶&#xff09;正文 单…

【AI学习】初步了解Gradio

Gradio 是一个开源的 Python 库&#xff0c;专注于快速构建交互式 Web 界面&#xff0c;特别适用于机器学习模型、数据科学项目或任意 Python 函数的演示与部署。它通过极简的代码实现前后端一体化&#xff0c;无需前端开发经验即可创建功能丰富的应用。以下是 Gradio 的核心特…

Overleaf 论文提交 Arxiv

Contents References 清除 Overleaf 中所有编译 error&#xff0c;并且保证 main.tex 文件在 project 最上层参考文件 .bib 转 .bbl. project 编译成功后可以在 Overleaf 的 Recompile 按钮右侧找到 “Logs and output files”&#xff0c;点进去之后右下角可以点开 “Other lo…

【Android Audio】Parameter Framework - pfw

Parameter Framework - Android AudioPolicy Engine 使用 libengineconfigurable.so 来取缔默认安卓音频引擎 libenginedefault.so&#xff0c;因为默认安卓音频引擎是通过代码来决定策略&#xff0c;然而 libengineconfigurable 采用读取pfw类型的文件来实现音频策略配置。 …

服务器虚拟化技术深度解析:医药流通行业IT架构优化指南

一、服务器虚拟化的定义与原理 &#xff08;一&#xff09;技术定义&#xff1a;从物理到虚拟的资源重构 服务器虚拟化是通过软件层&#xff08;Hypervisor&#xff09;将物理服务器的CPU、内存、存储、网络等硬件资源抽象为逻辑资源池&#xff0c;分割成多个相互隔离的虚拟机…

babel-runtime 如何缩小打包体积

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

剑指Offer(数据结构与算法面试题精讲)C++版——day7

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day7 题目一&#xff1a;最多删除一个字符得到回文题目二&#xff1a;回文子字符串的个数题目三&#xff1a;删除倒数第k个节点 题目一&#xff1a;最多删除一个字符得到回文 这里我们可以在经典的字符串回文…

2025年常见渗透测试面试题(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 常见面试题 一、渗透测试经历与技术复盘 二、高频漏洞类型与攻防体系 三、渗透工具链与技术特性 四、…

大数据与人工智能之大数据架构(Hadoop、Spark、Flink)

一、核心特性与架构设计 1. Hadoop&#xff1a;分布式批处理的基石 核心组件&#xff1a; HDFS&#xff1a;分布式文件系统&#xff0c;支持大规模数据存储。MapReduce&#xff1a;基于“分而治之”的批处理模型&#xff0c;适合离线分析。 架构特点&#xff1a; 批处理主导&…

从IoT到AIoT:智能边界的拓展与AI未来趋势预测

文章目录 引言&#xff1a;从连接万物到感知万物1. AIoT的本质&#xff1a;将智能嵌入万物2. AIoT的推动力量与挑战2.1 推动力量2.2 关键挑战 3. 五大AIoT未来趋势预测趋势一&#xff1a;边缘智能将成为主流架构趋势二&#xff1a;AI模型将向自适应与多任务演进趋势三&#xff…

从本地新建文件夹到拉取远程仓库 dev 分支的完整步骤

《从本地新建文件夹到拉取远程仓库 dev 分支的完整步骤》 下面为你详细介绍从本地新建文件夹开始&#xff0c;将远程仓库的 dev 分支拉取到本地的具体步骤&#xff1a; 1. 创建新文件夹 在本地电脑上新建一个文件夹&#xff0c;作为存放项目代码的目录。你可以通过图形界面操…

python/pytorch杂聊

Dataset 是否需要自己定义&#xff1a;如果你使用的数据集不是 PyTorch 提供的标准数据集&#xff08;如 MNIST、CIFAR-10 等&#xff09;&#xff0c;那么你需要继承 torch.utils.data.Dataset 类并实现两个方法&#xff1a;__len__() 和 __getitem__()。__len__() 应该返回数…

PHP 安全 E-mail

PHP 安全 E-mail 引言 随着互联网的普及和电子商务的发展,电子邮件成为了人们日常生活中不可或缺的通信工具。PHP作为一种广泛使用的服务器端脚本语言,也经常被用于发送和接收电子邮件。然而,在PHP中处理电子邮件时,安全性问题不容忽视。本文将深入探讨PHP安全发送电子邮…

【夜话系列】DelayQueue延迟队列(下):实战应用与面试精讲

🔥 本文是DelayQueue系列的下篇,聚焦实战应用场景和性能优化。通过多个真实案例,带你掌握DelayQueue在项目中的最佳实践和性能调优技巧。 📚 系列专栏推荐: JAVA集合专栏 【夜话集】JVM知识专栏数据库sql理论与实战小游戏开发文章目录 一、DelayQueue实战应用1.1 订单超…