【机器学习】ROC曲线

【机器学习】ROC曲线

  • 1、ROC曲线简介
  • 2、ROC曲线和AUC值
    • 2.1 ROC曲线
    • 2.2 AUC值
  • 3、实验内容
    • 3.1 准备数据集
    • 3.2 特征提取
    • 3.3 数据集划分
    • 3.4 模型训练与预测
    • 3.5 计算和绘制ROC曲线
    • 3.6 绘制混淆矩阵
    • 3.7 三分类混淆矩阵
  • 4 源代码
    • 4.1 实现ROC二分类
    • 4.2 三分类混淆例子


1、ROC曲线简介

       接受者操作特性曲线(receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。在二战期间,雷达系统被广泛应用于检测敌方飞机。为了优化雷达系统的性能,研究人员需要找到一种评估雷达系统的性能的方法。他们引入了信号检测理论中的TPR(真阳性率)和FPR(假阳性率)的概念。TPR表示在所有实际存在目标的情况下,系统正确检测到目标的比例。FPR则表示在所有实际不存在目标的情况下,系统错误地报告目标存在的比例。
       随着计算机技术的进步,ROC曲线在机器学习和模式识别领域得到了广泛应用。它成为了评估分类器性能和选择最佳阈值的重要工具。历史上,统计学家和研究人员对于ROC曲线和AUC的研究也不断深入。他们提出了数学模型和统计方法来解释和推导ROC曲线的性质,并在医学诊断、生物信息学、金融风险评估等领域得到了广泛应用。


2、ROC曲线和AUC值

2.1 ROC曲线

       以鸢尾花的两个种类为标准的分类就是一个二分类问题。判断预测的结果有下面四种结局,见表。

判断结果和实际结果
真阳性(True Positive, TP)判断为Setosa,实际上确实是Setosa
伪阳性(False Positive, FP)判断为Setosa,但实际上是Versicolor
真阴性(True Negative, TN)判断为Versicolor,实际上确实是Versicolor
伪阴性(False Negative, FN)判断为Versicolor,但实际上是Setosa

相关术语
阳性 (P, Positive) 正样本。
阴性 (N, Negative) 负样本。
真阳性 (TP, True Positive) 表明实际是正样本预测成正样本的样本。
真阴性 (TN, True Negative) 表明实际是负样本预测成负样本的样本。
伪阳性 (FP, False Positive) 表明实际是负样本预测成正样本的样本。
伪阴性 (FN, False Negative) 表明实际是正样本预测成负样本的样本。
伪阳性率(False Positive Rate,FPR) 在所有实际为阴性的样本中,被错误地判断为阳性之比率。又称:错误命中率,假警报率 (false alarm rate)。计算公式为:FPR = FP / N = FP / (FP + TN)
真阳性率(True Positive Rate,TPR) 在所有实际为阳性的样本中,被正确地判断为阳性之比率。又称:命中率 (hit rate)、敏感度(sensitivity)。计算公式为:TPR = TP / P = TP / (TP + FN)
       ROC曲线提供了评估分类模型性能的一个直观可视化工具,可以帮助我们了解模型在不同决策阈值下的表现,并根据需求调整模型的分类策略。


2.2 AUC值

       AUC(Area Under the Curve)值是ROC曲线下的面积,它用于评估分类器(或模型)在不同阈值下的性能。AUC值通常被用作衡量二分类问题中分类器的准确性的标准。在绘制ROC曲线时,横轴代表False Positive Rate(FPR),纵轴代表True Positive Rate(TPR)。AUC值表示了ROC曲线下的面积大小,范围从0到1之间,数值越大表示分类器性能越好。
       当AUC值接近1时,说明分类器能够很好地区分正样本和负样本,具有高准确性。相反,AUC值接近0.5时,说明分类器的性能与随机猜测相当;而AUC值小于0.5时,则表示分类器的性能不佳,实际上与随机猜测相反。
       AUC是一个用来评估分类模型性能的常见指标,优点是:适用于正负样本分布不一致的场景;对于分类器性能的评价,不限定单一的分类阈值。


3、实验内容

3.1 准备数据集

       首先使用 load_iris() 函数加载鸢尾花数据集,并将特征矩阵存储在 X 中,分类值存储在 y 中。
       数据集里面的特征依次为花萼长、宽和花瓣长、宽; 而类别标签为0,1,2分别表示山鸢尾(setosa),变色鸢尾(versicolor)和维吉尼亚鸢尾(virginica)
       然后,通过索引操作从 X 中提取了前5条数据,即 X[0:5],以及第二个品种对应的前5条数据: X[50:55]。使用 np.concatenate 函数将这两组数据合并为一个新的特征矩阵 X1。接下来,同样的操作也应用于目标值 y,提取了相应的标签并存储在 y1 中。


3.2 特征提取

       将包含鸢尾花数据集的特征和目标变量按照类别为0和1进行筛选并分离。选择类别为0和1的样本,并将其存储在一个名为iris_new的新数据集中。这是为了将原始的鸢尾花数据集转换为一个二分类任务的数据集。通过这段代码的处理,我们得到了一个包含特征变量X和目标变量Y的数据集,可以用于二分类任务的建模和训练。


3.3 数据集划分

       将特征变量X和目标变量Y按照指定的比例划分为训练集和测试集,并将划分后的结果分别赋值给Xtrain、Xtest、Ytrain和Ytest。

参数解释:

X:特征变量的数据集
Y:目标变量的数据集
test_size:测试集所占的比例,这里设置为0.3,表示测试集占总数据集的30%
random_state:随机种子,用于保证每次划分结果的一致性,设置为420

3.4 模型训练与预测

       创建了一个SVM分类器对象clf,使用线性核函数(kernel=‘linear’)进行分类。然后使用训练集Xtrain和Ytrain对分类器进行训练。接着使用测试集Xtest和Ytest对训练好的模型进行评估,并输出准确率(accuracy)。最后对测试集Xtest进行预测,将预测结果存储在result中。


3.5 计算和绘制ROC曲线

       使用真实标签Ytest和预测结果result计算了真阳性率(True Positive Rate,TPR)、假阳性率(False Positive Rate,FPR)以及阈值(thresholds),然后通过计算得到了AUC值(Area Under Curve,曲线下面积)并将其打印输出。使用plt.plot()函数绘制了ROC曲线,其中真阳性率(TPR)作为纵轴,假阳性率(FPR)作为横轴,并在图例中显示了AUC值。通过plt.plot([0, 1], [0, 1], color=‘navy’, lw=2, linestyle=‘–’)绘制了随机猜测曲线。其他代码用于设置横轴纵轴的取值范围、标签、标题、图例、网格线,并最后显示图表。绘制出的图如图1所示:

在这里插入图片描述


3.6 绘制混淆矩阵

       使用ConfusionMatrixDisplay.from_predictions()函数根据预测结果result和真实结果Ytest绘制了混淆矩阵,设置了颜色条、标签、颜色映射等。其他代码用于设置标题,并最后显示图表。绘制出的图如图2所示:

在这里插入图片描述


3.7 三分类混淆矩阵

       计算和绘制混淆矩阵,并使用seaborn库和matplotlib库进行可视化。首先,我们导入了seaborn、confusion_matrix和matplotlib.pyplot模块。然后,我们设置了seaborn的主题样式。接下来,创建了一个图表对象f和一个子图对象ax。定义了真实标签y_true和预测标签y_pred。使用confusion_matrix函数计算了混淆矩阵C2,并通过指定labels参数设置了类别标签。打印了计算得到的混淆矩阵。使用sns.heatmap函数绘制了热力图,将混淆矩阵中的每个元素以颜色的形式显示出来,并在图表上方加上了注解,注解内容为每个元素的数值。通过plt.title、plt.xlabel和plt.ylabel设置了图表的标题、x轴标签和y轴标签。最后,使用plt.show显示了图表。绘制出的图如图3所示:

在这里插入图片描述


4 源代码

4.1 实现ROC二分类

# 导入模块
from sklearn.datasets import load_iris  # 导入鸢尾花数据集
from sklearn.svm import SVC  # 导入支持向量机分类器
import pandas as pd  # 导入pandas库,用于数据处理和分析
import matplotlib.pyplot as plt  # 导入matplotlib库,用于数据可视化
import numpy as np  # 导入numpy库,用于数值计算
from sklearn.metrics import classification_report, roc_auc_score, confusion_matrix, accuracy_score, roc_curve, auc, \ConfusionMatrixDisplay  # 导入一些评估指标和绘图函数
from sklearn.model_selection import train_test_split  # 导入数据集划分函数# 加载数据集
iris = load_iris()  # 加载鸢尾花数据集
iris_data = pd.DataFrame(iris.data, columns=iris.feature_names)  # 将特征数据转换为DataFrame格式
iris_data['class'] = iris.target  # 添加目标变量到DataFrame中# 数据预处理
iris_new = iris_data[iris_data['class'] < 2]  # 选择类别为0和1的样本作为二分类任务的数据集
X = iris_new.iloc[:, :-1]  # 特征变量
Y = iris_new.iloc[:, -1]  # 目标变量# 数据集划分
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, test_size=0.3, random_state=420)  # 划分训练集和测试集# 模型训练与预测
clf = SVC(C=1, gamma='auto', kernel='linear')  # 创建SVM分类器对象
clf.fit(Xtrain, Ytrain)  # 使用训练集进行模型训练
clf.score(Xtest, Ytest)  # 使用测试集对模型进行评估,输出准确率
result = clf.predict(Xtest)  # 对测试集进行预测
print(result)# 计算ROC曲线的参数
fpr, tpr, thresholds = roc_curve(Ytest, result)  # 计算真阳性率、假阳性率和阈值
roc_auc = auc(fpr, tpr)  # 计算AUC值
print(roc_auc)# 绘制ROC曲线
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)  # 绘制ROC曲线
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')  # 绘制随机猜测曲线
plt.xlim([0.0, 1.0])  # 设置x轴的取值范围
plt.ylim([0.0, 1.05])  # 设置y轴的取值范围
plt.xlabel('False Positive Rate')  # 设置x轴标签
plt.ylabel('True Positive Rate')  # 设置y轴标签
plt.title('Receiver operating characteristic example')  # 设置图表标题
plt.legend(loc="lower right")  # 添加图例
plt.grid(color='purple', linestyle='--')  # 添加网格线
plt.show()  # 显示图表# 绘制混淆矩阵
ConfusionMatrixDisplay.from_predictions(Ytest, result, colorbar=True, display_labels=["0", "1"],cmap=plt.cm.Reds)  # 根据预测结果和真实结果绘制混淆矩阵
plt.title("Confusion Matrix")  # 设置图表标题
plt.show()  # 显示图表

