2015-11-03 32 views
7

我做了一個示例程序來訓練使用sklearn的SVM。這裏是代碼sklearn使用joblib轉儲模型,轉儲多個文件。哪一個是正確的模型?

from sklearn import svm 
from sklearn import datasets 
from sklearn.externals import joblib 

clf = svm.SVC() 
iris = datasets.load_iris() 
X, y = iris.data, iris.target 
clf.fit(X, y) 

print(clf.predict(X)) 
joblib.dump(clf, 'clf.pkl') 

當我轉儲模型文件時,我得到這個數量的文件。 :

[ 'clf.pkl', 'clf.pkl_01.npy', 'clf.pkl_02.npy', 'clf.pkl_03.npy', 'clf.pkl_04.npy',「clf.pkl_05。 npy','clf.pkl_06.npy','clf.pkl_07.npy','clf.pkl_08.npy','clf.pkl_09.npy','clf.pkl_10.npy','clf.pkl_11.npy' ]

我很困惑,如果我做錯了什麼。或者這是正常的?什麼是* .npy文件。爲什麼有11?

+3

想必這些都是'numpy'陣列存儲數據,'加載回來的時候joblib'了'.pkl'會尋找那些'np'陣列和加載後,我才意識到模型數據 – EdChum

+1

,如果我使用joblib.dump(clf,'clf.pkl',compress = 9)我只得到1個clf.pkl文件。所以我假設你說的那些是數組。在加載過程中,我手動加載或自動加載? –

+0

我希望他們自動加載,只是試試 – EdChum

回答

11

要將所有內容保存到1個文件中,您應該將壓縮設置爲True或任意數字(例如1)。

但是您應該知道,對於joblib dump/load的主要功能,np數組的分離表示是必需的,joblib可以使用np數組加載和保存比Pickle更快的對象,這與Pickle joblib可以使用memmap numpy數組正確保存和加載對象。如果你想讓整個對象有一個文件序列化(並且不想保存memmap np數組) - 我認爲在這種情況下使用Pickle,AFAIK會更好一些joblib dump/load功能將以相同的速度工作泡菜。

import numpy as np 
from scikit-learn.externals import joblib 

vector = np.arange(0, 10**7) 

%timeit joblib.dump(vector, 'vector.pkl') 
# 1 loops, best of 3: 818 ms per loop 
# file size ~ 80 MB 
%timeit vector_load = joblib.load('vector.pkl') 
# 10 loops, best of 3: 47.6 ms per loop 

# Compressed 
%timeit joblib.dump(vector, 'vector.pkl', compress=1) 
# 1 loops, best of 3: 1.58 s per loop 
# file size ~ 15.1 MB 
%timeit vector_load = joblib.load('vector.pkl') 
# 1 loops, best of 3: 442 ms per loop 

# Pickle 
%%timeit 
with open('vector.pkl', 'wb') as f: 
    pickle.dump(vector, f) 
# 1 loops, best of 3: 927 ms per loop 
%%timeit          
with open('vector.pkl', 'rb') as f: 
    vector_load = pickle.load(f) 
# 10 loops, best of 3: 94.1 ms per loop 
相關問題