Automatización de Modelos Machine Learning con Python
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.
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.
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.
Muy buenas la distribución de los archivos, clases y demás :)
Con que así luce el código para producción!!!
Estas 2 ultimas clases me han ayudado muchisimo ya que siempre tenia esa duda si me la tenia que vivir con puros script en Python con todas sus librearias, pero el crear un Framework con modelos, ordenaod y organizado te da un manetra de trabajar mas productivamente
Excelente clase, estoy muy motivado para hacer mis propios modelos!
¿Por qué se toma el valor absoluto del score en la línea 37? ¿Y por qué se considera que el mejor score es el más bajo? Estaba leyendo la documentación, y se supone que todos los scores siguen la convención de que entre mayor es, mejor. En este caso, creo que la métrica es R^2, que sí sigue esa regla.
https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter
Esto me dejó un poco desconcertado, puesto que entiendo lo mismo que vos. Estuve haciendo pruebas y esto es lo que resultó.
import pandas as pd
from sklearn.svmimportSVRfrom sklearn.ensembleimportGradientBoostingRegressorfrom sklearn.model_selectionimporttrain_test_splitfrom sklearn.metricsimport mean_absolute_error, mean_squared_error
if __name__ =="__main__": dataset = pd.read_csv('./data/felicidad.csv')#print(dataset.head(8))X= dataset.drop(['country','rank','score'],axis=1) #porque rank estaba muy correlacionado a score y afectaría el entrenamiento
y = dataset[['score']]#print(y)X_train,X_test,Y_train,Y_test=train_test_split(X,y, test_size=0.35) p1 ={'C':5,'gamma':'scale','kernel':'rbf'} regresor =SVR(**p1).fit(X_train,Y_train) #0.35258825680662714 pred = regresor.predict(X_test)print('='*100)print("mean_squared_error SVR",mean_squared_error(pred,Y_test))print("mean_absolute_error SVR",mean_absolute_error(pred,Y_test))print('='*100) p1 ={'learning_rate':0.1,'loss':'squared_error'} #0.8509483947678449 regresor =GradientBoostingRegressor(**p1).fit(X_train,Y_train) pred = regresor.predict(X_test)print("mean_squared_error GradientBoostingRegressor",mean_squared_error(pred,Y_test))print("mean_absolute_error SVR",mean_absolute_error(pred,Y_test))
En el código del profesor no se definió la métrica según la que se haría el scoring, igualmente hay métricas las cuales se busca reducir y hay otras como R2 que lo que se buscan es que sean lo más cercanas a 1, lo mejor para evitar inconvenientes es definir la métrica con la que se van a comparar para entender que es lo que se busca, pero igualmente puedes imprimir la métrica utilizada con el atributo scorer_ del GridSearchCV
Uno de los mejores cursos. Muy completo
Sí les sale un error, tienen que cambiar en la carpeta models(punto)py en la función de GRADIENT cambiar los parámetros de la función de perdida -loss- de la siguiente manera:
'loss':['squared_error','huber'],
muchas gracias, ahora funciona!
Nunca habia tan aniamado hacer mis propios modelos, voy a empezar cada vez hacer cada vez más
Línea para agregar el score al nombre del modelo que exportamos
Este es el código que usé para poder leerlo. Solo de esa manera pude hacerlo.
Importar y exportar modelos con Scikit-Learn es una tarea esencial cuando trabajas en proyectos de aprendizaje automático. Esto te permite guardar tus modelos entrenados y reutilizarlos en el futuro sin tener que volver a entrenarlos desde cero. Scikit-Learn proporciona herramientas para facilitar la importación y exportación de modelos.
Excelente clase!!!
quisiera hacer una pregunta a aquellos que ya terminaron el la ruta de data, estos terminos... ya tenes que conocerlos? o los vas aprendiendo clase a clase? quiza yo n otenga buenas bases, pero hay conceptos que se muestran como si yo ya los conociera, y no se si la idea es que yo los recuerde, luego aplique para aprende, o si ya hay que tener unas altas bases en programacion. Porque yo sinceramente vi html css javascripto un cursito basico de python, e hice la introduccion para esta ruta de data scientist, y asi y todo hay conceptos que se me escapan. Si alguien avanzado, tuviera la amabilidad de despejar mi duda. Vengo casi que no entendiendo ninguna clase, salvo por deduccion de conceptos.
Creo que tendrías que reforzar Python, con un curso básico no creo que lo entiendas. Hay más niveles acá en Platzi mismo para profundizar. Las rutas muchas veces no están perfectas, hay que buscar por otro lado para entender mejor. Suerte!
Muchachos está clase hubo muchas cosas particulares para revisar ,
Comenzando porque algunas métricas que se ven durante la base de los parámetros para el grid son diferentes es decir ya no funcionan
Segundo hay una parte del código que me llama la atención
Dentro de ese punto hay varias cosas a tener en cuenta
como lo es el uso de convertir el score a un Absoluto , lo que genera que los valores incluso malos los cuente como buenos , y no cuente los cuente como malos es decir ex:
Modelo como resultado en scores = -14 al usar un abs lo convertimos a 14 pasándolo a que entonces ese modelo es el mejor cuando no lo fue
Otro punto importante es la condición que toma , ya que dice que si el score actual es menor al pasado entonces se actualice , lo cual no funciona ya que grid suele dar el score mas alto por ende al tener la condición de esa manera no voy a tener el mas alto sino el mas bajo entre las iteraciones
MI code:
import pandas as pd
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
from sklearn.ensemble import GradientBoostingRegressor
from utils import Utils
classModels:def__init__(self): self.reg ={'SVR': SVR(),'GRADIENT': GradientBoostingRegressor()} self.params ={'SVR':{'kernel':['linear','poly','rbf'],'gamma':['auto','scale'],'C':[1,5,10]},'GRADIENT':{'loss':['squared_error','huber','absolute_error','quantile'],'learning_rate':[0.01,0.05,0.1]}}defgrid_train(self,X, y): best_score =0 best_model =Nonefor name, reg in self.reg.items(): grid = GridSearchCV( estimator=reg, param_grid=self.params[name], cv =3,) grid.fit(X, y.values.ravel()) score = grid.best_score_
if score > best_score: best_score = score
best_model = grid.best_estimator_
utils = Utils() utils.model_export(best_model, best_score)
Si estoy mal por favor déjenmelo saber, me serviría mucho ver otros POV
En la validación se está preguntando si el score < best_score, con esto se está guardando el modelo que tenga el menor score. hice la prueba imprimiendo el nombre de modelo y el score, para al final imprimir el nombre del modelo que se guarda
Como se observa al final se guardó el modelo con el score más bajo de todos.
Mi pregunta es: ¿no debería ser al contrario y guardar el modelo con el score más alto?
Les agradezco me aclaren la duda
Muchas gracias
Me aparece un error :
The loss 'lad' was deprecated in v1.0 and will be removed in version 1.2. Use 'absolute_error' which is equivalent.
The loss 'ls' was deprecated in v1.0 and will be removed in version 1.2. Use 'squared_error' which is equivalent.
Hola Juan, se refiere a que en los parámetros de loss cambies ls por 'squared_error' y lad por 'absolute_error'.
Espero no sea muy tarde