2016-09-05 4 views
2

Я обращаюсь ко всем 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++ для приложения реального времени, иначе я бы использовал другой язык.

ответ

2

Чтобы получить DMatrix вы можете сделать это:

g_learner->Predict(static_cast<std::shared_ptr<xgboost::DMatrix>*>(h_test)->get(), true, &pred); 

Для задачи (2), у меня нет ответа. На самом деле это та же самая проблема. У меня есть XGBRegression в python, и я получаю разные результаты с теми же функциями на C++.

0

Вот пример, но предсказания программы одинаковы:

const int cols=3,rows=100; 
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<50;i++) 
    train_labels[i] = 0; 
for (int i=50;i<rows;i++) 
    train_labels[i] = 1; 


// 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, "objective", "binary:logistic"); 
XGBoosterSetParam(h_booster, "eval_metric", "error"); 
XGBoosterSetParam(h_booster, "silent", "0"); 
XGBoosterSetParam(h_booster, "max_depth", "9"); 
XGBoosterSetParam(h_booster, "eta", "0.1"); 
XGBoosterSetParam(h_booster, "min_child_weight", "3"); 
XGBoosterSetParam(h_booster, "gamma", "0.6"); 
XGBoosterSetParam(h_booster, "colsample_bytree", "1"); 
XGBoosterSetParam(h_booster, "subsample", "1"); 
XGBoosterSetParam(h_booster, "reg_alpha", "10"); 

// perform 200 learning iterations 
for (int iter=0; iter<10; iter++) 
    XGBoosterUpdateOneIter(h_booster, iter, h_train[0]); 

// predict 
const int sample_rows = 100; 
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); 

 Смежные вопросы

  • Нет связанных вопросов^_^