【问题标题】:How to save & load xgboost model? [closed]如何保存和加载 xgboost 模型? [关闭]
【发布时间】:2017-09-27 05:34:06
【问题描述】:

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

我的问题如下。

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

【问题讨论】:

标签: python machine-learning save xgboost


【解决方案1】:

我在这里找到了方法,因为我正在寻找一种方法来保存和加载我的 xgboost 模型。以下是我解决问题的方法:

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。随意发布您的代码以尝试和工作。
      猜你喜欢
      • 2020-01-03
      • 1970-01-01
      • 2019-05-31
      • 2021-12-15
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多