4.2 三分类混淆例子

import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as pltsns.set()  # 设置seaborn主题
f, ax = plt.subplots()  # 创建一个图表和子图对象
y_true = [0, 0, 1, 2, 1, 2, 0, 2, 2, 0, 1, 1]  # 真实标签
y_pred = [1, 0, 1, 2, 1, 0, 0, 2, 2, 0, 1, 1]  # 预测标签
C2 = confusion_matrix(y_true, y_pred, labels=[0, 1, 2])  # 计算混淆矩阵
print(C2)  # 打印混淆矩阵sns.heatmap(C2, annot=True, ax=ax)  # 绘制热力图,显示混淆矩阵中的每个元素并在图表上方加注解plt.title("confusion matrix")  # 设置图表标题
plt.xlabel("predict")  # 设置x轴标签
plt.ylabel("true")  # 设置y轴标签
plt.show()  # 显示图表

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 注册表操作

一.操作环境 二.注册表查看 1. 搜索注册表打开 2. 注册表查看 例如我想操作 计算机\HKEY_CURRENT_USER\SOFTWARE\winzq\qwert下的内容 三.代码 1. H文件 #ifndef __REGISTER_H__ #define __REGISTER_H__#include <QString> #include <QSettings> #include <Q…

Kotlin 类和属性(五)

