[英]KeyError when loading pickled scikit-learn model using joblib
我有一個對象,其中包含兩個scikit-learn
模型,一個IsolationForest
和一個RandomForestClassifier
,我想對它們進行pickle,然后對其進行unpickle 並用於生成預測。 除了這兩個模型之外,該對象還包含幾個StandardScaler
和幾個 Python 列表。
使用joblib
這個對象進行joblib
是沒有問題的,但是當我稍后嘗試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
同一個應用程序同時對對象進行joblib
和unpickles,所以scikit-learn
、 joblib
等庫的版本是一樣的。 鑒於模糊的錯誤,我不確定從哪里開始調試。 任何想法或指示?
對此的解決方案非常平庸:在沒有意識到這一點的情況下,我使用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 下並嘗試使用引發相同 KeyError 的 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.