Automatización de Modelos Machine Learning con Python

Clase 34 de 37Curso Profesional de Machine Learning con scikit-learn

Resumen

¿Cómo extender nuestra arquitectura de código sin dañar la lógica existente?

Construir una arquitectura de código robusta y flexible es esencial para el desarrollo de soluciones efectivas en ciencia de datos y aprendizaje automático. El objetivo es poder extender el sistema fácilmente sin comprometer el código existente. Vamos a explorar cómo podemos lograrlo, comenzando con una implementación cuidadosa de las librerías necesarias y un análisis detallado del código.

Preparación y carga de librerías

Para comenzar, debemos importar las librerías esenciales para nuestro desarrollo. En Python, es importante recordar que una vez cargada una librería, no es necesario volver a cargarla en memoria, evitando así desbordar innecesariamente la misma.

import pandas as pd
import numpy as np
from sklearn.svm import SVR
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import GridSearchCV
  • Pandas: Es fundamental para la manipulación de datos.
  • NumPy: Proporciona funciones matemáticas avanzadas.
  • Scikit-learn: Ofrece herramientas para modelos de aprendizaje automático, como SVR y GradientBoostingRegressor.

Definición de la clase principal

La implementación de una clase principal nos permite estructurar mejor nuestro código. Esta clase emplea un constructor para la inicialización de variables y configuraciones necesarias.

class Models:
    def __init__(self):
        self.regressors = {
            'SVR': SVR(),
            'GradientBoosting': GradientBoostingRegressor()
        }
        self.parametros = {
            'SVR': {'kernel': ['linear', 'poly', 'rbf'], 'C': [1, 5, 10]},
            'GradientBoosting': {'loss': ['ls', 'lad'], 'learning_rate': [0.01, 0.05, 0.1]}
        }

Configuración de los modelos de aprendizaje automático

Definir un diccionario de diccionarios para los parámetros de cada modelo nos facilita realizar un ajuste hiperparámetro con GridSearchCV.

Implementación del ajuste de hiperparámetros

def grid_training(self, x, y):
    best_score = float('inf')
    best_model = None
    for name, regressor in self.regressors.items():
        param_grid = self.parametros[name]
        grid_search = GridSearchCV(regressor, param_grid, cv=3)
        grid_search.fit(x, y)
        score = np.abs(grid_search.best_score_)
        if score < best_score:
            best_score = score
            best_model = grid_search.best_estimator_

    return best_model, best_score

Exportación del modelo

Una vez identificado el mejor modelo, es crucial exportarlo para su uso futuro. Implementamos una función en nuestras utilidades para lograr esto.

Código para la exportación

def export_model(model, score):
    import joblib
    joblib.dump(model, f'models/best_model_{score}.pkl')

Integración con el archivo principal

Finalmente, conectamos nuestra lógica definida en modelos con nuestro archivo principal, asegurando la ejecución y generación correcta de modelos.

from models import Models

if __name__ == "__main__":
    model_instance = Models()
    x, y = obtain_features_and_target()  # Función ficticia para obtener datos.
    best_model, best_score = model_instance.grid_training(x, y)
    export_model(best_model, best_score)

Con esta arquitectura, hemos asegurado un flujo continuo y eficiente desde la carga de librerías hasta la exportación de modelos. La capacidad de identificar y utilizar el mejor modelo posible para una solución específica es un paso crucial en proyectos de ciencia de datos. Esta práctica no solo optimiza recursos, sino que también garantiza precisiones mayores en las predicciones.