Guardado y carga de modelos Sklearn

En el aprendizaje automático, el proceso de entrenamiento de modelos suele llevar mucho tiempo. Para evitar volver a entrenar el modelo cada vez, podemos guardar el modelo entrenado para poder cargarlo y hacer predicciones más adelante.

scikit-learnSe ofrecen dos formas comunes para guardar y cargar modelos:joblibypickle。

1. UsojoblibGuardado y carga de modelos

joblibes una herramienta eficiente de serialización de Python, especialmente adecuada para guardar objetos que contienen una gran cantidad de arreglos numéricos (como arreglos de numpy, modelos de scikit-learn, etc.). En comparación conpickle,joblibes más eficiente al procesar datos a gran escala.

joblib es una biblioteca externa de Python que se puede instalar con el siguiente comando:

pip install joblib

Guardar modelo

joblib proporciona una API sencilla para guardar y cargar objetos.

Podemos usar el método joblib.dump() para guardar el modelo en un archivo.

Ejemplo

import joblib
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# Cargar datos
data = load_iris()
X, y = data.data, data.target

# Dividir el conjunto de entrenamiento y el de pruebas
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear y entrenar el modelo
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# Guardar el modelo en un archivo
joblib.dump(model, 'svm_model.joblib')

Cargar modelo

Usa el método joblib.load() para cargar el objeto de modelo guardado.

Ejemplo

# Cargar el modelo guardado
loaded_model = joblib.load('svm_model.joblib')

# Usar el modelo cargado para hacer predicciones
y_pred = loaded_model.predict(X_test)

# Imprimir los resultados de la predicción
print("Predictions:", y_pred)

Con los pasos anteriores, hemos guardado correctamente el modelo entrenado en un archivo y podemos cargar el modelo y realizar predicciones en cualquier momento posterior.


2. Uso de pickle para guardar y cargar modelos

pickle es un módulo integrado de Python que permite serializar y deserializar objetos de Python.

Aunque joblib es más adecuado para manejar grandes cantidades de datos, pickle también es una herramienta comúnmente utilizada para guardar y cargar modelos, adecuada para situaciones generales.

Guardar modelo

Al igual que joblib, pickle también tiene una API sencilla para guardar y cargar objetos.

El código para guardar el modelo es el siguiente:

Ejemplo

import pickle
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# Cargar datos
data = load_iris()
X, y = data.data, data.target

# Dividir el conjunto de entrenamiento y el de pruebas
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear y entrenar el modelo
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# Guardar el modelo usando pickle
with open('svm_model.pkl', 'wb') as f:
    pickle.dump(model, f)

Cargar modelo

Usa pickle.load() para cargar el modelo:

Ejemplo

# Cargar el modelo guardado usando pickle
with open('svm_model.pkl', 'rb') as f:
    loaded_model = pickle.load(f)

# Usar el modelo cargado para hacer predicciones
y_pred = loaded_model.predict(X_test)

# Imprimir los resultados de la predicción
print("Predictions:", y_pred)

3、joblib vs pickle

joblib y pickle son dos métodos comunes para guardar y cargar modelos.

joblib es más adecuado para guardar objetos de datos grandes, mientras que pickle es la herramienta estándar de serialización de Python, adecuada para situaciones generales.

  • joblib: normalmente adecuado para guardar objetos que contienen grandes cantidades de datos numéricos (como arreglos de numpy).joblibAl procesar datos a gran escala,picklees más eficiente.
  • pickle: adecuado para guardar objetos más pequeños u objetos de Python comunes. Es una biblioteca integrada de Python, por lo que no requiere instalación adicional.

Si el modelo contiene una gran cantidad de arreglos o matrices numéricas (como máquinas de vectores de soporte, bosques aleatorios, etc.), se recomienda usar joblib, que es más eficiente que pickle. Para modelos más pequeños o que no contienen grandes cantidades de datos numéricos, pickle es suficiente.


4. Guardar y cargar el Pipeline

En aplicaciones reales, el modelo no es solo un modelo único; a veces combina múltiples pasos de procesamiento (como preprocesamiento de datos, selección de características, entrenamiento del modelo, etc.). Estos pasos se pueden realizar con el Pipeline de scikit-learn. Pipeline también se puede guardar y cargar con joblib o pickle.

Guardar el Pipeline:

Ejemplo

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
import joblib

# Crear un Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC(kernel='linear'))
])

# Entrenar el Pipeline
pipeline.fit(X_train, y_train)

# Guardar el Pipeline en un archivo
joblib.dump(pipeline, 'pipeline_model.joblib')

Cargar el Pipeline:

Ejemplo

# Cargar el Pipeline
loaded_pipeline = joblib.load('pipeline_model.joblib')

# Usar el Pipeline cargado para hacer predicciones
y_pred = loaded_pipeline.predict(X_test)

# Imprimir los resultados de la predicción
print("Predictions:", y_pred)

El proceso de guardar y cargar el Pipeline es el mismo que para un modelo único; solo asegúrate de guardar y cargar todo el objeto Pipeline.


5. Gestión de versiones de modelos

En aplicaciones reales de aprendizaje automático, la actualización y la gestión de versiones de modelos son cruciales. Cada vez que se entrena y guarda un modelo, es recomendable agregar una marca de tiempo o un número de versión al nombre del archivo del modelo para distinguir las diferentes versiones. Por ejemplo:

Ejemplo

import time

# Crear una marca de tiempo
timestamp = time.strftime("%Y%m%d-%H%M%S")

# Guardar el modelo con marca de tiempo
joblib.dump(model, f'svm_model_{timestamp}.joblib')

De esta manera, podemos gestionar las diferentes versiones del modelo según la marca de tiempo, lo que facilita el seguimiento y la actualización del modelo.


6. Persistencia con el modelo

Una vez que el modelo está entrenado y guardado, podemos cargarlo en aplicaciones prácticas posteriores para hacer predicciones sin tener que volver a entrenarlo.

Por ejemplo, podemos integrar el modelo guardado con servicios web, trabajos por lotes u otras aplicaciones, de modo que el modelo pueda ser reutilizado sin necesidad de volver a entrenarlo.

Uso del modelo cargado en servicios web

Por ejemplo, supongamos que estamos usando Flask para crear un servicio web simple que proporcione un servicio de predicción de modelos a través de una API. En este caso, podemos cargar el modelo guardado para hacer predicciones en tiempo real.

Ejemplo

from flask import Flask, request, jsonify
import joblib
import numpy as np

app = Flask(__name__)

# Cargar el modelo
model = joblib.load('svm_model.joblib')

@app.route('/predict', methods=['POST'])
def predict():
    data = request.get_json()  # Obtener los datos de entrada
    features = np.array(data['features']).reshape(1, -1)  # Convertir a un formato adecuado para la predicción
    prediction = model.predict(features)  # Usar el modelo cargado para hacer predicciones
    return jsonify({'prediction': prediction.tolist()})  # Devolver el resultado de la predicción

if __name__ == '__main__':
    app.run(debug=True)
Otras extensiones