如何保存和加载 xgboost 模型? [关闭]

Posted

技术标签:

【中文标题】如何保存和加载 xgboost 模型? [关闭]【英文标题】:How to save & load xgboost model? [closed] 【发布时间】:2017-04-29 03:05:03 【问题描述】:

来自XGBoost guide:

训练完成后,模型就可以保存了。

bst.save_model('0001.model')

模型及其特征图也可以转储到文本文件中。

# dump model
bst.dump_model('dump.raw.txt')
# dump model with feature map
bst.dump_model('dump.raw.txt', 'featmap.txt')

可以按如下方式加载保存的模型:

bst = xgb.Booster('nthread': 4)  # init model
bst.load_model('model.bin')  # load data

我的问题如下。

    save_modeldump_model 有什么区别? 保存'0001.model''dump.raw.txt','featmap.txt'有什么区别? 为什么加载的模型名称model.bin与要保存的名称0001.model不同? 假设我训练了两个模型:model_Amodel_B。我想保存这两个模型以备将来使用。我应该使用哪个saveload 函数?您能帮忙展示一下清晰的流程吗?

【问题讨论】:

您已经问了很多问题,但如果您有兴趣可以查看save_modeldump_modelload_model 的代码:github.com/dmlc/xgboost/blob/master/python-package/xgboost/… 如果您的 XGBoost 模型是使用 sklearn 包装器训练的,您仍然可以使用“bst.save_model()”保存模型并使用“bst = xgb.Booster().load_model()”加载它。当你使用'bst.predict(input)'时,你需要将你的输入转换成DMatrix。 我更多地使用joblibs。相关讨论见pickle vs joblibs和sklearn guide for saving model 【参考方案1】:

这是我解决问题的方法:

import pickle
file_name = "xgb_reg.pkl"

# save
pickle.dump(xgb_model, open(file_name, "wb"))

# load
xgb_model_loaded = pickle.load(open(file_name, "rb"))

# test
ind = 1
test = X_val[ind]
xgb_model_loaded.predict(test)[0] == xgb_model.predict(test)[0]

Out[1]: True

【讨论】:

如果您的模型保存在pickle中,升级xgboost版本时可能会失去支持 这是一个合法的用例 - 例如,酸洗是保存 sklearn 管道的官方建议。这必然意味着,如果一个人有一个包含 XGBoost 模型的 sklearn 管道,他们最终必须腌制 XGBoost。如果担心将来某个地方,XGBoost 的更新可能会破坏 pickle 的行为,这就是存在版本固定(和单元测试)的原因。【参考方案2】:

save_modeldump_model这两个函数都保存模型,区别在于dump_model可以保存特征名称和保存树为文本格式。

load_model 将与来自save_model 的模型一起使用。来自dump_model 的模型可以与xgbfi 一起使用。

在加载模型的过程中,您需要指定保存模型的路径。在示例中,bst.load_model("model.bin") 模型是从文件 model.bin 加载的 - 它只是带有模型的文件名。祝你好运!

编辑:来自 Xgboost 文档(对于版本 1.3.3),dump_model() 应用于保存模型以供进一步解释。要保存和加载模型,应使用 save_model()load_model()。详情请查看docs。

Xgboost 的Learning APIScikit-Learn API 也有区别。后者保存在训练期间设置的best_ntree_limit 变量,并提前停止。详情可以看我的文章How to save and load Xgboost in Python?

save_model()方法识别文件名的格式,如果指定*.json,则模型保存为JSON,否则为文本文件。

【讨论】:

【参考方案3】:

保存和加载 xgboost 模型的简单方法是使用 joblib 库。

import joblib
#save model
joblib.dump(xgb, filename) 

#load saved model
xgb = joblib.load(filename)

【讨论】:

如果你想跨语言加载和保存模型是不好的。例如,您想在 python 中训练模型,但在 java 中进行预测。 这是 XGB 开发人员在使用 xgboost 的 sklearn API 时建议的方法。 XGBClassifier & XGBRegressor 应该通过pickle格式这样保存。 它说在python3.8上不推荐使用joblib 在不同版本的 Xgboost 上保存和加载为 pickle 时会出现不兼容问题。【参考方案4】:

不要使用 pickle 或 joblib,因为这可能会引入对 xgboost 版本的依赖。保存和恢复模型的规范方法是 load_modelsave_model

如果您想存储或归档模型以进行长期存储,请使用 save_model (Python) 和 xgb.save (R)。

This 是 XGBoost 最新版本的相关文档。它还解释了dump_modelsave_model 之间的区别。

请注意,您可以在使用 bst.save_model 时指定 json 作为扩展名,将模型序列化/反序列化为 json。如果保存和恢复模型的速度对您来说并不重要,这非常方便,因为它允许您对模型进行适当的版本控制,因为它是一个简单的文本文件。

【讨论】:

【参考方案5】:

如果您使用的是 sklearn api,您可以使用以下内容:


xgb_model_latest = xgboost.XGBClassifier() # or which ever sklearn booster you're are using

xgb_model_latest.load_model("model.json") # or model.bin if you are using binary format and not the json

如果您使用上述 booster 方法进行加载,您将在 python api 中获得 xgboost booster,而不是 sklearn api 中的 sklearn booster。

是的,如果您使用的是 sklearn api,这似乎是加载保存的 xgboost 模型数据的最 Pythonic 方式。

【讨论】:

我用过这个方法但是在使用xgb_model_latest.get_params()时没有得到之前保存的模型的参数。 我也有同样的问题。 没有这个问题。默认值以我不喜欢的方式处理。但我确实得到了我输入的参数。我使用的是 1.2.1。随意发布您的代码以尝试和工作。

以上是关于如何保存和加载 xgboost 模型? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

R语言构建xgboost模型:使用xgb.DMatrix保存加载数据集使用getinfo函数抽取xgb.DMatrix结构中的数据

如何从 xgboost 中的最佳迭代中保存模型?

如何使用 XGboost 进行微调

使用 python 将 xgboost 模型保存到 hdfs

xgboost公式推导

将xgboost二进制预测保存到提交csv文件