Python 使用joblib加载pickled scikit学习模型时出现KeyError

Python 使用joblib加载pickled scikit学习模型时出现KeyError,python,python-3.x,scikit-learn,joblib,Python,Python 3.x,Scikit Learn,Joblib,我有一个对象,其中包含两个scikit learn模型,一个IsolationForest和一个RandomForestClassifier,我想对其进行pickle,然后取消pickle,并使用它生成预测。除了这两个模型之外,该对象还包含两个StandardScalers和两个Python列表 使用joblib对该对象进行酸洗是没有问题的,但是当我稍后尝试取消对其进行酸洗时,会出现以下异常: Traceback (most recent call last): File "<stdin

我有一个对象,其中包含两个
scikit learn
模型,一个
IsolationForest
和一个
RandomForestClassifier
,我想对其进行pickle,然后取消pickle,并使用它生成预测。除了这两个模型之外,该对象还包含两个
StandardScaler
s和两个Python列表

使用
joblib
对该对象进行酸洗是没有问题的,但是当我稍后尝试取消对其进行酸洗时,会出现以下异常:

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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/(…)/python3.5/site packages/joblb/numpy_pickle.py”,第578行,已加载
obj=_unpickle(fobj,文件名,mmap_模式)
文件“/home/(…)/python3.5/site packages/jobli/numpy\u pickle.py”,第508行,在_unpickle中
obj=取消勾选器加载()
文件“/usr/lib/python3.5/pickle.py”,第1039行,已加载
分派[键[0]](自身)
关键错误:0

同一个应用程序同时pickle和unpickle对象,因此
scikit-learn
joblib
和其他库的版本是相同的。考虑到模糊的错误,我不确定从哪里开始调试。有什么想法或建议吗?

解决这个问题的方法很老套:在没有意识到的情况下,我在
sklearn.externals.joblib
中使用了
joblib
的版本来进行酸洗,而在
joblib
中使用了较新版本来取消对象的酸洗。当我对这两项任务使用较新版本的
joblib
时,问题得到了解决。

我碰巧使用sklearn.externals import joblib导出了模型,并尝试使用
import joblib

加载。我很感兴趣。我使用的是
git lfs
,因此文件已被更改,而joblib无法打开它们。所以我需要运行
gitlfs pull
来获取实际的文件。因此,如果您使用的是兼容的joblib版本,请确保您的文件不会以某种方式更改

对我来说,相同版本的joblib用于转储和加载,但我将文件保存在python 3.7.4下,并尝试使用python 3.7.6加载,这引发了相同的keyrerror。

在我的例子中,我尝试加载XGB。我发现它与其他sklearn型号不兼容,因此我采取了以下措施:

从xgboost导入*
导入作业库
def get_模型(模型路径):
如果模型_路径中的“xgb”:
xgb_model=XGBClassifier()
xgb_模型。加载_模型(模型路径)
型号=xgb\U型号
其他:
模型=获取对象(模型路径)
回归模型
xbg=get_model('Models/xgb_v1.pkl')#一个xgb
tree=model=get_model('Models/dt_v1.pkl')#一个决策树

您的电脑上是否安装了最新版本的scikit?能否生成最小的可复制代码?hello@haroba我也面临同样的问题,您能告诉我您必须使用哪个版本吗?我使用的是joblib-0.13.0 versionbanal,但很有用;)