无法使用 joblib 保存 scikit-learn 模型?

Posted

技术标签:

【中文标题】无法使用 joblib 保存 scikit-learn 模型?【英文标题】:Cannot save scikit-learn model using joblib? 【发布时间】:2020-04-21 17:12:26 【问题描述】:

我有结合了 tensorflow 和 scikit-learn 的 Ensemble 模型。我想将这个 Ensemble 模型保存为一个盒子来输入数据并生成输出。我的代码如下

def model_base_LSTM(***):
   ***
model = model_base_LSTM(***)
ensem_model = BaggingRegressor(base_estimator=model, n_estimators=15)
ensem_model.fit(x_train, y_train)
bag_mod_pred = ensem_model.predict(x_test_bag)

from joblib import dump, load
dump(ensem_model, 'LSTM_Ensemble.joblib')

TypeError: can't pickle _thread._local objects

那么,如何解决这个问题?

【问题讨论】:

您的逻辑中是否发生了某种多线程? 你能解释清楚一点吗? 在谷歌搜索错误时,我得到了reddit.com/r/learnpython/comments/bl2vze/…,它表示您正在尝试存储属于操作系统的threading.lock 对象。 【参考方案1】:

您可以使用 Scikit-Learn 保存您的 TensorFlow(甚至 PyTorch)模型,但前提是您使用 Neuraxle 及其保存机制。

Neuraxle 是 Scikit-Learn 的扩展,使其与所有深度学习库更加兼容。

这个技巧是通过使用Neuraxle-TensorFlow 或Neuraxle-PyTorch 来执行的。

为什么会这样?

使用 Neuraxle-TensorFlow 或 Neuraxle-PyTorch 之一将为您提供一个保护程序,让您的事物能够正确序列化。您希望它被正确序列化,以确保 scikit-learn 和您的深度学习框架在保存或并行化事物等方面的兼容性。您可以阅读 Neuraxle 如何通过储户here 解决此问题。

代码示例

这是一个从 A 到 Z 的完整项目示例,其中TensorFlow is used with Neuraxle as if it was used with Scikit-Learn。

这是另一个实际的例子,TensorFlow is used within a scikit-learn-like pipeline

【讨论】:

以上是关于无法使用 joblib 保存 scikit-learn 模型?的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:无法从“sklearn.externals”导入名称“joblib”

使用 joblib.dump 保存和加载经过训练的 GradientBoostingClassifier

python使用joblib模块保存和加载机器学模型

joblib保存模型和joblib的并行化处理和tqdm

在使用 joblib 加载模型之前检查 sklearn 版本

Joblib 内存使用量不断增长