【发布时间】:2020-08-27 09:34:29
【问题描述】:
我已经在具有 5 个类(分类问题)的数据集上使用 python 训练了一个 LGBM 模型 (gbdt),并且我能够在测试集上做出正确的推断,并将该模型加载到 python 脚本中。 现在我需要在 C++ 程序中使用这个模型。为此,我导出了这个模型,并在 C++ 中加载了它以进行推理。问题在于,在 C++ 中,输出概率始终相同,因此我无法选择获胜者类别(每个类别的结果始终为 0.2)。
为了保存模型,我尝试了这两种方法。 首先,我尝试将模型保存为字符串:
s = lgb_model.model_to_string(num_iteration=114)
f = open('model_out.txt','w')
f.write(s)
f.close()
第二个直接用保存模型方法:
lgb_model.save_model('model_out.txt')
为了在 C++ 中加载模型,我使用了这个没有错误:
int ret = LGBM_BoosterLoadModelFromString(model_string, &num_iter, &booster_handle);
为了进行推断,我准备了一个输入缓冲区并将其传递给此函数:
int res = LGBM_BoosterPredictForMat(booster_handle, input_data, C_API_DTYPE_FLOAT64,
n_row, n_cols, 1, C_API_PREDICT_NORMAL, 0, -1,"", &out_len, out_result);
我得到了一个有 5 行的矩阵,每个样本有一列,如下所示:
0.2
0.2
0.2
0.2
0.2
我尝试通过大量更改进行推断,但结果始终相同(随机输入、不同参数等)。此外,我检查了加载的模型,试图用这个函数重新转储它,结果似乎是正确的:
LGBM_BoosterDumpModel(booster_handle, 0, -1, C_API_FEATURE_IMPORTANCE_SPLIT, 1, &out_len, out_string);
我哪里错了?
【问题讨论】:
标签: python c++ machine-learning xgboost lightgbm