Automatización de Modelos Machine Learning con Python
Clase 34 de 37 • Curso 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.