我有一个对象,其中包含两个scikit-learn
模型,一个IsolationForest
和一个RandomForestClassifier
,我想对它们进行pickle和unpickle,然后使用它们来生成预测。除了这两个模型之外,该对象还包含两个StandardScaler
和两个Python列表。
使用joblib
pickle这个对象是没有问题的,但是当我稍后尝试取消pickle时,我得到了下面的异常:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/(...)/python3.5/site-packages/joblib/numpy_pickle.py", line 578, in load
obj = _unpickle(fobj, filename, mmap_mode)
File "/home/(...)/python3.5/site-packages/joblib/numpy_pickle.py", line 508, in _unpickle
obj = unpickler.load()
File "/usr/lib/python3.5/pickle.py", line 1039, in load
dispatch[key[0]](self)
KeyError: 0
同一个应用程序同时pickle和unpickle对象,所以scikit-learn
,joblib
和其他库的版本是相同的。我不确定从哪里开始调试,给出模糊的错误。有什么想法或建议吗?
6条答案
按热度按时间6kkfgxo01#
这个问题的解决方案相当平庸:我在
sklearn.externals.joblib
中使用joblib
的版本进行pickle操作,但没有意识到这一点,而是使用了新版本的joblib
来取消pickle对象。当我使用新版本的joblib
执行这两项任务时,问题得到了解决。eni9jsuy2#
在我身上,发生了我使用
from sklearn.externals import joblib
导出模型并尝试使用import joblib
加载的情况。pw136qt23#
我的版本很有趣。我使用的是
git-lfs
,因此文件被更改,joblib无法打开它们。所以我需要运行git lfs pull
来获得实际的文件。所以如果您使用的是兼容的joblib版本,请确保您的文件没有被更改!r6vfmomb4#
对我来说,相同版本的joblib被用于转储和加载,但我在python 3.7.4下保存文件,并试图用python 3.7.6加载,这引发了相同的KeyError。
xzv2uavs5#
在我的例子中,我试图加载一个XGB。我发现XGB与其他sklearn模型不兼容,所以我做了以下操作:
jaql4c8m6#
我试图加载多年的joblib文件,这给出了多个级别的错误,这取决于我用来绕过它们的黑客。
随着joblib版本的不断增加,黑客不再工作,我不得不创建一个专门针对
sklearn-0.23
的conda环境:conda create -n outdated "scikit-learn<0.23"
之后,我可以打开文件并以不同的方式保存它们,这有时意味着用非sklearn joblib文件
import joblib
重新保存数据;有时这意味着使用pickle
;有时这意味着使用pandas.to_csv
。该解决方案特定于为后代重新保存的数据文件。