记录一次c++ xgboost的简单使用以及分类实现

相关资料挺少的,对于我这种新手来说太难搞了。找了很多资料才弄出来,故记录一下。

1 .首先跟着这篇文章弄:在Windows中如何安装XGBoost的C++版本进行模型训练和推理-CSDN博客 。但是他第5点是我参考了中文文档里面来弄的,也就是cmake .. -G "Visual Studio 17 2022"。实际上直接用中文文档里面的反而还不行,所以我结合了一下两者。不过上面csdn原文的直接用应该也没毛病。

这里说几个坑:

a.我因为网络原因clone 443。所以去下载的压缩包,但是这样不行!!!

看官方文档说是有子模块,直接下载压缩包会缺失文件。算了,干脆开梯子下载,开梯子要配置git代理为梯子的地址,不然开了也没用。

b.然后就是克隆下来要使用不同版本的话,可以在构建好之后打开sln,选择git界面切换到想要的版本分支,再重新构建就行了。

附上中文版文档:XGBoost入门指引 - 安装指南 - 《XGBoost 中文文档》 - 书栈网 · BookStack

2.一个简单的c++示例代码(我使用了1.4.0版本,下面代码拿gpt生成初版然后改的,直接生成的没法用,gpt那边不知道生成的哪个版本的代码):

cpp 复制代码
#include <iostream>
#include <vector>
#include <random>
#include <xgboost/c_api.h>

int main() {
    // 随机生成二分类数据集
    const int n_samples = 100;
    const int n_features = 10;
    std::vector<float> data(n_samples * n_features);
    std::vector<float> labels(n_samples);
    std::mt19937 rng;  // 随机数生成器
    std::uniform_real_distribution<float> dist(-1.0, 1.0);  // 均匀分布
    for (int i = 0; i < n_samples; i++) {
        labels[i] = (dist(rng) > 0) ? 1.0 : 0.0;
        for (int j = 0; j < n_features; j++) {
            data[i * n_features + j] = dist(rng);
        }
    }

    // 将数据转换为 DMatrix
    DMatrixHandle dtrain;
    XGDMatrixCreateFromMat(data.data(), n_samples, n_features, 0, &dtrain);
    XGDMatrixSetFloatInfo(dtrain, "label", labels.data(), n_samples);

    // 设置参数
    const char* params[] = { "objective=binary:logistic", "max_depth=3", "eta=0.1" };
    const int n_params = sizeof(params) / sizeof(char*);
    BoosterHandle booster;
    XGBoosterCreate(&dtrain, 1, &booster);
    XGBoosterSetParam(booster, "seed", "0");
    for (int i = 0; i < n_params; i++) {
        XGBoosterSetParam(booster, params[i], "");
    }

    // 训练模型
    const int n_rounds = 10;
    for (int i = 0; i < n_rounds; i++) {
        XGBoosterUpdateOneIter(booster, i, dtrain);
    }

    // 预测数据
    DMatrixHandle dtest;
    XGDMatrixCreateFromMat(data.data(), n_samples, n_features, 0, &dtest);
    bst_ulong* out_len=new bst_ulong(n_samples);
    const float* out_result=new float[n_samples];
    // 分配内存给 out_result

    XGBoosterPredict(booster, dtest, 0, 0,0, out_len, &out_result);

    // 输出预测结果
    std::cout << "Predictions:" << std::endl;
    for (int i = 0; i < n_samples; i++) {
        std::cout << out_result[i] << std::endl;
    }

    XGDMatrixFree(dtrain);
    XGDMatrixFree(dtest);
    XGBoosterFree(booster);

    return 0;
}

貌似有点小问题,预测结果出来有负数(期待大神纠正),但是能运行就算成功🤣

个人吐槽一波:我是真**的无语了,好好的python不用让我用c++搞,我屁都不会我拿头搞啊🤬🤬🤬

相关推荐
R-G-B1 小时前
【15】OpenCV C++实战篇——fitEllipse椭圆拟合、 Ellipse()画椭圆
c++·人工智能·opencv·fitellipse椭圆拟合·ellipse画椭圆·椭圆拟合·绘制椭圆
m0_616330453 小时前
Day 40 训练和测试的规范写法
人工智能·深度学习·机器学习
界面开发小八哥3 小时前
MFC扩展库BCGControlBar Pro v36.2:MSAA和CodedUI测试升级
c++·mfc·bcg·界面控件
西猫雷婶5 小时前
scikit-learn/sklearn学习|岭回归解读
开发语言·人工智能·机器学习·支持向量机·回归·scikit-learn·sklearn
无名之猿5 小时前
人工智能系列(8)如何实现无监督学习聚类(使用竞争学习)?
人工智能·机器学习
WeiJingYu.6 小时前
K-Means 聚类
机器学习·kmeans·聚类
极客BIM工作室6 小时前
C++ 限制类对象数量的技巧与实践
开发语言·javascript·c++
郝学胜-神的一滴6 小时前
Horse3D引擎研发笔记(四):在QtOpenGL下仿three.js,封装EBO绘制四边形
c++·3d·unity·游戏引擎·godot·图形渲染·虚幻
终焉代码8 小时前
【C++】STL二叉搜索树——map与set容器的基础结构
开发语言·数据结构·c++
源代码•宸8 小时前
深入浅出设计模式——行为型模式之观察者模式 Observer
开发语言·c++·经验分享·观察者模式·设计模式·raii