【matlab】绘制maxENT模型的ROC曲线和omission curve

文章目录

  • 一、maxENT模型
  • 二、ROC曲线
  • 三、实操
    • 3.1 数据提取
    • 3.2 绘制ROC曲线
    • 3.3 绘制遗漏曲线
    • 3.4 多次训练的ROC和测试的ROC

一、maxENT模型

前面的文章已经详细讲过了。

maxENT软件运行后,会生成一个html报告,里面有ROC曲线,但我们往往需要自己画图,设计一下样式,而不是直接使用输出的图像。

二、ROC曲线

ROC 曲线,即受试者工作特征曲线(Receiver Operating Characteristic Curve),是用来评估二分类模型性能的重要工具。

  • 二分类决策:在二分类模型中,模型通常根据某个阈值(threshold)将样本预测为正例或负例。调整这个阈值会影响预测结果,从而改变模型的敏感性(正确识别正例的能力)和特异性(正确排除负例的能力)。

  • 混淆矩阵要素

    • 真阳性(TP):被正确预测为正例的样本数量。
    • 真阴性(TN):被正确预测为负例的样本数量。
    • 假阳性(FP):被错误预测为正例的负样本数量。
    • 假阴性(FN):被错误预测为负例的正样本数量。

🔹主要指标

  • 真正率(True Positive Rate, TPR):也称为敏感性或召回率,计算公式为

    T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP

    该指标反映模型检测到正类的比例。

  • 假正率(False Positive Rate, FPR):计算公式为
    F P R = F P F P + T N FPR = \frac{FP}{FP + TN} FPR=FP+TNFP
    该指标反映在所有负样本中误判为正样本的比例。

在 ROC 曲线上,TPR 是纵轴,而 FPR 是横轴。


❄️ 如何绘制 ROC 曲线

  1. 设置不同阈值:对于一个分类器,可以从 0 到 1 选择若干不同的概率阈值。
  2. 计算指标:对于每个阈值,依据预测结果计算对应的 TPR 和 FPR。
  3. 绘图:将每个阈值对应的 (FPR, TPR) 点在二维坐标系中描绘出来,并连接这些点,形成一条曲线。

随着阈值的变化:

  • 当阈值很高时,模型较为严格,只预测非常有信心的样本为正例,此时 TPR 较低,FPR 也较低。
  • 当阈值很低时,更多样本被预测为正例,TPR 提高,但同时 FPR 也会上升。

☘️曲线下的面积(AUC)

  • AUC(Area Under the Curve):ROC 曲线下的面积代表了模型的整体区分能力。
    • AUC = 1:理想模型,能完美区分正负样本。
    • AUC = 0.5:与随机猜测相当,说明模型没有区分能力。
      AUC 数值越大,说明模型在不同阈值下保持了较高的 TPR 同时控制了 FPR 的上升,表现越优。

🗝️ROC 曲线的应用与特点

  • 独立于样本类别分布:与精确度(accuracy)不同,ROC 曲线上各点的计算不受类别比例影响,对于类别分布不平衡的问题,ROC 依然能有效反映模型性能。
  • 决策阈值选择:通过 ROC 曲线,可以直观地看到在不同阈值下模型的表现,从而帮助选择一个合适的平衡点。例如,在医疗诊断中,可能更倾向于降低假阴性(提高 TPR),即使假阳性(FPR)上升。
  • 模型比较:当需要比较多个模型时,ROC 曲线及其 AUC 值可以作为一个统一的指标。如果一条 ROC 曲线始终在另一条之上,那么前者所对应的模型通常表现更好。

三、实操

3.1 数据提取

首先是maxENT软件的设置,上上篇文章末尾写了。

比如:第三列(最后一张图)那个:Write background predictions选项可以选上,我截图的时候没选择。这个输出数据可以用来自己话ROC曲线。

我设置模型运行10次,输出文件夹里面会有10对这样的文件:当然还有其它文件,这些是画图需要的。
在这里插入图片描述
我预测了多个物种的适生区,每个10次,取均值。

所以首先要根据物种,把csv文件提取出来。代码示例:

