sklearn
Les estimateurs mettent en œuvre des méthodes pour vous permettre d'enregistrer facilement les propriétés entraînées pertinentes d'un estimateur. Certains estimateurs implémentent les __getstate__
méthodes eux-mêmes, mais d'autres, comme le GMM
utilisent simplement l' implémentation de base qui enregistre simplement le dictionnaire interne des objets:
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
La méthode recommandée pour enregistrer votre modèle sur disque consiste à utiliser le pickle
module:
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)
Cependant, vous devez enregistrer des données supplémentaires afin de pouvoir recycler votre modèle à l'avenir, ou subir des conséquences désastreuses (comme être verrouillé dans une ancienne version de sklearn) .
De la documentation :
Afin de reconstruire un modèle similaire avec les futures versions de scikit-learn, des métadonnées supplémentaires doivent être enregistrées le long du modèle pickled:
Les données d'apprentissage, par exemple une référence à un instantané immuable
Le code source python utilisé pour générer le modèle
Les versions de scikit-learn et ses dépendances
Le score de validation croisée obtenu sur les données d'entraînement
Ceci est particulièrement vrai pour les estimateurs Ensemble qui s'appuient sur le tree.pyx
module écrit en Cython (tel que IsolationForest
), car il crée un couplage à l'implémentation, qui n'est pas garanti pour être stable entre les versions de sklearn. Il a vu des changements rétrocompatibles dans le passé.
Si vos modèles deviennent très volumineux et que le chargement devient une nuisance, vous pouvez également utiliser les plus efficaces joblib
. De la documentation:
Dans le cas spécifique du scikit, il peut être plus intéressant d'utiliser le remplacement de joblib de pickle
( joblib.dump
& joblib.load
), qui est plus efficace sur les objets qui portent de grands tableaux numpy en interne comme c'est souvent le cas pour les estimateurs scikit-learn ajustés, mais ne peut que décaper au disque et non à une chaîne: