导入训练好的xgboost的pickle文件时经常出现以下错误:
xgboost.core.XGBoostError: [20:26:28] /Users/runner/work/xgboost/xgboost/python-package/build/temp.macosx-10.9-x86_64-cpython-38/xgboost/src/learner.cc:1222: Check failed: header == serialisation_header_:
If you are loading a serialized model (like pickle in Python, RDS in R) generated by
older XGBoost, please export the model by calling `Booster.save_model` from that version
first, then load it back in current version. See:
https://xgboost.readthedocs.io/en/latest/tutorials/saving_model.html
for more details about differences between saving model and serializing.
Stack trace:
[bt] (0) 1 libxgboost.dylib 0x000000011bc736d5 dmlc::LogMessageFatal::~LogMessageFatal() + 117
[bt] (1) 2 libxgboost.dylib 0x000000011bd99427 xgboost::LearnerIO::Load(dmlc::Stream*) + 2599
[bt] (2) 3 libxgboost.dylib 0x000000011bc962e2 XGBoosterUnserializeFromBuffer + 146
[bt] (3) 4 libffi.8.dylib 0x0000000105468972 ffi_call_unix64 + 82
[bt] (4) 5 ??? 0x00007ff7bb473540 0x0 + 140701975655744
问题分析:
这个问题通常是训练xgboost模型,存储模型pickle文件时的xgboost版本与目前读取使用pickle文件的xgboost版本不一致导致的。
解决办法:
1、一般想到的解决办法时,重新安装当前使用pickle文件的xgboost版本,使其与训练模型时的版本一致,但进场会出现以下问题:
重新安装当前的xgboost的版本可能会导致一系列附属包的安装问题
2、还可以尝试解决办法
将老版本xgboost的pickle文件保存为.bin文件形式,如下:
# 当前环境为老版本Python环境
import xgboost as xgb
import pickle
#利用booster升级模型版本 --使用架构升级中的xgboost版本升级模型文件
booster = xgb.Booster()
path00 = 'xxxxx/'
booster.load_model(path00+'xgboost_model.bin')
在新版本xgboost环境中导入.bin文件:
import xgboost as xgb
import pickle
#利用booster升级模型版本 --使用架构升级中的xgboost版本升级模型文件
booster = xgb.Booster()
path00 = 'xxxxxx/'
booster.load_model(path00+'xgboost_model.bin')
#加载模型
ret_path ='xxxxxxx/'
pickle.dump(booster,open(ret_path+"xgboost_model.pickle","wb"))