xgboost - python模型与c ++模型不同

时间:2016-05-23 18:40:00

标签: python c++ xgboost

考虑xgboost fit函数的以下python实现:

import xgboost as xgb
booster = xgb.XGBRegressor(
                base_score = 50, max_depth = 8, n_estimators=200,
                learning_rate=0.05, nthread=-1, subsample=1,
                colsample_bytree=1, min_child_weight = 1, scale_pos_weight = 1,
                seed=0, silent = False)
booster.fit(xValues, yValues, eval_metric="rmse")

我必须将其转换为c ++(由于无数原因)。我使用c_api创建矩阵,学习者的功能是训练:

XGDMatrixCreateFromMat(&xValues[0], rowCount, colCount, 0, &dMatrix);
XGDMatrixSetFloatInfo(dMatrix, "label", &yValues[0], rowCount);

learner = xgboost::Learner::Create(dMatrix);
learner->Configure(learnerConfig); //same config params as above
learner->InitModel();

for(int i = 0; i < 200; ++i)
    learner->UpdateOneIter(i, xValues);

auto fo(dmlc::Stream::Create("save.model", "w"));
learner->Save(fo.get());

从技术上讲,这应该提供Python和C ++的类似模型。但是,当我使用两个模型完全相同的预测函数时,我从这两个模型得到的预测变化很大。

我做错了什么?

编辑:

我重写了C ++函数以便在整个过程中使用c_api:

BoosterHandle h_booster;
XGBoosterCreate(dmats, 1, &h_booster);

for(auto cfg : m_learnerConfig)
  XGBoosterSetParam(h_booster, cfg.first.c_str(), cfg.second.c_str());

for(size_t iter = 0; iter < nNumTrees; ++iter)
  XGBoosterUpdateOneIter(h_booster, iter, matrices[0]);

XGBoosterSaveModel(h_booster, filename);

生成的模型没有变化。 C ++模型倾向于提供比python模型更高的预测值。但是,它并不一致。

只是为了确认:为了比较,我使用两个保存的模型文件在C ++中使用相同的预测代码/逻辑。

这是一个如何区别的样本。 xgboost prediction - C++ vs Python models

0 个答案:

没有答案