sklearn
gli stimatori implementano metodi per semplificare il salvataggio delle proprietà addestrate rilevanti di uno stimatore. Alcuni stimatori implementano i __getstate__
metodi stessi, ma altri, come il GMM
giusto, utilizzano l' implementazione di base che salva semplicemente il dizionario interno degli oggetti:
def __getstate__(self):
try:
state = super(BaseEstimator, self).__getstate__()
except AttributeError:
state = self.__dict__.copy()
if type(self).__module__.startswith('sklearn.'):
return dict(state.items(), _sklearn_version=__version__)
else:
return state
Il metodo consigliato per salvare il modello su disco è utilizzare il pickle
modulo:
from sklearn import datasets
from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris.data[:100, :2]
y = iris.target[:100]
model = SVC()
model.fit(X,y)
import pickle
with open('mymodel','wb') as f:
pickle.dump(model,f)
Tuttavia, è necessario salvare ulteriori dati in modo da poter riqualificare il modello in futuro o subire conseguenze terribili (come essere bloccato in una vecchia versione di sklearn) .
Dalla documentazione :
Al fine di ricostruire un modello simile con le versioni future di scikit-learn, è necessario salvare metadati aggiuntivi lungo il modello in decapaggio:
I dati di allenamento, ad esempio un riferimento a un'istantanea immutabile
Il codice sorgente di Python utilizzato per generare il modello
Le versioni di scikit-learn e le sue dipendenze
Il punteggio di convalida incrociata ottenuto sui dati di allenamento
Ciò è particolarmente vero per gli stimatori di Ensemble che si basano sul tree.pyx
modulo scritto in Cython (come IsolationForest
), poiché crea un accoppiamento con l'implementazione, che non è garantito per essere stabile tra le versioni di sklearn. In passato ha visto cambiamenti incompatibili.
Se i tuoi modelli diventano molto grandi e il caricamento diventa un fastidio, puoi anche utilizzare il più efficiente joblib
. Dalla documentazione:
Nel caso specifico dello scikit, potrebbe essere più interessante utilizzare la sostituzione di joblib di pickle
( joblib.dump
& joblib.load
), che è più efficiente su oggetti che portano internamente grandi array intorpiditi come spesso accade per gli stimatori di scikit-learning montati, ma può solo decapare sul disco e non su una stringa: