使用Pickle、JSON和JobLib保存加载XGBoost模型时出错
XGBoost模型加载失败问题分析与解决
错误原因解析
报错Check failed: str[0] == '{'说明XGBoost在解析模型文件时,预期文件为JSON格式(以{开头),但实际读取到的内容不符合该格式。常见诱因包括:
- 版本不兼容:Colab环境的XGBoost版本与本地机器版本差异过大,不同版本的模型存储结构存在变化,导致解析失败。
- 保存/加载方式不匹配:混用第三方库(pickle/joblib)与XGBoost原生加载方法。比如用pickle保存的模型,却调用
model.load_model()加载——该方法仅识别XGBoost原生的二进制或JSON格式文件。 - 文件损坏:模型文件在保存或下载过程中中断、篡改,导致内容不完整,开头并非预期的
{。
解决步骤
统一XGBoost版本
在Colab和本地分别执行以下命令,确认版本是否一致:import xgboost print(xgboost.__version__)若版本不同,将本地版本升级/降级至与Colab一致(例如执行
pip install xgboost==<对应版本号>)。使用XGBoost原生方法保存加载
优先使用XGBoost自带的API,兼容性最佳:- 保存为二进制格式:
model.save_model('xgb_reg_model.model') - 加载模型:
from xgboost import XGBRegressor model = XGBRegressor() model.load_model('xgb_reg_model.model')
若需保存为JSON格式,同样使用原生方法:
model.save_model('xgb_reg_model.json') # 加载 model.load_model('xgb_reg_model.json')- 保存为二进制格式:
正确使用pickle/joblib
若必须用第三方库保存,加载时不要调用XGBoost的load_model(),直接用对应库加载:- 保存(joblib示例):
import joblib joblib.dump(model, 'xgb_reg_model.sav') - 加载:
import joblib model = joblib.load('xgb_reg_model.sav')
- 保存(joblib示例):
检查模型文件完整性
打开JSON格式的模型文件,确认开头为{。若不是,说明文件损坏,重新在Colab保存模型并完整下载到本地。
内容的提问来源于stack exchange,提问作者Pedro Chaves
相关产品推荐
相关产品推荐

