Python 加载对象时Pickle EOF错误
我保存了一个模型对象,如下所示:Python 加载对象时Pickle EOF错误,python,scikit-learn,pickle,Python,Scikit Learn,Pickle,我保存了一个模型对象,如下所示: with open('bestModel_smv_3class_version2data.pickle','wb') as f: pickle.dump(jpsa_svm_3class.g_cv.best_estimator_,f) 现在,当我尝试加载它时,它给出了一个错误 with open('bestModel_smv_3class_version2data.pickle','rb') as f: svm_bestModel=pickle.
with open('bestModel_smv_3class_version2data.pickle','wb') as f:
pickle.dump(jpsa_svm_3class.g_cv.best_estimator_,f)
现在,当我尝试加载它时,它给出了一个错误
with open('bestModel_smv_3class_version2data.pickle','rb') as f:
svm_bestModel=pickle.load(f)
错误:
EOFError Traceback (most recent call last)
<ipython-input-66-df8734c64828> in <module>()
8
9 with open('bestModel_smv_3class_version2data.pickle','rb') as f:
---> 10 svm_bestModel=pickle.load(f)
EOFError: Ran out of input
EOFError回溯(最近一次调用)
在()
8.
9将open('bestModel_smv_3class_version2data.pickle','rb')作为f:
--->10 svm_bestModel=酸洗负荷(f)
EOFError:输入不足
pickle
无法处理sklearn
模型,因为它们包含numpy
数组。改为使用joblib.dump
,这与此类似,但它们都有保存/加载大型numpy
数组的特殊情况
但是pickle不能存储python类对象吗?如果我的类对象有一个属性是sklearn model呢?请看我问的这个问题,还没有得到答案。问题是我的模型和类对象已经被pickle了。我现在需要加载它们以进一步使用它是的
python
类对象,numpy
使用的数据表示形式不完全是python
类对象,而是以C
或Fortran
顺序高效地存储数据数组。不管您是否将它们封装在python
类pickle
中,都必须能够对所有内容进行反序列化,而不仅仅是对象容器。很抱歉,我带来了坏消息,但您需要再次训练您的模型,并使用joblib
将它们持久化pickle
文件没有任何用处。我不确定您是否获得了前面评论中的链接。如您所见,它能够加载pickle类。然后使用加载的pickle类,我可以在那里检索属性。但问题是,加载代码只在训练模型的笔记本中起作用。另一个试图加载该类的笔记本给出了如linI所示的错误。我不知道您上一个问题中发生了什么,可能模型不适合,因此不包含numpy数组,但我可以从个人经验告诉您,pickle
无法处理适合的sklearn
模型,改用joblib
。指示pickle很好(这不会让我感到惊讶,因为他们可能为所有类定义了特殊的pickle行为,包括使用numpy自己的数组pickle def),而joblib只是在性能方面更加专业。官方的例子也使用香草泡菜。也许会仔细检查一下这个文件是否正确。我会再做一次,用一些更小的,快速安装的模型。也许上次出了什么问题(硬盘空间、系统内存、其他一些崩溃)。当然,你不会在不同的版本/系统上进行酸洗/去酸洗,对吗?