web-dev-qa-db-ja.com

joblibを使用してピクルされたscikit-learnモデルをロードするときのKeyError

その中に、2つのscikit-learnモデル、IsolationForestRandomForestClassifierを含むオブジェクトがあります。このオブジェクトをピクルし、後でアンピクルして、予測の生成に使用します。 2つのモデルとは別に、オブジェクトには2つのStandardScalersと2つのPythonリストが含まれています。

joblibを使用してこのオブジェクトをpickle化することは問題ありませんが、後で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

同じアプリケーションがオブジェクトのピクルとピクルを解除するため、scikit-learnjoblibと他のライブラリのバージョンは同じです。漠然としたエラーのため、どこからデバッグを開始すればよいかわかりません。アイデアやアドバイスはありますか?

12
haroba

これに対する解決策はかなり平凡でした:気付かずに、私はsklearn.externals.joblibjoblibのバージョンを酸洗いに使用していましたが、オブジェクトのunpickleに新しいバージョンのjoblibを使用していました。両方のタスクに新しいバージョンのjoblibを使用すると、問題は解決しました。

15
haroba

たまたま、from sklearn.externals import joblibを使用してモデルをエクスポートし、import joblibを使用してロードしようとしました。

9
Marcos Paulo

鉱山は面白かった。 git-lfsしたがって、ファイルは変更されており、joblibはそれらを開くことができませんでした。だから私はgit lfs pull実際のファイルを取得します。したがって、互換性のあるjoblibバージョンを使用している場合は、ファイルが何らかの方法で変更されていないことを確認してください。

1
Iman Mirzadeh