我试图实现一个示例代码,我发现在Stackoverflow上,它实现了XGBOOST的C API在C++中(在c++中使用XGBOOST). 这是我使用的代码。
#include <iostream>
#include <include/xgboost/c_api.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
// create the train data
int cols=3,rows=5;
float train[rows][cols];
for (int i=0;i<rows;i++)
for (int j=0;j<cols;j++)
train[i][j] = (i+1) * (j+1);
float train_labels[rows];
for (int i=0;i<rows;i++)
train_labels[i] = 1+i*i*i;
// convert to DMatrix
DMatrixHandle h_train[1];
XGDMatrixCreateFromMat((float *) train, rows, cols, -1, &h_train[0]);
// load the labels
XGDMatrixSetFloatInfo(h_train[0], "label", train_labels, rows);
// read back the labels, just a sanity check
bst_ulong bst_result;
const float *out_floats;
XGDMatrixGetFloatInfo(h_train[0], "label" , &bst_result, &out_floats);
for (unsigned int i=0;i<bst_result;i++)
std::cout << "label[" << i << "]=" << out_floats[i] << std::endl;
// create the booster and load some parameters
BoosterHandle h_booster;
XGBoosterCreate(h_train, 1, &h_booster);
XGBoosterSetParam(h_booster, "booster", "gbtree");
XGBoosterSetParam(h_booster, "objective", "reg:linear");
XGBoosterSetParam(h_booster, "max_depth", "5");
XGBoosterSetParam(h_booster, "eta", "0.1");
XGBoosterSetParam(h_booster, "min_child_weight", "1");
XGBoosterSetParam(h_booster, "subsample", "0.5");
XGBoosterSetParam(h_booster, "colsample_bytree", "1");
XGBoosterSetParam(h_booster, "num_parallel_tree", "1");
// perform 200 learning iterations
for (int iter=0; iter<200; iter++)
XGBoosterUpdateOneIter(h_booster, iter, h_train[0]);
// predict
const int sample_rows = 5;
float test[sample_rows][cols];
for (int i=0;i<sample_rows;i++)
for (int j=0;j<cols;j++)
test[i][j] = (i+1) * (j+1);
DMatrixHandle h_test;
XGDMatrixCreateFromMat((float *) test, sample_rows, cols, -1, &h_test);
bst_ulong out_len;
const float *f;
XGBoosterPredict(h_booster, h_test, 0,0,&out_len,&f);
for (unsigned int i=0;i<out_len;i++)
std::cout << "prediction[" << i << "]=" << f[i] << std::endl;
// free xgboost internal structures
XGDMatrixFree(h_train[0]);
XGDMatrixFree(h_test);
XGBoosterFree(h_booster);
return 0;
}
但是当我运行上面的代码时,我得到了以下的错误信息。
||=== Build: Debug in xgboost_demo (compiler: GNU GCC Compiler) ===|
C:\Users\Documents\C++\xgboost_demo\main.cpp||In function 'int main()':|
C:\Users\Documents\C++\xgboost_demo\main.cpp|63|error: invalid conversion from 'bst_ulong* {aka long long unsigned int*}' to 'int' [-fpermissive]|
C:\Users\YannickLECROART\Documents\C++\xgboost_demo\main.cpp|63|error: cannot convert 'const float**' to 'bst_ulong* {aka long long unsigned int*}' for argument '6' to 'int XGBoosterPredict(BoosterHandle, DMatrixHandle, int, unsigned int, int, bst_ulong*, const float**)'|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
我做错了什么,我应该做什么修改才能使其运行?先谢谢你。
你可能忘了一个参数。试试这个。
XGBoosterPredict(h_booster, h_test, 0, 0, 0, &out_len, &f);
试试这个 c_api.h
文件显示了这一点。
XGB_DLL int XGBoosterPredict(BoosterHandle handle,
DMatrixHandle dmat,
int option_mask,
unsigned ntree_limit,
int training,
bst_ulong *out_len,
const float **out_result);