导读大纲 1.1 封装行为和数据: 类和属性1.1.1 将数据与类关联并使其可被访问: 属性1.1.2 计算属性,而不是存储其值: 自定义访问器1.1.3 Kotlin 源代码目录和包 1.1 封装行为和数据: 类和属性 与其他面向对象编程语言一样,Kotlin 也提供类的抽象 Kotlin 在这方面的概念您一定不…

UE学习篇ContentExample解读-----------Blueprint_Overview

文章目录 总览描述批次阅览1.1 Blueprint- Hello World1.2 Blueprint- Components1.3 Blueprint- Variables1.4 Blueprint- ConstructionScript1.5 Blueprint- Event Graph1.6 Blueprint- Simple Math1.7 Blueprint- Flow Control 概念总结致谢&#xff1a; 总览描述 打开关卡后…

Golang | Leetcode Golang题解之第430题扁平化多级双向链表

题目&#xff1a; 题解&#xff1a; func dfs(node *Node) (last *Node) {cur : nodefor cur ! nil {next : cur.Next// 如果有子节点&#xff0c;那么首先处理子节点if cur.Child ! nil {childLast : dfs(cur.Child)next cur.Next// 将 node 与 child 相连cur.Next cur.Chi…

超越sora,最新文生视频CogVideoX-5b模型分享

