¿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.
Automatización de Modelos Machine Learning con Python
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
¿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
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
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:
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.
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!
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
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.
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))
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