首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LightGBM在任何输入上产生相同的概率(C++)

LightGBM在任何输入上产生相同的概率(C++)
EN

Stack Overflow用户
提问于 2020-08-27 17:34:30
回答 1查看 275关注 0票数 2

我已经用python在一个有5个类(分类问题)的数据集上训练了一个LGBM模型(gbdt),并且我能够在测试集上做出正确的推断,将该模型加载到python脚本中。现在我需要在C++程序中使用这个模型。为此,我导出了此模型,并将其存放在C++中以进行推断。问题是,在C++中,输出概率总是相同的,所以我不能选择获胜类(每个类的结果总是0.2)。

为了保存模型,我尝试了以下两种方法。首先,我尝试保存一个类似于字符串的模型:

代码语言:javascript
运行
复制
s = lgb_model.model_to_string(num_iteration=114)
f = open('model_out.txt','w')
f.write(s)
f.close()

第二个直接使用save model方法:

代码语言:javascript
运行
复制
lgb_model.save_model('model_out.txt')

为了在C++中加载模型,我使用了以下代码,没有出现错误:

代码语言:javascript
运行
复制
    int ret = LGBM_BoosterLoadModelFromString(model_string, &num_iter, &booster_handle);

为了进行推断,我准备了一个输入缓冲区,并将其传递给此函数:

代码语言:javascript
运行
复制
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行的矩阵,每个样本有一列,如下所示:

代码语言:javascript
运行
复制
0.2 
0.2 
0.2 
0.2 
0.2

我试着用很多变化来进行推断,但结果总是相同的(随机输入,不同的参数,等等)。此外,我检查了加载的模型,试图用这个函数重新转储它,结果似乎是正确的:

代码语言:javascript
运行
复制
LGBM_BoosterDumpModel(booster_handle, 0, -1, C_API_FEATURE_IMPORTANCE_SPLIT, 1, &out_len, out_string);

我哪里错了?

EN

回答 1

Stack Overflow用户

发布于 2021-01-15 03:44:45

我遇到了类似的问题,在我的例子中,我发现问题出在模型中的is_linear属性上。我将从binary_classification示例中生成的模型与我正在使用的模型进行了比较,并注意到示例中的模型具有每个树的is_linear=0属性。在我的模型中,它丢失了。然后,我检查了c++代码,发现如果缺少此属性,则描述此属性的变量为true。我将其设置为false作为默认值,这对我来说很有效。我不能给出更多细节,因为我最近才开始使用LGBM模型和c++。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63613150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档