%% 提取maxent多次训练后的输出csv并按物种分别保存%%
clear
clc% 设置源文件夹路径和目标文件夹路径
sourceFolder = 'xxx';  % 这里填写源文件夹路径
destinationFolder = 'xxx';  % 这里填写目标文件夹路径% 获取源文件夹中所有csv文件
csvFiles = dir(fullfile(sourceFolder, '*.csv'));% 遍历所有文件
for i = 1:length(csvFiles)% 获取文件名fileName = csvFiles(i).name;% 检查文件名是否包含 backgroundPredictions 或 samplePredictionsif contains(fileName, 'backgroundPredictions') || contains(fileName, 'samplePredictions')% 使用正则表达式提取动物名称(保留中间的下划线,去除尾部的下划线)animalName = regexp(fileName, '^[a-zA-Z_]+(?=\d)', 'match', 'once');% 去除末尾的下划线(如果有)if animalName(end) == '_'animalName = animalName(1:end-1);end% 创建以动物名称命名的目标文件夹,如果文件夹不存在则创建animalFolder = fullfile(destinationFolder, animalName);if ~exist(animalFolder, 'dir')mkdir(animalFolder);end% 复制文件到相应的文件夹copyfile(fullfile(sourceFolder, fileName), fullfile(animalFolder, fileName));end
enddisp('文件复制完成');

执行后,会有一个data(假设)文件夹,文件夹下面每个物种有一个文件夹,文件夹里面是10对csv数据。

3.2 绘制ROC曲线

这是一次预测的曲线,不是多次预测的平均:

%% 1. 读取数据clear
clcpresence = readtable('xxx_samplePredictions.csv',VariableNamingRule='preserve');
background = readtable('xxx_backgroundPredictions.csv',VariableNamingRule='preserve');% 属性名设置
presence.Properties.VariableNames = strrep(presence.Properties.VariableNames, ' ', '_');
background.Properties.VariableNames = strrep(background.Properties.VariableNames, ' ', '_');%% 2. 计算AUC% 提取预测值
pp = presence.Cloglog_prediction; % presence 数据中的预测
bb = background.Cloglog; % background 数据中的预测% 测试集 AUC
testpp = pp(presence.Test_or_train == "test");
combined = [testpp; bb];
label = [ones(length(testpp), 1); zeros(length(bb), 1)];
[~, ~, ~, AUC_test] = perfcurve(label, combined, 1);% 训练集 AUC
trainpp = pp(presence.Test_or_train == "train");
combined_train = [trainpp; bb];
label_train = [ones(length(trainpp), 1); zeros(length(bb), 1)];
[~, ~, ~, AUC_train] = perfcurve(label_train, combined_train, 1);% 输出 AUC 值
disp(['Test AUC: ', num2str(AUC_test)]);
disp(['Train AUC: ', num2str(AUC_train)]);%% 3. 绘制 ROC 曲线
[X_test, Y_test, ~, ~] = perfcurve(label, combined, 1);
[X_train, Y_train, ~, ~] = perfcurve(label_train, combined_train, 1);figure;
plot(X_test, Y_test, 'Color', '#5EC1C7', 'LineWidth', 1.5); % 测试集 ROC
hold on;
plot(X_train, Y_train, 'Color', '#DA4A22', 'LineWidth', 1.5); % 训练集 ROC
plot([0, 1], [0, 1], 'k--'); % 对角线
xlabel('1 - Specificity');
ylabel('Sensitivity');
title('ROC Curve');
legend({'Test Set', 'Train Set', 'Random'}, 'Location', 'Best');
ylim([0 1.1])
grid minor;
hold off;

在这里插入图片描述

3.3 绘制遗漏曲线

maxENT的输出称作:omission curve

在这里插入图片描述

这个数据使用的是模型输出文件夹里面的,上面的代码没有提取。这里只是示例。

%% 4. 绘制遗漏曲线% 读取遗漏数据
omission = readtable('xxx_omission.csv',VariableNamingRule='preserve');
omission.Properties.VariableNames = strrep(omission.Properties.VariableNames, ' ', '_');% 绘制遗漏曲线
figure;
plot(omission.Corresponding_cumulative_value, omission.Fractional_area, 'Color', '#DA4A22', 'LineWidth', 1.5); % Fractional area
hold on;
plot(omission.Corresponding_cumulative_value, omission.Test_omission, 'Color', '#5EC1C7', 'LineWidth', 1.5); % Test omission
plot(omission.Corresponding_cumulative_value, omission.Training_omission, 'Color', '#9EC735', 'LineWidth', 1.5); % Training omission
plot([0, 100], [0, 1], 'k--'); % 对角线
xlabel('Cumulative threshold');
ylabel('Fractional value');
title('Omission Curve');
legend({'Fractional Area', 'Test Omission', 'Training Omission', 'Random'}, 'Location', 'Best');
grid minor;
hold off;

