【问题标题】:xgboost C api doesn't produce same results as Pythonxgboost C api 不会产生与 Python 相同的结果
【发布时间】:2020-02-09 15:53:42
【问题描述】:

我有一个非常简单的数据集(30 行,32 列)。

我编写了一个 Python 程序来加载数据并训练 XGBoost 模型,然后将模型保存到磁盘。

我还编译了一个使用 libxgboost (C api) 并加载模型进行推理的 C++ 程序。

当使用相同的保存模型时,Python 和 C++ 对相同的输入(全零的单行)给出不同的结果。

xgboost 为 0.90,我已在此处附加所有文件(包括 numpy 数据文件):

https://www.dropbox.com/s/txao5ugq6mgssz8/xgboost_mismatch.tar?dl=0

这是两个程序的输出(其源代码在 .tar 文件中):

Python 程序

(在构建模型时打印几个字符串,然后打印单个数字输出)

$ python3 jl_functions_tiny.py
Loading data
Creating model
Training model
Saving model
Deleting model
Loading model
Testing model
[587558.2]

C++ 程序

(发出一个明显与单个 Python 数字输出不匹配的数字)

$ ./jl_functions
628180.062500

【问题讨论】:

  • “删除模型”是什么意思?从内存中删除,但仍然存在于磁盘中?
  • 没错。由于 Python 的垃圾收集器,这实际上是无关紧要的,但我明确删除了它以证明新加载的模型仅来自磁盘而不是其他任何地方。
  • 想知道你是否解决了这个问题。使用 1.1.1 将模型保存为 json 并在 C++ 中加载也会在我正在尝试的模型上给出不同的结果。

标签: python c++ machine-learning xgboost


【解决方案1】:

a) 您将模型另存为 model.save,它存在特征向量排序问题,您可以使用 model.dump 尝试 xgboost load model in c++ (python -> c++ prediction scores mismatch)

b) 请检查你的 python 代码,你没有使用稀疏矩阵来创建模型——我的直觉说问题就在这里

免责声明:我不是 c++ 专家或任何优秀的人,但我发现这可能是预测不匹配的原因,我没有任何环境可以方便地测试和分享你的 C++结果。

【讨论】:

  • 我在 Python (model_dump) 和 C++ (XGBoosterDumpModel) 中转储了模型。结果完全相同相同,这是一个很好的迹象,表明它们都能够以相同的方式在模型中读取。我还重新检查了代码(请参阅问题中的 tarball 以供参考),我绝对没有使用稀疏矩阵。感谢这两个想法。但即使特征的顺序不同,C++ 和 Python 代码都向模型输入全零,因此它们仍然应该具有相同的输出。所以我认为虽然你的想法非常棒,但我仍然陷入困境。
【解决方案2】:

python 和 C++ 中的不同种子参数可能会导致不同的结果,因为算法中存在随机性,请尝试在第 11 行 xgb.XGBregressor 中设置 seed= 在 python 和 C++ 中相同,甚至通过 numpy 使用 numpy.random.seed(0)在 C++ 中,种子参数来自 /workspace/include/xgboost/generic_parameters.h

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 2016-04-20
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多