机器学习_XGBoost模型_用C++推理示例Demo
1. 需求
将 python 训练好的 xgboost 模型, 使用C++ 进行加载并进行推理(预测)
2. 代码实现
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <xgboost/c_api.h>const char *model_path = "my_xgb.model";// 预测单条数据
void test_xgboost_one_item(std::vector<float> features)
{// load confidence prediction modelBoosterHandle booster;XGBoosterCreate(NULL, 0, &booster);XGBoosterLoadModel(booster, model_path);DMatrixHandle dtest;XGDMatrixCreateFromMat(reinterpret_cast<float*>(&features[0]), 1, features.size(), 0, &dtest);// 进行预测const float *out_result;unsigned long out_len;XGBoosterPredict(booster, dtest, 0, 0, 0, &out_len, &out_result);// 输出预测结果std::cout << "Prediction result: ";for (unsigned long i = 0; i < out_len; ++i) {std::cout << out_result[i] << " ";}std::cout << std::endl;// 释放资源XGDMatrixFree(dtest);XGBoosterFree(booster);}// 预测多条数据(来自文件.txt)
void test_xgboost_from_file(std::string file_name)
{BoosterHandle booster;XGBoosterCreate(NULL, 0, &booster);XGBoosterLoadModel(booster, model_path);// 打开文件std::ifstream datasets_file(file_name);if (!datasets_file.is_open()) {std::cerr << "Failed to open the file: " << file_name << std::endl;}// 读取文件内容并存储到二维vector数组中std::vector<std::vector<float>> test_data_src;std::string line;while (std::getline(datasets_file, line)){std::istringstream iss(line);std::vector<float> row_src;std::string token;//仅读取一行中的前7个数据,举例.for (int i = 0; i < 7; ++i){// 读取每行的前7个元素std::getline(iss, token, ',');float value = std::stof(token);row_src.push_back(value);}test_data_src.push_back(row_src);}// 关闭文件datasets_file.close();std::cout << "====== test_data_src ========" << std::endl;// 输出二维vector数组中的数据(可选)for (const auto& row : test_data_src) {for (const auto& value : row) {std::cout << value << " ";}std::cout << std::endl;}//注意: test data 需要 和训练模型时的数据保持一致, 即经过相同的预处理(若有)//注意: 重要操作, 为了通过第一个数据地址,访问到所有数据.// 将二维vector数组转换为一维的连续内存块std::vector<float> flatData;for (const auto& row : test_data_src) {flatData.insert(flatData.end(), row.begin(), row.end());}// 将测试数据转换为DMatrix格式DMatrixHandle dtest;bst_ulong nrow = test_data_src.size();bst_ulong ncol = test_data_src[0].size();XGDMatrixCreateFromMat(flatData.data(), nrow, ncol, 0, &dtest);// 进行预测const float *out_result;unsigned long out_len;XGBoosterPredict(booster, dtest, 0, 0, 0, &out_len, &out_result);// 输出预测结果std::cout << "Prediction result: " << std::endl;;for (unsigned long i = 0; i < out_len; ++i) {std::cout << out_result[i] << " "<< std::endl;}std::cout << std::endl;// 保存预测结果到文件(可选)std::ofstream file_prediction("predict_result.txt", std::ofstream::trunc);if (!file_prediction.is_open()) {std::cerr << "Failed to open the file." << std::endl;}for (unsigned long i = 0; i < out_len; ++i) {file_prediction << out_result[i] << " "<< std::endl;}// 关闭文件file_prediction.close();// 释放资源XGDMatrixFree(dtest);XGBoosterFree(booster);}
int main(int argc, char **argv) {// 测试1: 仅预测一条数据 (使用7个feture,预测输出一个output数据)std::vector<float> features = {0.562000, 0.739818, 0.917457, 0.943217, 0.055662, 0.994000, 0.995506};test_xgboost_one_item(features);// 测试2: 预测存储在文件中的多条数据 (使用7个feture,预测输出一个output数据)std::string test_data_normalsets = "test_data.txt";// test_data.txt 内容:// 0.562000 0.739818 0.917457 0.943217 0.055662 0.994000 0.995506// 0.548000 0.737632 0.910190 0.943415 0.000000 0.994591 0.997773// 0.544000 0.738136 0.924542 0.944812 0.563753 0.994729 0.996054// 0.556000 0.740211 0.919053 0.945792 0.000000 0.999281 0.990547test_xgboost_from_file(test_data_normalsets);std::cout << "==== Done ====" << std::endl;return 0;
}
3. 注意
注意: test data 需要 和训练模型时的数据保持一致, 即经过相同的预处理(若有)
XGBoosterPredict() / 参数说明:
int XGBoosterPredict ( BoosterHandle handle,DMatrixHandle dmat,int option_mask,unsigned ntree_limit, int training,bst_ulong * out_len,const float ** out_result
)
- handle:句柄
- dmat:数据矩阵
- option_mask:选项的位掩码,用于预测,可能的取值为 0: 正常预测 1: 输出边缘值而不是转换后的值 2: 输出树的叶子索引而不是叶子值,注意,叶子索引在每棵树中是唯一的 4: 输出单个预测的特征贡献
- ntree_limit:限制用于预测的树的数量,这仅适用于提升树,当参数设置为0时,我们将使用所有树 training:预测函数是否用作训练循环的一部分。
- 可以在两种情况下运行预测: 给定数据矩阵 X,从模型中获取预测 y_pred。 获取用于计算梯度的预测。例如,DART 提升器在训练期间执行了 dropout,由于被舍弃的树,预测结果与正常推断步骤获取的结果不同。
- 对于第一个场景,设置 training=false。对于第二个场景,设置 training=true。第二个场景适用于定义自定义目标函数时。
- out_len:用于存储返回结果的长度
- out_result:用于设置指向数组的指针
参考:
-
将基于python训练得到XGBoost模型,用于C++环境推理的示例Demo
-
GitHub - Outliers1106/XGBoost-py2cpp
-
Xgbboost: cpp调用: GitHub - EmbolismSoil/xgboostpp: 将XGBoost c api封装成c++接口
-
-
官方说明文档: Installation Guide — xgboost 2.0.3 documentation
相关文章:
机器学习_XGBoost模型_用C++推理示例Demo
1. 需求 将 python 训练好的 xgboost 模型, 使用C 进行加载并进行推理(预测) 2. 代码实现 #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <string> #include <xgboost/c_api.h>const char *m…...
C语言 | Leetcode C语言题解之第21题合并两个有序链表
题目: 题解: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {/…...
2024考研调剂须知
----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项,系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…...
PCIE协议版--M.2接口规范V1.0中文版1——电气规格篇
3.电气规范 3.1 Connectivity Socket 1 系统接口信号 表15适用于Socket 1-SD和Socket 1-DP输出版本。 3.1.1.补充NFC信号 当一个SIM设备被用作安全元素时,NFC解决方案可以与表16中列出的附加信号相结合。 3.1.2.电源和地 PCI Express M.2 Socket 1使用一个3.3 V…...
【JVM】JVM堆占用情况分析(频繁创建的对象、内存泄露等问题)、jmap+jhat、jvisualvm工具使用
文章目录 一. 相关命令1. 查看进程堆内存整体使用情况:OOM的可能2. 统计类的对象数量以及内存占用:定位内存泄漏 二. 分析内存占用1. 使用 jhat 排查对象堆占用情况1.1. 排查步骤1.2. 具体分析例子a. 分析频繁创建对象导致的OOM 1.3. OQL查看某一个对象的…...
【蓝桥杯每日一题】4.11 更小的数(不用区间DP)
题目来源: 蓝桥杯 2023 省 A]更小的数 - 洛谷 这题只需要用到双指针就OK~ 思路1: 翻转数组的子数组,然后进行比较大小将翻转后的数组存储在字符串 k k k中,然后将字符串 k k k与字符串 a a a进行逐一元素比较(因为…...
【线段树】2276. 统计区间中的整数数目
算法可以发掘本质,如: 一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏…...
ChatGPT 写作利器:探索ChatGPT在论文写作中的应用
ChatGPT无限次数:点击直达 ChatGPT 写作利器:探索ChatGPT在论文写作中的应用 引言 ChatGPT是一种强大的自然语言处理工具,能够为我们提供高效、准确的文本生成功能。在论文写作领域,ChatGPT的应用也逐渐受到关注。本文将探讨ChatGPT在论文写…...
从 SQLite 3.4.2 迁移到 3.5.0(二十)
返回:SQLite—系列文章目录 上一篇:SQLite---调试提示(十九) 下一篇:SQLite—系列文章目录 SQLite 版本 3.5.0 (2007-09-04) 引入了一个新的操作系统接口层, 与所有先前版本的 SQLi…...
集群开发学习(一)(安装GO和MySQL,K8S基础概念)
完成gin小任务 参考文档: https://www.kancloud.cn/jiajunxi/ginweb100/1801414 https://github.com/hanjialeOK/going 最终代码地址:https://github.com/qinliangql/gin_mini_test.git 学习 1.安装go wget https://dl.google.com/go/go1.20.2.linu…...
[Kubernetes[K8S]集群:Slaver从节点初始化和Join]:添加到主节点集群内
文章目录 操作流程:上篇主节初始化地址:前置:Docker和K8S安装版本匹配查看0.1:安装指定docker版本 **[1 — 8] ** [ 这些步骤主从节点前置操作一样的 ]一:主节点操作 查看主机域名->编辑域名->域名配置二&#x…...
redis复习笔记08(小滴课堂)
案例实战需求之大数据下的用户画像标签去重 我们就简单的做到了去重了。 案例实战社交应用里面之关注、粉丝、共同好友案例 这就是我们set的一个应用。 案例实战之SortedSet用户积分实时榜单最佳实践 准备积分类对象: 我们加上构造方法和判断相等的equals和hascod…...
在线课程平台LearnDash评测 – 最佳 WordPress LMS插件
在我的LearnDash评测中,我探索了流行的 WordPress LMS 插件,该插件以其用户友好的拖放课程构建器而闻名。我深入研究了各种功能,包括课程创建、测验、作业、滴灌内容、焦点模式、报告、分析和管理工具。 我的评测还讨论了套餐和定价选项&…...
OpenDDS-3.27构建与用法
一、OpenDDS-3.27构建 ./configure To enable Java bindings, use ./configure --java make 二、运行Messenger Example: source setenv.sh For the C example:cd DevGuideExamples/DCPS/Messenger For the Java example:cd java/tests/mes…...
计算机网络——MAC地址和IP地址
目录 前言 引入 MAC地址与IP地址 IP地址和MAC地址是什么?如何起作用的? MAC地址如何表示与确定网卡在网络中的确定位置? DHCP协议自动帮我们配置 操作系统是如何知道对方的MAC地址的? 前言 本博客是博主用于复习计算机网络…...
Unity构建详解(7)——AssetBundle格式解析
【文件格式】 文件可以分为文本文件、图片文件、音频文件、视频文件等等,我们常见的这些文件都有行业内的标准格式,其意味着按照一定的规则和规范去保存读取文件,可以获取我们想要的数据。 有些软件会有自己的文件格式,会按照其…...
前端对接fastGPT流式数据+打字机效果
首先在对接api时 参数要设置stream: true, const data {chatId: abc,stream: true,//这里true返回流式数据detail: false,variables: {uid: sfdsdf,name: zhaoyunyao,},messages: [{ content: text, role: user }]}; 不要用axios发请求 不然处理不了流式数据 我这里使用fetch …...
避免使用第三方工具完成电脑环境检测
0. 简介 在之前配置各种深度学习环境的时候经常需要先检测一下电脑的软硬件环境,其实整个过程比较重复和固定,所以我们是否有可能一键检测Python版本、PIP版本、Conda版本、CUDA版本、电脑系统、CPU核数、CPU频率、内存、硬盘等内容这是很多Deepper苦恼…...
vue 中 mixin 的应用场景,原理和合并规则
应用场景 多个组件的相同逻辑可以提出去来一个公共的 mixin 原理 Mixin 的工作原理是将 Mixin 中的选项合并到组件的选项中 合并规则 优先处理 mixinsprops 、method、inject、computed 同名的使用组件内的,不使用mixin 的data 进行合并生命周期和watch 先执行…...
点击按钮(文字)调起elementUI大图预览
时隔一年,我又回来了 ~ 最近在做后台,遇到一个需求,就是点击“查看详情”按钮,调起elementUI的大图预览功能,预览多张图片,如下图: 首先想到的是使用element-ui的el-image组件,但它是…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