3.4 多次训练的ROC和测试的ROC

这个不免费了,价格10快,愿意就Buy,如果你需要的话还是很值的,我也不能用爱发电哈哈🤭。

URL:https://mbd.pub/o/bread/aJqclJ9y

在这里插入图片描述


绘制效果:
在这里插入图片描述

maxENT的报告绘制的:这两个都是训练的ROC曲线,我的代码还有测试的ROC曲线(maxENT报告没有)。
在这里插入图片描述

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

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

相关文章

nginx 核心功能

目录 一、基于授权的访问控制 1. 使用 htpasswd 生成用户认证文件 2. 修改 Nginx 主配置文件 二、基于客户端的访问控制 三、Nginx 虚拟主机 1. 基于域名的虚拟主机 2. 基于 IP 的虚拟主机 3. 基于端口的虚拟主机 四、LNMP 架构部署及应用 1. 安装 MariaDB 2. 安装并…

mongoose插入文档,字段类型, 字段验证, 删除文档,更新文档,读取文档,查询文档的条件控制 ,字段筛选,数据排序,数据截取

、Mongoose 中与 文档操作(插入、查询、更新、删除)及其相关功能(字段类型、验证、条件筛选、排序、分页等)相关示例: 📋 一、字段类型定义(Schema Types) const mongoose require…

类和对象 (拷贝构造函数和运算符重载)上

类和对象 (拷贝构造函数和运算符重载)上 拷贝构造函数存在的原因及解决的 C 语言问题 1. 浅拷贝带来的问题 在 C 语言里,当对结构体或者数组进行拷贝操作时,执行的是浅拷贝。所谓浅拷贝,就是单纯地把一个对象的所有成员变量的值复制到另一…

Python深度挖掘:openpyxl和pandas的使用详细

文章目录 一、Excel处理在数据分析中的重要性二、openpyxl基础与核心功能2.1 openpyxl简介与安装2.2 工作簿与工作表的基本操作创建新工作簿打开已有工作簿工作表操作 2.3 单元格操作详解基本单元格操作批量操作单元格特殊单元格操作 2.4 样式与格式设置字体样式对齐方式边框设…

Android Q允许低内存启用系统弹窗

