【问题标题】:LightGBM produces same probabilities on any input (C++)LightGBM 在任何输入上产生相同的概率 (C++)
【发布时间】: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


    【解决方案1】:

    我遇到了类似的问题,在我的情况下,我发现问题出在模型中的 is_linear 属性上。 我比较了从binary_classification 示例生成的模型与我正在使用的模型,我注意到示例中的模型对每棵树都有is_linear=0 属性。在我的模型上它丢失了。 然后我检查了c++代码,发现如果缺少这个属性,描述这个的变量是true。我将其默认设置为false,这对我有用。 因为我最近才开始使用 LGBM 模型和 c++,所以我无法提供更多细节。

    【讨论】:

    • 你太棒了,它解决了问题!但是参数叫linear_tree而不是is_linear,设置为false就可以解决问题了。
    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2012-05-14
    相关资源
    最近更新 更多