9. Persistencia del modelo

Después de entrenar un modelo de scikit-learn, es deseable tener una manera de persistir el modelo para su uso futuro sin tener que volver a entrenar. Las siguientes secciones te dan algunas pistas sobre cómo persistir un modelo de scikit-learn.

9.1. Serialización específica de Python

Es posible guardar un modelo en scikit-learn utilizando el modelo de persistencia incorporado en Python, concretamente pickle <https://docs.python.org/3/library/pickle.html>:

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> X, y= datasets.load_iris(return_X_y=True)
>>> clf.fit(X, y)
SVC()

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

En el caso específico de scikit-learn, puede ser mejor utilizar el reemplazo de joblib de pickle (dump & load), que es más eficiente en los objetos que llevan grandes arreglos numpy internamente como es a menudo el caso de los estimadores ajustados de scikit-learn, pero sólo puede hacer pickle al disco y no a una cadena:

>>> from joblib import dump, load
>>> dump(clf, 'filename.joblib') 

Más tarde puedes volver a cargar el modelo trabajado con pickle (posiblemente en otro proceso de Python) con:

>>> clf = load('filename.joblib') 

Nota

Las funciones dump y load también aceptan objetos tipo archivo en lugar de nombres de archivo. Más información sobre la persistencia de datos con Joblib está disponible aquí.

9.1.1. Limitaciones de seguridad y mantenimiento

pickle (y joblib por extensión), tiene algunos inconvenientes de mantenimiento y seguridad. Por esto,

  • Nunca uses unpickle en datos no confiables ya que podrían conducir a que se ejecute código malicioso al cargar.

  • Aunque los modelos guardados usando una versión de scikit-learn pueden cargarse en otras versiones, esto no es compatible y no es aconsejable. También hay que tener en cuenta que las operaciones realizadas sobre tales datos podrían dar resultados diferentes e inesperados.

Para reconstruir un modelo similar con futuras versiones de scikit-learn, los metadatos adicionales deben guardarse a lo largo del modelo trabajado con pickle:

  • 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 debería permitir comprobar que la puntuación de validación cruzada está en el mismo rango que antes.

Dado que la representación interna de un modelo puede ser diferente en dos arquitecturas distintas, volcar un modelo en una arquitectura y cargarlo en otra no es un comportamiento admitido, aunque pueda funcionar en algunos casos. Para superar el problema de la portabilidad, los modelos pickle se suelen desplegar en producción utilizando contenedores, como docker.

Si quieres saber más sobre estos temas y explorar otros posibles métodos de serialización, consulta esta charla de Alex Gaynor.

9.2. Formatos interoperables

Para las necesidades de reproducibilidad y control de calidad, cuando se deben tener en cuenta diferentes arquitecturas y entornos, exportar el modelo en formato Open Neural Network Exchange o en formato Predictive Model Markup Language (PMML) puede ser un mejor enfoque que utilizar sólo pickle. Estos son útiles cuando se quiere utilizar el modelo para la predicción en un entorno diferente al que se entrenó el modelo.

ONNX es una serialización binaria del modelo. Se ha desarrollado para mejorar la usabilidad de la representación interoperable de los modelos de datos. Su objetivo es facilitar la conversión de los modelos de datos entre diferentes frameworks de aprendizaje automático, y mejorar su portabilidad en diferentes arquitecturas computacionales. Más detalles están disponibles en el tutorial ONNX. Para convertir el modelo de scikit-learn a ONNX se ha desarrollado una herramienta específica sklearn-onnx.

PMML es una implementación del estándar de documentos XML definido para representar modelos de datos junto con los datos utilizados para generarlos. Al ser legible por humanos y máquinas, el PMML es una buena opción para la validación de modelos en diferentes plataformas y para su archivo a largo plazo. Por otro lado, como XML en general, su verbosidad no ayuda en producción cuando el rendimiento es crítico. Para convertir el modelo scikit-learn a PMML se puede utilizar por ejemplo sklearn2pmml distribuido bajo la licencia Affero GPLv3.