无法使用 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