使用 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-learn
、joblib
和其他库的版本相同。鉴于模糊的错误,我不确定从哪里开始调试。有什么想法或指示吗?
这个问题的解决方案非常平庸:在没有意识到的情况下,我使用 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
我有一个对象,其中包含两个 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-learn
、joblib
和其他库的版本相同。鉴于模糊的错误,我不确定从哪里开始调试。有什么想法或指示吗?
这个问题的解决方案非常平庸:在没有意识到的情况下,我使用 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