2015-11-03 15 views
7

Ho fatto un programma di esempio per addestrare un SVM usando sklearn. Ecco il codicesklearn scarica il modello usando joblib, scarica più file. Qual è il modello corretto?

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') 

Quando eseguo il dump del file di modello, ottengo questa quantità di file. :

[ '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 ' ]

Sono confuso se ho fatto qualcosa di sbagliato. O è normale? Cosa sono i file * .npy. E perché ce ne sono 11?

+3

Presumibilmente queste sono 'array numpy' per i dati,' joblib' quando si carica di nuovo il '.pkl' cercherà quei array' np' e caricare di nuovo i dati del modello – EdChum

+1

Ho appena realizzato che se uso joblib.dump (clf, 'clf.pkl', compress = 9) Ottengo solo 1 file clf.pkl. Quindi presumo che, come hai affermato, quelli siano array insensati. Durante il caricamento ho caricato tutto manualmente o caricato automaticamente? –

+0

Mi aspetto che vengano caricati automaticamente, basta provarlo. – EdChum

risposta

11

Per salvare tutto in 1 file, è necessario impostare la compressione su True o qualsiasi numero (ad esempio 1).

Ma è necessario sapere che la rappresentazione separata degli array np è necessaria per le funzionalità principali di joblib dump/load, joblib può caricare e salvare oggetti con array np più velocemente di Pickle a causa di questa rappresentazione separata, e al contrario di Pickle joblib può salva e carica correttamente gli oggetti con gli array numpy di memmap. Se vuoi avere una serializzazione di file di un intero oggetto (e non vuoi salvare memmap np array) - penso che sarebbe meglio usare Pickle, AFAIK in questo caso la funzionalità dli/dload di joblib funzionerà alla stessa velocità di Salamoia.

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