sklearn
Schätzer implementieren Methoden, die es Ihnen erleichtern, relevante trainierte Eigenschaften eines Schätzers zu speichern. Einige Schätzer implementieren __getstate__
Methoden selbst, sondern andere, wie die GMM
gerade die Verwendung Basisimplementierung , die einfach speichert die inneren Wörterbuch - Objekte:
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
Die empfohlene Methode zum Speichern Ihres Modells auf einer Disc ist die Verwendung des pickle
Moduls:
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)
Sie sollten jedoch zusätzliche Daten speichern, damit Sie Ihr Modell in Zukunft neu trainieren können oder schwerwiegende Folgen haben (z. B. die Bindung an eine alte Version von sklearn) .
Aus der Dokumentation :
Um ein ähnliches Modell mit zukünftigen Versionen von scikit-learn neu zu erstellen, sollten zusätzliche Metadaten entlang des ausgewählten Modells gespeichert werden:
Die Trainingsdaten, zB ein Verweis auf einen unveränderlichen Schnappschuss
Der Python-Quellcode, der zum Generieren des Modells verwendet wird
Die Versionen von scikit-learn und seine Abhängigkeiten
Die Kreuzvalidierungsbewertung, die anhand der Trainingsdaten erhalten wurde
Dies gilt insbesondere für Ensemble-Schätzer , die sich auf das tree.pyx
in Cython geschriebene Modul stützen (z. B. IsolationForest
), da dadurch eine Kopplung an die Implementierung hergestellt wird, die zwischen den Versionen von sklearn nicht garantiert stabil ist. In der Vergangenheit gab es rückwärts inkompatible Änderungen.
Wenn Ihre Modelle sehr groß werden und das Laden zu einem Ärgernis wird, können Sie auch das effizientere verwenden joblib
. Aus der Dokumentation:
Im speziellen Fall des Scikits kann es interessanter sein, Joblibs Ersatz von pickle
( joblib.dump
& joblib.load
) zu verwenden, der bei Objekten effizienter ist, die intern große Anzahl von Arrays tragen, wie dies häufig bei angepassten Scikit-Lernschätzern der Fall ist, aber nur beizen kann auf die Festplatte und nicht auf eine Zeichenfolge: