低版本XGBoost重存模型是否影响性能?跨环境加载遇错求助
跨XGBoost版本加载模型的解决方案及性能疑问
我在本地Python 3.9.6 + XGBoost==1.6.1环境中,通过以下代码用pickle保存了模型:
filename = 'model.sav' pickle.dump(model, open(filename, 'wb'))
但需要将该模型加载到Python 3.6.9 + XGBoost==1.5.2的环境中,且无法升级目标环境的Python版本以适配XGBoost1.6.1。请问有什么办法能在该环境中打开模型?若在本地卸载重装旧版XGBoost并重存模型,是否会影响模型性能?
更新:尝试解决方案后出现错误
我尝试了James提供的解决方案,但出现如下错误:
File "/home/ubuntu/.local/lib/python3.6/site-packages/xgboost/core.py", line 218, in _check_call raise XGBoostError(py_str(_LIB.XGBGetLastError())) xgboost.core.XGBoostError: [14:36:00] ../include/xgboost/json.h:73: 类型转换无效,从整数转为布尔值 堆栈跟踪: [bt] (0) /home/ubuntu/.local/lib/python3.6/site-packages/xgboost/lib/libxgboost.so(+0xcb05d) [0x7fe0cb50b05d] [bt] (1) /home/ubuntu/.local/lib/python3.6/site-packages/xgboost/lib/libxgboost.so(+0xd40a5) [0x7fe0cb5140a5] [bt] (2) /home/ubuntu/.local/lib/python3.6/site-packages/xgboost/lib/libxgboost.so(+0x24a7f0) [0x7fe0cb68a7f0] [bt] (3) /home/ubuntu/.local/lib/python3.6/site-packages/xgboost/lib/libxgboost.so(+0x1996f2) [0x7fe0cb5d96f2] [bt] (4) /home/ubuntu/.local/lib/python3.6/site-packages/xgboost/lib/libxgboost.so(+0x17a712) [0x7fe0cb5ba712] [bt] (5) /home/ubuntu/.local/lib/python3.6/site-packages/xgboost/lib/libxgboost.so(+0x1b6432) [0x7fe0cb5f6432] [bt] (6) /home/ubuntu/.local/lib/python3.6/site-packages/xgboost/lib/libxgboost.so(XGBoosterLoadModel+0x5c8) [0x7fe0cb4dec08]
可行解决方案
方案1:用XGBoost原生格式导出/导入(优先推荐)
XGBoost自带的模型存储格式兼容性远优于pickle,在Python 3.9.6 + XGBoost==1.6.1环境中执行:
# 用原生格式保存模型 model.save_model('model.xgb')
然后在目标环境Python 3.6.9 + XGBoost==1.5.2中加载:
import xgboost as xgb # 原生Booster模型加载 model = xgb.Booster() model.load_model('model.xgb') # 若是Scikit-learn接口的XGBClassifier/XGBRegressor from xgboost import XGBClassifier model = XGBClassifier() model.load_model('model.xgb')
方案2:回退本地XGBoost版本重存模型(无性能影响)
卸载本地高版本XGBoost,安装1.5.2:
pip uninstall xgboost -y pip install xgboost==1.5.2
在Python3.9.6+XGBoost1.5.2环境中重新加载原pickle模型,再重新保存:
import pickle model = pickle.load(open('model.sav', 'rb')) pickle.dump(model, open('model_v152.sav', 'wb'))
关于性能影响:只要不修改模型的结构、训练参数和权重,仅仅用旧版本XGBoost重新保存,完全不会影响模型预测性能。因为保存的是模型训练后的核心数据(树结构、特征权重等),XGBoost同系列小版本(1.5.x到1.6.x)对这些数据的存储逻辑是兼容的,重存只是转换为旧版本能识别的序列化格式。
针对更新中的错误处理
你遇到的「整数转布尔值」类型错误,是因为XGBoost1.6.1序列化时将部分布尔参数用整数格式存储,而1.5.2的解析逻辑无法识别。这种情况下直接用方案1的原生格式导出/导入就能解决问题,原生格式的兼容性设计就是为了规避这类跨版本序列化差异。
内容的提问来源于stack exchange,提问作者mjoy
相关产品推荐
相关产品推荐

