簡體   English   中英

使用 joblib 加載腌制 scikit-learn 模型時出現 KeyError

[英]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-learnjoblib等庫的版本是一樣的。 鑒於模糊的錯誤,我不確定從哪里開始調試。 任何想法或指示?

對此的解決方案非常平庸:在沒有意識到這一點的情況下,我使用joblib中的sklearn.externals.joblib版本進行酸洗,但使用較新版本的joblibjoblib對象。 當我將較新版本的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM