MLFlow加载XGBoost模型后调用plot_importance无特征名如何解决?
问题原因
这不是你存储方式的错误,是MLflow对XGBoost模型的默认序列化逻辑导致的特性:
XGBoost模型存储预测必需的权重参数时,不会主动把feature_names属性纳入默认序列化字段,MLflow的mlflow.xgboost.log_model默认仅保留模型预测所需的核心内容,你从MLflow加载回来的模型可以正常执行预测逻辑,但feature_names属性为空,因此xgboost.plot_importance只能用f0、f1这类自动生成的编号代替原始特征名。
修复方案
你可以通过调整存储、加载逻辑解决该问题,不需要修改原有模型训练逻辑:
- 存储阶段,在调用
mlflow.xgboost.log_model的同时,额外把训练使用的特征名列表存入MLflow:
# 训练时的特征名列表示例 feature_names = ["col_1", "col_2", "col_3"] # 原有模型存储逻辑 mlflow.xgboost.log_model(model, "model") # 新增:存储特征名,可选择存为参数或者独立的文本/JSON artifact mlflow.log_param("train_feature_names", ",".join(feature_names))
- 加载阶段,读取模型后手动把特征名赋值回模型对象即可:
model = mlflow.xgboost.load_model("models:/model_uri") # 读取当前run下存储的特征名 run = mlflow.get_run(RUN_ID) loaded_feature_names = run.data.params["train_feature_names"].split(",") # 赋值回模型属性 model.feature_names = loaded_feature_names # 此时可正常绘制带特征名的重要性图 xgboost.plot_importance(model)
如果你使用的是scikit-learn接口的XGBClassifier/XGBRegressor,需要确保训练时在
fit方法中传入了feature_names参数,否则原生模型本身也不会保留特征名属性。
内容的提问来源于stack exchange,提问作者McDizzy
相关产品推荐
相关产品推荐