如果SYSTEM_ALERT_WINDOW权限可用,则返回true。 *从Q开始,在低ram手机上禁用SYSTEM_ALERT_WINDOW。 vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/Utils.java public static boolean isSystemAlertWindowEnabled(Co…

taro小程序如何实现大文件(视频、图片)后台下载功能?

一、需求背景 1、需要实现小程序下载最大500M视频 2、同时需支持图片下载 3、退到其他页面再次回到当前页面时,下载进度也需要展示 二、实现步骤 1、在app.ts文件定义一个全局变量globalDownLoadData 2、写一个独立的下载hooks,代码如下(…

BUUCTF——Online Tool

BUUCTF——Online Tool 进入靶场 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$_SERVER[REMOTE_ADDR] $_SERVER[HTTP_X_FORWARDED_FOR]; }if(!isset($_GET[host])) {highlight_file(__FILE__); } else {$host $_GET[host];$host escapeshellarg($host);$host e…

《解锁CSS Flex布局:重塑现代网页布局的底层逻辑》

网页布局作为用户体验的基石&#xff0c;其重要性不言而喻。从早期简单的表格布局&#xff0c;到后来基于浮动与定位的复杂尝试&#xff0c;网页布局技术始终在不断演进。而CSS Flex布局的出现&#xff0c;宛如一颗璀璨的新星&#xff0c;彻底革新了网页布局的设计理念与实践方…

4.28-4.29 Vue

基于数据渲染出用户看到的页面。 常用指令&#xff1a; click单击事件。 axios&#xff1a; 发出请求后&#xff0c;不会等待请求结束&#xff0c;而是继续进行下面的代码。

每日算法-250429

每日 LeetCode 题解 (2025-04-29) 大家好&#xff01;这是今天的 LeetCode 刷题记录&#xff0c;主要涉及几道可以使用贪心策略解决的问题。 2037. 使每位学生都有座位的最少移动次数 题目描述: 思路 贪心 解题过程 要使总移动次数最少&#xff0c;直观的想法是让每个学生…

yolov8+kalman 实现目标跟踪统计人流量

简述 最近接了毕业生的毕业设计题&#xff0c;想着帮帮忙&#xff0c;要使用机器视觉识别&#xff0c;追踪和逻辑统计的方式来统计人流&#xff0c;要求是满足下面特性 高精度&#xff1a;YOLOv8 提供高质量检测&#xff0c;卡尔曼滤波平滑跟踪。高效率&#xff1a;两者结合满…

Shopify网上商店GraphQL Admin接口查询实战

目录 一、Shopify网上商店 二、个人商店配置接口权限 三、PostMan调用接口测试 四、通过Java服务调用接口 一、Shopify网上商店 Shopify是由Tobi Ltke创办的加拿大电子商务软件开发商&#xff0c;总部位于加拿大首都渥太华&#xff0c;已从一家在咖啡店办公的 5人团队&…

【Tips】高效文献管理:Zotero 导入参考文献的多种方式详解

高效文献管理&#xff1a;Zotero 导入参考文献的多种方式详解 在学术研究中&#xff0c;高效管理参考文献是提升效率的关键。Zotero 作为一款强大的文献管理工具&#xff0c;提供了多种便捷的文献导入方式。以下结合文献题录完整性对比分析&#xff0c;为大家详细介绍 Zotero …

[AI]browser-use + web-ui 大模型实现自动操作浏览器

[AI]browser-use web-ui 大模型实现自动操作浏览器 介绍 官方地址&#xff1a;https://github.com/browser-use/web-ui browser-use主要作用是将 AI Agent 与浏览器链接起来从而实现由 AI 驱动的浏览器自动化。今天会给大家介绍如何通过browser-use web-ui来搭建并操作browse…

Springboot请求静态资源时,request.getServletPath() 返回error

大家好&#xff0c;我是 程序员码递夫。 SpringBoot请求静态资源时&#xff0c;request.getServletPath() 返回error&#xff0c; 明明我的目录文件是存在的怎么就报错了呢&#xff1f; 如我请求 http://127.0.0.1:9090/Hanfu/upload/1647161536390.png 通常是因为请求的资…

在开发板上如何处理curl: (60) SSL certificate problem

目录 引言 问题解析 解决方法 跳过证书验证 采用证书认证 结语 引言 最近一直推荐学生们在课程实验中使用curl及其libcurl。curl 是一个强大的命令行工具&#xff0c;用于在命令行中进行数据传输。它支持多种协议&#xff0c;如 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。…

CSRF请求伪造

该漏洞主要是关乎于用户&#xff0c;告诫用户不可乱点击链接&#xff0c;提升自我防范&#xff0c;才能不落入Hacker布置的陷阱&#xff01; 1. cookie与session 简单理解一下两者作用 1.1. &#x1f36a; Cookie&#xff1a;就像超市的会员卡 存储位置&#xff1a;你钱包里…

Python循环与遍历详解:从入门到进阶

在Python编程中&#xff0c;循环和遍历是最基础但极其重要的知识点。理解并掌握这部分内容&#xff0c;是编写高效、清晰代码的前提。本文将从for循环和while循环的基本语法出发&#xff0c;逐步深入探讨range、enumerate、zip、列表推导式、字典遍历等Python中常见的遍历技巧&…

Python-MCPServer开发

Python-MCPServer开发 使用FastMCP开发【SSE模式的MCPServer】&#xff0c;熟悉【McpServer编码过程】【McpServer调试方法】 1-核心知识点 1-熟悉【SSE模式的MCPServer】开发2-熟悉【stdio模式的MCPServer】开发3-熟悉【启动MCPServer】的三种方式 3.1-直接启动:python mcp_s…

高级项目管理

在信息系统项目管理工作中&#xff0c;组织管理者和项目管理者&#xff0c;有时还会面临多项目的管理&#xff0c;或组织级的项目管理、项目的量化管理等课题。 其中&#xff0c;项目集管理、项目组合管理和组织级项目管理&#xff0c;为多项目管理和组织级管理提供有效指导&a…