Я обращаюсь ко всем SO C++ гениям.xgboost load model in C++ (python -> C++ предсказание несоответствие)
Я тренировался (и успешно испытано) xgboost модель питона так:
dtrain
=xgb.DMatrix(np.asmatrix(X_train),label=np.asarray(y_train,dtype=np.int), feature_names=feat_names)
optimal_model = xgb.train(plst, dtrain)
dtest = xgb.DMatrix(np.asmatrix(X_test),feature_names=feat_names)
optimal_model.save_model('sigdet.model')
Я следовал пост на XgBoost (see link), который объясняет, как правильно загрузить и применить прогноз в C++:
// Load Model
g_learner = std::make_unique<Learner>(Learner::Create({}));
std::unique_ptr<dmlc::Stream> fi(
dmlc::Stream::Create(filename, "r"));
g_learner->Load(fi.get());
// Predict
DMatrixHandle h_test;
XGDMatrixCreateFromMat((float *)features, 1, numFeatures , -999.9f, &h_test);
xgboost::bst_ulong out_len;
std::vector<float> preds;
g_learner->Predict((DMatrix*)h_test,true, &preds);
Моя задача (1): мне нужно создать DMatrix *, однако у меня только DMatrixHandle. Как правильно создать DMatrix с моими данными?
Моя проблема (2): Когда я попробовал следующий метод предсказания:
DMatrixHandle h_test;
XGDMatrixCreateFromMat((float *)features, 1, numFeatures , -999.9f, &h_test);
xgboost::bst_ulong out_len;
int res = XGBoosterPredict(g_modelHandle, h_test, 1, 0, &out_len, (const float**)&scores);
я получаю совершенно разные результаты, чем загрузив точно такую же модель и использовать ее для прогнозирования (в питон).
Кто поможет мне достичь согласованных результатов на C++ и python, вероятно, пойдет на небеса. BTW, мне нужно применить предсказание в C++ для приложения реального времени, иначе я бы использовал другой язык.