使用pickle加载XGBoost模型后获取feature_names报KeyError: None
解决XGBoost模型加载后访问feature_names报KeyError: None的问题
可能的原因及对应解决方案:
版本兼容性问题
不同XGBoost版本对feature_names的存储方式存在差异,之前正常现在报错大概率是版本更新导致的。- 对比之前正常运行时的XGBoost版本,尝试降级/升级到对应版本测试。
- 如果是sklearn接口的模型(
XGBClassifier/XGBRegressor),可尝试访问内部booster对象的特征名:cols_when_model_builds = xgb_model.get_booster().feature_names
模型类型不匹配
加载的模型可能是原生xgboost.Booster而非sklearn包装后的模型,两者访问特征名的方式不同:- 先打印模型类型确认:
print(type(xgb_model)) - 如果是原生Booster,可通过以下方式获取特征名:
# 从模型属性中获取 cols_when_model_builds = xgb_model.attributes().get('feature_names') # 或从特征权重中提取(仅包含有权重的特征) cols_when_model_builds = list(xgb_model.get_score(importance_type='weight').keys())
- 先打印模型类型确认:
模型文件损坏或路径错误
加载的模型文件可能损坏,或者路径指向了错误的旧文件:- 确认
path指向的是正确的模型文件,尝试重新保存一次训练好的模型再加载:# 重新保存模型(如果还有可用的模型对象) pickle.dump(xgb_model, open("new_model_path.pkl", "wb")) # 加载新保存的模型 xgb_model = pickle.load(open("new_model_path.pkl", "rb"))
- 确认
内容的提问来源于stack exchange,提问作者Gun
相关产品推荐
相关产品推荐

