使用 joblib 加载腌制的 scikit-learn 模型时出现 KeyError

KeyError when loading pickled scikit-learn model using joblib

我有一个对象,其中包含两个 scikit-learn 模型,一个 IsolationForest 和一个 RandomForestClassifier,我想对其进行 pickle 和稍后 unpickle 并用于生成预测。除了这两个模型之外,该对象还包含几个 StandardScaler 和几个 Python 列表。

使用 joblib 对该对象进行腌制是没有问题的,但是当我稍后尝试对其进行 unpickle 时,出现以下异常:

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 和 unpickles,因此 scikit-learnjoblib 和其他库的版本相同。鉴于模糊的错误,我不确定从哪里开始调试。有什么想法或指示吗?

这个问题的解决方案非常平庸:在没有意识到的情况下,我使用 sklearn.externals.joblib 中的 joblib 版本进行酸洗,但更新版本的 joblib 用于解开对象。当我为这两个任务使用更新版本的 joblib 时,问题得到了解决。

我碰巧使用 from sklearn.externals import joblib 导出模型并尝试使用 import joblib 加载。

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

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

就我而言,我试图加载 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