使用joblib加载pickle scikit-learn模型时的KeyError

时间:2018-02-23 12:43:06

标签: python python-3.x scikit-learn joblib

我有一个对象,其中包含两个scikit-learn模型,一个IsolationForest和一个RandomForestClassifier,我想要腌制,然后将其取消并用于生成预测。除了这两个模型之外,该对象还包含几个StandardScaler和几个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

同一个应用程序都会对对象进行pickle和unpickle,因此scikit-learnjoblib和其他库的版本是相同的。鉴于模糊的错误,我不确定从哪里开始调试。任何想法或指针?

4 个答案:

答案 0 :(得分:7)

和我一起,发生了我使用from sklearn.externals import joblib导出模型并尝试使用import joblib加载模型的情况。

答案 1 :(得分:0)

我的很有趣。我正在使用git-lfs,因此文件已更改,joblib无法打开它们。因此,我需要运行git lfs pull来获取实际文件。因此,如果您使用兼容的Joblib版本,请确保您的文件没有以某种方式更改!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

就我而言,我试图加载XGB。我发现XGB与其他sklearn模型不兼容,所以我做了以下事情:

from xgboost import *
import joblib

def get_model(model_path):
    if 'xgb' in model_path:
        xgb_model = XGBClassifier()
        xgb_model.load_model(model_path)
        model = xgb_model
    else: 
        model = get_obj(model_path)
    return model 

xbg = get_model('Models/xgb_v1.pkl') # an xgb

tree = model = get_model('Models/dt_v1.pkl') # a decition tree