sklearn
los estimadores implementan métodos para facilitarle el almacenamiento de propiedades capacitadas relevantes de un estimador. Algunos estimadores implementan __getstate__
métodos ellos mismos, pero otros, como el GMM
solo usan la implementación base que simplemente guarda el diccionario interno de objetos:
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
El método recomendado para guardar su modelo en el disco es usar el pickle
módulo:
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)
Sin embargo, debe guardar datos adicionales para poder volver a entrenar su modelo en el futuro o sufrir graves consecuencias (como estar bloqueado en una versión anterior de sklearn) .
De la documentación :
Para reconstruir un modelo similar con futuras versiones de scikit-learn, se deben guardar metadatos adicionales a lo largo del modelo en escabeche:
Los datos de entrenamiento, por ejemplo, una referencia a una instantánea inmutable
El código fuente de Python utilizado para generar el modelo.
Las versiones de scikit-learn y sus dependencias
La puntuación de validación cruzada obtenida en los datos de entrenamiento
Esto es especialmente cierto para los estimadores de Ensemble que se basan en el tree.pyx
módulo escrito en Cython (como IsolationForest
), ya que crea un acoplamiento a la implementación, que no se garantiza que sea estable entre las versiones de sklearn. Ha visto cambios hacia atrás incompatibles en el pasado.
Si sus modelos se vuelven muy grandes y la carga se vuelve una molestia, también puede usar el más eficiente joblib
. De la documentación:
En el caso específico del scikit, puede ser más interesante usar el reemplazo de pickle
( joblib.dump
& joblib.load
) de joblib , que es más eficiente en los objetos que llevan grandes matrices numpy internamente, como suele ser el caso de los estimadores scikit-learn ajustados, pero solo puede encurtir al disco y no a una cadena: