首页 > 其他分享 >使用xgboost的c接口推理模型

使用xgboost的c接口推理模型

时间:2023-11-26 17:44:43浏览次数:30  
标签:safe 0.0 xgboost 接口 test model 推理模型 booster

title: 使用xgboost的c接口推理模型
banner_img: https://cdn.studyinglover.com/pic/2023/07/b5c4ecf9aa476ca1073f99b22fe9605e.jpg
date: 2023-9-10 21:10:00
categories:
- 踩坑
tags:
- 机器学习

使用xgboost的c接口推理模型

官方c api tutorial文档,非常恶心的一点是,tutorial和文档问题很多。

也参考了不少开源项目,主要有xgboost-c-cplusplus,xgboostpp.

首先导入头文件#include "xgboost/c_api.h" ,接下来xgboost的绝大多数接口都包含在了这个头文件中。

然后我们需要一个宏,来用它获取xgboost函数使用的情况.在每次调用xgboost函数时都应该调用这个宏。

#define safe_xgboost(call) {  \
  int err = (call); \
  if (err != 0) { \
    fprintf(stderr, "%s:%d: error in %s: %s\n", __FILE__, __LINE__, #call, XGBGetLastError());  \
    exit(1); \
  } \
}

我们使用的模型文件为xgboost_model.bin ,训练数据的输入是 11 个元素。

首先我们声明一个boost模型的句柄BoosterHandle booster; 接着用XGBoosterCreate 函数创建一个模型 。

BoosterHandle booster;
safe_xgboost(XGBoosterCreate(NULL, 0, &booster));

设置一个字符串作为模型路径const char *model_path = "../xgboost_model.bin";(../是因为编译出来的可执行文件在build目录下) , 通过句柄使用XGBoosterLoadModel函数加载模型。

const char *model_path = "../xgboost_model.bin";
XGBoosterLoadModel(booster, model_path)

设置一组数据作为推理测试,这里我选的数据标签是1.接着将输入数据转为xgboost的DMatrix格式。

float a[11]= {14.0,2.0,1.0,12.0,19010.0,120.0,14.0,0.0,0.0,0.0,0.0};
DMatrixHandle h_test;
safe_xgboost(XGDMatrixCreateFromMat(a, 1, 11, -1, &h_test));

下面就可以进行模型推理了,out_len 代表输出的长度(实际上是一个整型变量),f的模型推理的结果。

bst_ulong out_len;
const float *f;
safe_xgboost(XGBoosterPredict(booster, h_test, 0, 0, 1, &out_len, &f));

我们可以打印输出查看结果

printf("Value of the variable: %f\n", f[0]);

最后记得释放内存

XGDMatrixFree(h_test);
XGBoosterFree(booster);

完整的代码

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "xgboost/c_api.h"

#define safe_xgboost(call) {  \
  int err = (call); \
  if (err != 0) { \
    fprintf(stderr, "%s:%d: error in %s: %s\n", __FILE__, __LINE__, #call, XGBGetLastError());  \
    exit(1); \
  } \
}

int main(int argc, char const *argv[]) {
    const char *model_path = "../xgboost_model.bin";

    // create booster handle first
    BoosterHandle booster;
    safe_xgboost(XGBoosterCreate(NULL, 0, &booster));
    // load model
    safe_xgboost(XGBoosterLoadModel(booster, model_path));

    //generate random data of a a[11],every nuber from 0 to 2
    // float a[11]= {1.0,12.0,1.0,1.0,16134.0,20600.0,0.0,1.0,0.0,0.0,0.0}; // label: 0.0
    float a[11]= {14.0,2.0,1.0,12.0,19010.0,120.0,14.0,0.0,0.0,0.0,0.0}; // label: 1.0

    for (int i = 0; i < 11; i++) {
        printf("%f, ", a[i]);
        if (i == 10) {
            printf("\n");
        }
    }
    // convert to DMatrix
    DMatrixHandle h_test;
    safe_xgboost(XGDMatrixCreateFromMat(a, 1, 11, -1, &h_test));
    // predict
    bst_ulong out_len;
    const float *f;
    safe_xgboost(XGBoosterPredict(booster, h_test, 0, 0, 1, &out_len, &f));
    printf("Value of the variable: %f\n", f[0]);

    XGDMatrixFree(h_test);
    XGBoosterFree(booster);
    return 0;
}

使用cmake编译

cmake_minimum_required(VERSION 3.18)
project(project_name LANGUAGES C CXX VERSION 0.1)
set(xgboost_DIR "/usr/include/xgboost")

include_directories(${xgboost_DIR})
link_directories(${xgboost_DIR})

add_executable(project_name test.c)
target_link_libraries(project_name xgboost)
mkdir build
cd ./build
cmake ..
make .
./project_name

标签:safe,0.0,xgboost,接口,test,model,推理模型,booster
From: https://www.cnblogs.com/studyinglover/p/17857607.html

相关文章

  • 使用JMeter进行接口测试教程
    安装使用JMeter的前提需要安装JDK,需要JDK1.7以上版本目前在用的是JMeter5.2版本,大家可自行下载解压使用运行进入解压路径如E:\apache-jmeter-5.2\bin,双击jmeter.bat启动运行启动后默认为英文版本,可通过Options–ChooseLanguage–Chinese(Simplified)设置为中文版......
  • 如何使用JMeter测试导入接口/导出接口
    今天一上班,被开发问了一个问题:JMeter调试接口,文件导入接口怎么老是不通?还有导出文件接口,不知道文件导到哪里去了?我一听,这不是JMeter做接口测试经常遇到的嘛,但是一时半会又口述不清楚,于是整理篇文章做个简单总结吧。JMeter测试导入接口1.填写导入接口信息2.设置导入文件名称及......
  • Jmeter接口测试:jmeter导入和导出接口的处理
    JMeter测试导入接口利用Jmeter测试上传文件,首先可根据接口文档或者fiddler抓包分析文件上传的接口;如下图:以下是我通过fiddler所截取的文件上传的接口1、填写导入接口的信息查看文件上传栏下的填写信息:文件名称:导入文件的路径参数名称:fileMIME类型:为fiddler抓包的Content-......
  • 【音视频常见接口HDMI、DP、DVI基础知识】
    DP接口:DisplayPort(简称DP),该接口免认证、免授权金,比较节约钱,主要用于视频源与显示器等设备的连接,也支持携带音频、USB和其他形式的数据。HDMI接口:HighDefinitionMultimedialnterface(简称HDMI),HDMI是一种数字化视频/音频接口技术,可以同时传送音频和影像信号,是一种高清视频接口......
  • 接口优化方案总结
    一级来源:https://toutiao.io/posts/0kwkbbt二级来源:https://mp.weixin.qq.com/s?__biz=MjM5NzMyMjUwMg==&mid=2247500397&idx=1&sn=1dfe1dfdd8374d326cd36db8366663dd大家好,最近看到京东云的一位大佬分享的接口优化方案,感觉挺不错的,拿来即用,本人也是直接收藏。建议收藏一波或者......
  • 自动生成接口文档操作手册
    API文档自动化生成版本说明实测仅适用于Spring2.x版本,Spring3需要额外配置后端创建一个SpringWeb项目项目初始化srcmainjavacom.exampleconfigKnife4jConfig.javaentityEntity.javacontrollerEntityController.javaApplication.javar......
  • 实现 利用SPI 接口 发送 显示屏 初始化代码
    1`timescale1ns/1ns2modulelcd_spi_top_tb();34regclk_x2_i;5regrst_i;6wirespi_cs;7wirespi_scl;8wirespi_mosi;9wirespi_miso;10wirespi_init_done;111213initialbegin14clk_x2_i=0;15rst_i=0;16......
  • 16位 565 DVP 接口实现
    1modulelcd_dvp_drive2#(3parameterVBP=2,//OK4parameterVFP=36,//OK5parameterVSW=6,//OK6parameterVDP=480,//52478parameterHBP=8,//ok9parameterHFP=96,//ok10parameterHSW=16,//ok11parameter......
  • Java Web 实现文件上传和下载接口功能
    1.上传java代码实现@ResponseBody@PostMapping("/upload")publicResponseVoupload(@RequestParam(value="file",required=false)MultipartFilemultipartFile){Filefile=newFile("上传到服务器的文件地址");try{......
  • 『接口测试干货』| Newman+Postman接口自动化测试完整过程
    (『接口测试干货』|Newman+Postman接口自动化测试完整过程)1Newman简介Newman是Postman的一个扩展库(NodeJs库);Newman+Postman可完成接口自动化测试工作;Postman导出的JSON格式文件可通过Newman的命令行执行;因为Postman运行后只有概要结果,没有像其他自动化测试框架那么完美漂......