是否可以在 Python 中训练 xgboost 模型并将其部署在 C/C++ 中运行?

Posted

技术标签:

【中文标题】是否可以在 Python 中训练 xgboost 模型并将其部署在 C/C++ 中运行?【英文标题】:Is it possible to train an xgboost model in Python and deploy it Run it in C/C++? 【发布时间】:2018-11-09 22:04:36 【问题描述】:

不同语言 API 之间有多少交叉兼容性?

例如,是否可以用 Python 训练和保存模型并用 C/C++ 或任何其他语言运行它?

我会自己尝试一下,但是我在非 Python 语言方面的技能非常有限。

【问题讨论】:

【参考方案1】:

您可以将模型转储到文本文件中,如下所示:

model.get_booster().dump_model('xgb_model.txt')

然后你应该解析文本转储并在 C++ 中重现预测函数。

如果您想节省一些时间并确保使用快速实现,我已经在我称为 FastForest 的小库中实现了这一点:

https://github.com/guitargeek/XGBoost-FastForest

图书馆的使命是:

简单:部署您的 xgboost 模型应该尽可能轻松 快速:由于高效的数组结构数据结构用于存储树,这个库在你的 CPU 和内存上非常容易(它在预测方面比 xgboost 快大约 3 到 5 倍)李> 安全:FastForest 对象是不可变的,因此它们是多线程环境中的绝佳选择 可移植:FastForest 除了 C++ 标准库之外没有其他依赖项

这里是一个小例子,加载你之前转储的模型并假设模型需要 5 个特征:

std::vector<std::string> features"f0",  "f1",  "f2",  "f3",  "f4";
FastForest fastForest("xgb_model.txt", features);

std::vector<float> input0.0, 0.2, 0.4, 0.6, 0.8;
float output = fastForest(input.data());

当您创建 FastForest 时,您必须告诉它您打算按什么顺序传递特征,因为文本文件不存储特征的顺序。

另请注意,FastForest 不会为您进行逻辑转换,因此为了重现 predict_proba(),您需要应用逻辑转换:

float proba = 1./(1. + std::exp(-output));

【讨论】:

【参考方案2】:

treelite 包(research paper、documentation)支持将基于树的模型(包括 XGBoost)编译为优化的 C 代码,从而比使用原生模型库更快地进行推理。

【讨论】:

【参考方案3】:

您可以考虑使用将模型转储到文本文件中

model.get_booster().dump_model('xgb_model.txt', with_stats=True)

然后,经过一些解析,您可以轻松地在 C/C++ 中重现 .predict() 函数。对于其余部分,我不知道将 xgboost 本地移植到 C

【讨论】:

以上是关于是否可以在 Python 中训练 xgboost 模型并将其部署在 C/C++ 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

xgboost 中的多输出回归

在分类列上训练 xgboost 时遇到问题

原创xgboost 特征评分的计算原理

python基于tpot训练模型并抑制输出stackingestimator而是输出单模型例如xgboost设置

Python 中解释 XGBoost 模型的学习曲线

从多个 csv 文件创建 libsvm 用于 xgboost 外部内存训练