You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

xgboost=1.5.2版本序列化XGBClassifier反序列化后调用predict方法报'XGBModel'对象无'enable_categorical'属性错误

解决XGBClassifier加载后预测报错AttributeError: 'XGBModel' object has no attribute 'enable_categorical'

问题分析

虽然你已经确保训练和预测环境的xgboost版本都是1.5.2,但这个错误大多是因为模型序列化/反序列化过程中,xgboost的内部属性没有被正确保存或恢复。enable_categorical是xgboost中用于处理类别特征的隐含属性,当用sklearn的joblib保存封装后的XGBClassifier时,这个属性可能没有被完整序列化,导致加载后缺失。

解决方案

方案1:手动补充缺失的属性

这是最快速的修复方式,加载模型后直接为对象添加缺失的enable_categorical属性,默认设为False(你的原模型参数未启用类别特征处理,所以用默认值即可):

import joblib

clf_model = joblib.load(model_path)
# 手动添加缺失的enable_categorical属性
clf_model.enable_categorical = False
# 执行预测
clf_preds = clf_model.predict(clf_data_transformed)

方案2:改用xgboost原生保存/加载方法

joblib是sklearn的序列化工具,对xgboost的内部结构支持不够完善。改用xgboost自带的方法保存模型,能更完整地保留模型状态:

训练时保存模型:

# 保存模型的核心booster部分
clf_model.get_booster().save_model("xgb_trained.model")
# 单独保存模型参数,方便后续恢复
import json
with open("xgb_params.json", "w") as f:
    json.dump(clf_model.get_params(), f)

预测时加载模型:

from xgboost import XGBClassifier
import json

# 初始化分类器并加载模型
clf_model = XGBClassifier()
clf_model.load_model("xgb_trained.model")
# 加载并设置原模型的所有参数
with open("xgb_params.json", "r") as f:
    params = json.load(f)
clf_model.set_params(**params)
# 执行预测
clf_preds = clf_model.predict(clf_data_transformed)

方案3:统一环境的xgboost安装方式

如果前两种方法无效,检查训练和预测环境的xgboost安装渠道是否一致:

  • 确保两边用相同的包管理器安装(比如都是conda,或都是pip)
  • 尝试重新安装xgboost=1.5.2:
    # conda安装
    conda install xgboost=1.5.2 -c conda-forge
    # pip安装
    pip install xgboost==1.5.2
    

内容的提问来源于stack exchange,提问作者Obiii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:57:32