CogVideoX-5B是由智谱 AI 开源的一款先进的文本到视频生成模型&#xff0c;它是 CogVideoX 系列中的更大尺寸版本&#xff0c;旨在提供更高质量的视频生成效果。 CogVideoX-5B 采用了 3D 因果变分自编码器&#xff08;3D causal VAE&#xff09;技术&#xff0c;通过在空间和时…

【变化检测】基于Superpoint+Lightglue+TinyCD建筑物(LEVIR-CD)变化检测实战及ONNX推理

后面再详细完善内容吧&#xff0c;先丢代码&#xff01; 1 创建文件与输入文件夹 注意&#xff1a;img中包括A期与B期文件夹&#xff0c;图片名要求一致对应。 1.1 运行代码 新建main.py文件&#xff0c;内容如下&#xff1a; import os import cv2 import time import a…

Kotlin while 和 for 循环(九)

导读大纲 1.1 while 和 for 循环1.1.1 while 循环1.1.2 范围和级数&#xff1a;for循环 1.1 while 和 for 循环 Kotlin 中的迭代与 Java、C# 或其他语言中的迭代非常相似 while 循环与其他语言中的传统形式相同, 只需简单了解一下即可还会发现 for 循环,其写法为 for ( in ) 是…

从0开始的linux(4)——权限

欢迎来到博主的专栏&#xff1a;从0开始的linux 博主ID&#xff1a;代码小豪 文章目录 用户和用户组文件权限更改文件权限目录文件的权限意义普通文件的权限意义 sudo命令 linux具有多用户的任务环境&#xff0c;为了让每个用户保护各自文件数据&#xff08;防止别的用户对其他…

【功能详解】IoTDB 与 ThingsBoard 成功集成!

可视化工具集成1 IoTDB 实现了 ThingsBoard 的无缝集成对接&#xff0c;IoTDB 构建的工业数据存储处理-可视化呈现链路又多了一种可用、易用的工具选择。 我们的代码已贡献到 ThingsBoard 社区&#xff08;待发版&#xff09;&#xff0c;用户手册也已发布&#xff08;可点击下…

