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

joblib加载已训练LightGBM模型后报Estimator not fitted错误如何解决?

问题原因

  • LightGBM 提供的 Sklearn 接口 LGBMRegressor 的序列化逻辑和原生 Sklearn 估计器不同:拟合生成的树结构存储在 _Booster 属性中,拟合状态标记存储在 fitted_ 属性中,这两个属性用通用的 pickle 序列化很容易丢失,跨 LightGBM 版本加载时丢失概率更高。
  • 你打印模型只能看到初始化的超参数,看不到内部的状态属性,所以会出现「结构参数正常但提示未拟合」的情况。

解决方案

方案1:使用 LightGBM 原生序列化接口(稳定性最高)

不要用通用的 joblib/pickle 序列化,用 LightGBM 自带的保存加载逻辑:

# 训练完成后保存
model.booster_.save_model("lgb_regressor_model.txt")

加载时按如下方式处理即可直接使用 Sklearn 接口的 predict 方法:

import lightgbm as lgb
from lightgbm import LGBMRegressor

# 加载训练好的 booster
loaded_booster = lgb.Booster(model_file="lgb_regressor_model.txt")
# 封装为 LGBMRegressor 实例
loaded_model = LGBMRegressor()
loaded_model._Booster = loaded_booster
# 补全拟合状态标记
loaded_model.fitted_ = True
# 如果需要保留原超参数,可以在保存模型时同步把 model.get_params() 的结果用 json 存下来,加载后调用 loaded_model.set_params(**超参数字典)

方案2:修复 joblib 序列化兼容问题

如果要继续用 joblib 序列化,需要满足两个前提:训练和加载环境的 LightGBM 版本完全一致,保存和加载都用 joblib 的接口:

# 保存
import joblib
joblib.dump(model, "lgb_model.joblib")

# 加载
loaded_model = joblib.load("lgb_model.joblib")
# 手动补全缺失的拟合状态标记
if not hasattr(loaded_model, "fitted_"):
    loaded_model.fitted_ = True

验证方法

加载完成后先执行以下代码校验状态:

# 两个输出都为 True 即可正常调用 predict
print(hasattr(loaded_model, "_Booster"))
print(hasattr(loaded_model, "fitted_"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:36:03