2013-07-07 30 views
33

Sto utilizzando un DBN (deep belief network) da nolearn basato su scikit-learn.Python scikit-learn: esportazione del classificatore addestrato

Ho già creato una rete in grado di classificare i miei dati molto bene, ora mi interessa esportare il modello per la distribuzione, ma non so come (sto addestrando il DBN ogni volta che voglio prevedere qualcosa). In MATLAB vorrei solo esportare la matrice di peso e importarlo in un'altra macchina.

Qualcuno sa come esportare il modello/la matrice di peso da importare senza dover addestrare nuovamente l'intero modello?

+2

Hai provato a serializzare semplicemente il modello con il modulo [pickle] (http://docs.python.org/2/library/pickle.html)? – ffriend

+0

@ amico - no, ma ci proverò. Grazie! – jcdmb

risposta

54

È possibile utilizzare:

>>> from sklearn.externals import joblib 
>>> joblib.dump(clf, 'my_model.pkl', compress=9) 

E poi, sul server previsione:

>>> from sklearn.externals import joblib 
>>> model_clone = joblib.load('my_model.pkl') 

Questo è fondamentalmente una salamoia Python con una gestione ottimizzata per grandi array numpy. Ha le stesse limitazioni del sottaceto normale w.r.t. modifica del codice: se la struttura della classe dell'oggetto pickle cambia, potresti non essere più in grado di disimpegnare l'oggetto con nuove versioni di nolearn o scikit-learn.

Se si desidera archiviare a lungo termine i parametri del modello, potrebbe essere necessario scrivere il proprio livello IO (ad esempio utilizzando strumenti di serializzazione del formato binario come buffer di protocollo o avro o una rappresentazione testo/json/xml inefficiente e portatile come PMML).

+1

Ottiene 'RuntimeError: profondità massima di ricorsione superata' con' joblib.dump (clf, 'my_model.pkl', compress = 9) '. –

+1

Vedere https://github.com/dnouri/nolearn/issues/271 –

2

La sezione 3.4. Model persistence nella documentazione di scikit-learn copre praticamente tutto.

Oltre a sklearn.externals.joblib ogrisel indicato, mostra come utilizzare il normale pacchetto di salamoia:

>>> from sklearn import svm 
>>> from sklearn import datasets 
>>> clf = svm.SVC() 
>>> iris = datasets.load_iris() 
>>> X, y = iris.data, iris.target 
>>> clf.fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, 
    kernel='rbf', max_iter=-1, probability=False, random_state=None, 
    shrinking=True, tol=0.001, verbose=False) 

>>> import pickle 
>>> s = pickle.dumps(clf) 
>>> clf2 = pickle.loads(s) 
>>> clf2.predict(X[0]) 
array([0]) 
>>> y[0] 
0 

e dà un paio di avvertimenti come i modelli salvati in una versione di scikit-learn potrebbe non caricare in un altro versione.

7

Pickling/Unpickling ha lo svantaggio di funzionare solo con le versioni Python corrispondenti (maggiori e forse anche minori) e con le versioni sklearn e joblib.

Esistono formati di output descrittivi alternativi per i modelli di apprendimento automatico, come quelli sviluppati dallo Data Mining Group, come il linguaggio di markup dei modelli predittivi (PMML) e il formato portatile per l'analisi (PFA). Dei due, PMML è much better supported.

modo da avere la possibilità di salvare un modello da scikit-learn in PMML (ad esempio utilizzando sklearn2pmml), e quindi distribuire ed eseguirlo in java, scintilla, o alveare utilizzando jpmml (ovviamente si hanno più scelte).

+0

Ciò sembra buono, ma cosa succede se la distribuzione è anche basata su Python? Esiste un 'pmml2sklearn'? – VillasV

Problemi correlati