考虑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 ++中使用相同的预测代码/逻辑。