Spring Boot框架:蜗牛兼职网实现

第3章 系统分析 3.1 需求分析 蜗牛兼职网主要是为了提高工作人员的工作效率和更方便快捷的满足用户和企业&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户和企业的可操作性&#xff0…

SpringCloud入门(六)Nacos注册中心(下)

一、Nacos环境隔离 Nacos提供了namespace来实现环境隔离功能。 nacos中可以有多个namespace。namespace下可以有group、service等。不同namespace之间相互隔离&#xff0c;例如不同namespace的服务互相不可见。 使用Nacos Namespace 环境隔离 步骤&#xff1a; 1.在Nacos控制…

【AI画图】stable-diffusion-webui学习之一《安装部署》

简介 Stable Diffusion是2022年发布的深度学习文本到图像生成模型&#xff0c;它是一种潜在扩散模型&#xff0c;它由创业公司Stability AI与多个学术研究者和非营利组织合作开发。目前的SD的源代码和模型都已经开源&#xff0c;在Github上由AUTOMATIC1111维护了一个完整的项目…

Python | Leetcode Python题解之第430题扁平化多级双向链表

题目&#xff1a; 题解&#xff1a; class Solution:def flatten(self, head: "Node") -> "Node":def dfs(node: "Node") -> "Node":cur node# 记录链表的最后一个节点last Nonewhile cur:nxt cur.next# 如果有子节点&#…

OpenCV特征检测(9)检测图像中直线的函数HoughLines()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在二值图像中使用标准 Hough 变换查找直线。 该函数实现了用于直线检测的标准 Hough 变换或标准多尺度 Hough 变换算法。详见 http://homepages…

WebLogic系列漏洞

后台弱⼝令GetShell 漏洞描述 通过弱⼝令进⼊后台界⾯ , 上传部署war包 , getshell 影响范围 全版本&#xff08;前提后台存在弱⼝令&#xff09; 环境搭建 cd vulhub/weblogic/weak_password docker-compose up -d 漏洞复现 默认账号密码&#xff1a;weblogic/Oracle123 (单…

哔哩哔哩自动批量删除抽奖动态解析篇(二)

通过前文我们已经获得账户下转发的动态列表&#xff0c;这一节我们要做的就是根据前一节获得的动态列表数据判断抽奖动态是否已开奖。 一、获取抽奖动态开奖状态信息 首先我们按F12健进入网页源代码&#xff0c;然后点开一条抽奖动态的按钮链接&#xff0c;找到API接口。流程…

Leetcode 1041. 困于环中的机器人

1.题目基本信息 1.1.题目描述 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; “G”&…

基于springboot在线学籍管理系统

基于springboot在线学籍管理系统 摘 要 对在线学籍管理的流程进行科学整理、归纳和功能的精简&#xff0c;通过软件工程的研究方法&#xff0c;结合当下流行的互联网技术&#xff0c;最终设计并实现了一个简单、易操作的在线学籍管理系统。内容包括系统的设计思路、系统模块和…

从零开始一个git操作实例,图文并茂

徒弟不懂git怎么用&#xff0c; 于是写了篇文章&#xff0c; 把本地git操作从头写了一遍&#xff0c; 自己去看吧&#xff01; 0、基本概念 •Git是一个免费、开源的、分布式版本控制系统 •它使用一个特殊的叫做仓库的数据库来记录文件的变化 •仓库中的每个文件都有一个…

【网络】TCP协议的简单使用

目录 echo_service server 单进程单线程 多进程 多线程 线程池 client echo_service_code echo_service 还是跟之前UDP一样&#xff0c;我们先通过实际的代码来实现一些小功能&#xff0c;简单的来使用TCP协议进行简单的通信&#xff0c;话不多说&#xff0c;我们先实现…