我已经用python在一个有5个类(分类问题)的数据集上训练了一个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()
第二个直接使用save model方法:
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);
我哪里错了?
发布于 2021-01-15 03:44:45
我遇到了类似的问题,在我的例子中,我发现问题出在模型中的is_linear
属性上。我将从binary_classification
示例中生成的模型与我正在使用的模型进行了比较,并注意到示例中的模型具有每个树的is_linear=0
属性。在我的模型中,它丢失了。然后,我检查了c++代码,发现如果缺少此属性,则描述此属性的变量为true
。我将其设置为false
作为默认值,这对我来说很有效。我不能给出更多细节,因为我最近才开始使用LGBM模型和c++。
https://stackoverflow.com/questions/63613150
复制相似问题