使用joblib.load()后,LightGBM出现“Estimator未拟合错误”。

3

我使用了LGBMRegressor()模型进行拟合并预测了一些值。我决定保存它(在拟合之后),以便以后使用,但是当我尝试加载模型时,我收到了以下异常:

Estimator not fitted, call fit before exploiting the model.

我尝试了三种不同的保存方式:
  • dump(model, 'model.txt')
  • dump(model, 'model.pkl')
  • dump(model, 'model.joblib')
然后我关闭了IDE,接着按照以下方式尝试加载:
  • model = joblib.load('model.allExtensionsMentionedBefore')
当我print(model)时,我可以看到整个模型以及它的超参数。
LGBMRegressor(colsample_bytree=0.9596645565436184,
              learning_rate=0.025825537313443326, min_child_samples=72,
              num_leaves=32, random_state=0, silent=True,
              subsample=0.9311181768429686, subsample_freq=1)

然而,当我尝试使用model.predict(X)时,出现了异常,提示它没有适配。

我做错了什么吗?

PS:我能够使用sklearn MLPRegressor()完成这个过程(保存和加载),并且它完美地工作。


1
通常这种情况发生是因为您将模型从一个lightgbm版本<3.3.0的环境保存,并将其加载到另一个具有lightgbm版本>=3.3.1的环境中。未拟合错误可以通过以下步骤解决:1)加载模型:model = joblib.load(modelpath);2)更改模型内的“fitted”布尔属性,如下所示:model.fitted_ = True;3)然后尝试正常预测。这对我起作用了;另一种选择是确保您在保存和加载模型时具有相同的conda环境(特别是相同的lgbm版本)。 - Tom
2个回答

2
"lightgbm"支持使用"joblib"保存和加载模型。
以下是一个minimal, reproducible example,演示如何实现。我使用Python 3.3.8、"lightgbm==3.3.1"、"joblib==1.0.1"、"numpy==1.21.0"和"scikit-learn==0.24.1"测试了这段代码。
在新的Python会话中:
import joblib
import lightgbm as lgb
from sklearn.datasets import make_regression

X, y = make_regression(n_samples=10_000, n_features=10)
reg = lgb.LGBMRegressor(
    n_estimators=10,
    verbose=-1,
)

reg.fit(X, y)
joblib.dump(reg, 'lgb.pkl')

然后,在同一工作目录下运行一个单独的Python会话:
import joblib
from sklearn.datasets import make_regression

X, y = make_regression(n_samples=1_000, n_features=10)
reg = joblib.load('lgb.pkl')
preds = reg.predict(X)

我尝试使用 lightgbm==3.0.0从2020年8月起)执行相同的代码,也能够正常工作。

谢谢您的回答,我想我遇到了一些版本问题。它已经可以工作了! - KabaL

0
我曾经遇到过类似的问题。我的情况是,我在一个conda环境中保存了模型,但在另一个环境中加载。由于lightgbm版本差异导致了问题。如果你正在使用环境,请确保从同一个环境保存和加载模型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接