Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema09

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
clase:iabd:pia:2eval:tema09 [2024/12/23 10:18]
admin creado
clase:iabd:pia:2eval:tema09 [2025/02/15 20:07] (actual)
admin [Ejercicios]
Línea 43: Línea 43:
 Más información: Más información:
   * [[https://www.tensorflow.org/api_docs/python/tf/keras/regularizers|Module: tf.keras.regularizers]]   * [[https://www.tensorflow.org/api_docs/python/tf/keras/regularizers|Module: tf.keras.regularizers]]
-  * [[tema08-apendices]] 
   * [[http://laid.delanover.com/difference-between-l1-and-l2-regularization-implementation-and-visualization-in-tensorflow/|Difference between L1 and L2 regularization, implementation and visualization in Tensorflow]]: Las imágenes en 3D de las 2 regularizaciones.   * [[http://laid.delanover.com/difference-between-l1-and-l2-regularization-implementation-and-visualization-in-tensorflow/|Difference between L1 and L2 regularization, implementation and visualization in Tensorflow]]: Las imágenes en 3D de las 2 regularizaciones.
   * [[https://explained.ai/regularization/impl.html|How we express regularization in practice]]: Mas imágenes en 3D de L1 y L2   * [[https://explained.ai/regularization/impl.html|How we express regularization in practice]]: Mas imágenes en 3D de L1 y L2
Línea 248: Línea 247:
 <sxh base> <sxh base>
 Iguales= True Iguales= True
 +</sxh>
 +
 +
 +<sxh python>
 +class DataScaler:
 +    def __init__(self,x,y,scaler=StandardScaler):
 +        self.x=x
 +        self.y=y
 +        self.scaler=scaler
 +
 +        if (np.ndim(x)==1):
 +            self.x_ndim=1
 +        else:
 +            self.x_ndim=x.shape[1]
 +    
 +
 +        if (np.ndim(y)==1):
 +            self.y_ndim=1
 +        else:
 +            self.y_ndim=y.shape[1]
 +
 +
 +    def get_datos_escalados_entrenamiento(self):
 +        self.x_scaler = self.scaler()
 +        self.y_scaler = self.scaler()
 +
 +        x_scaled = self.x_scaler.fit_transform(self.x.reshape(-1,self.x_ndim))
 +        y_scaled=self.y_scaler.fit_transform(self.y.reshape(-1,self.y_ndim))
 +
 +        return x_scaled,y_scaled
 +
 +    def get_datos_reales(self):
 +        return self.x,self.y
 +    
 +    def predict(self,model,x_pred):
 +        y_pred=self.y_scaler.inverse_transform(model.predict(self.x_scaler.transform(x_pred.reshape(-1,self.x_ndim))))
 +        return y_pred
 +    
 </sxh> </sxh>
  
Línea 285: Línea 322:
  
  
-===== Parada anticipada =====+===== Callbacks ===== 
 + 
 +==== Guardar mejor modelo ==== 
 +Al entrenar no siempre la última época es el mejor modelo, por ello hay un callback de keras que nos guarda el mejor modelo. Se llama ''ModelCheckpoint''
 + 
 +La clase contiene entre otros los siguientes parámetros: 
 +  * ''filepath'': Nombre del fichero donde se guarda el modelo 
 +  * ''monitor'': La métrica a monitorizar. Por defecto monitoriza ''val_loss''
 +  * ''mode'': Indica el tipo de métrica que es. Es decir si la métrica es mejor cuanto mayor valor tiene (''max'') o la métrica es mejor cuanto menor valor tiene (''min''). Por defecto es valor es ''auto'' y keras sabrá el tipo de la métrica por el nombre que tiene. 
 +  * ''save_best_only=True'': Guardar solo el mejor modelo porque sino guara todos y no nos suele interesar. 
 + 
 +<sxh python> 
 +from tensorflow.keras.callbacks import ModelCheckpoint 
 + 
 +checkpoint_callback = ModelCheckpoint( 
 +    'best_model.h5', 
 +    monitor='val_loss', 
 +    save_best_only=True, 
 +    mode='min' 
 +
 + 
 + 
 +history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=40,verbose=False,callbacks=[checkpoint_callback()]) 
 + 
 +</sxh> 
 + 
 +==== Parada anticipada ====
 La parada anticipada resuelve el problema de cuántas épocas debemos entregar nuestro modelo. Lo que hace es detener el entrenamiento si la métrica no mejora. Para ello se usa la clase de callback de keras llamado ''EarlyStopping()''. La parada anticipada resuelve el problema de cuántas épocas debemos entregar nuestro modelo. Lo que hace es detener el entrenamiento si la métrica no mejora. Para ello se usa la clase de callback de keras llamado ''EarlyStopping()''.
  
Línea 293: Línea 356:
   * ''patience'': Cuántas épocas puede estar sin mejorar antes de que paremos el entrenamiento. Por defecto vale 0.   * ''patience'': Cuántas épocas puede estar sin mejorar antes de que paremos el entrenamiento. Por defecto vale 0.
   * ''mode'': Indica el tipo de métrica que es. Es decir si la métrica es mejor cuanto mayor valor tiene (''max'') o la métrica es mejor cuanto menor valor tiene (''min''). Por defecto es valor es ''auto'' y keras sabrá el tipo de la métrica por el nombre que tiene.   * ''mode'': Indica el tipo de métrica que es. Es decir si la métrica es mejor cuanto mayor valor tiene (''max'') o la métrica es mejor cuanto menor valor tiene (''min''). Por defecto es valor es ''auto'' y keras sabrá el tipo de la métrica por el nombre que tiene.
 +  * ''restore_best_weights'': Si es True, restaurará los pesos del modelo a la mejor versión del entrenamiento, es decir, la versión que tuvo el mejor valor en la métrica monitorizada.
  
 <sxh python> <sxh python>
 +from tensorflow.keras.callbacks import EarlyStopping
  
-history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=40,verbose=False,callbacks=[EarlyStopping()])+earlystopping_callback = EarlyStopping( 
 +    monitor='val_loss',       # Métrica a monitorear 
 +    min_delta=0.001,           # Mejora mínima a considerar significativa 
 +    patience=10,              # Esperar 10 épocas sin mejora antes de detenerse 
 +    mode='min',               # Monitorizar si la pérdida disminuye 
 +    restore_best_weights=True # Restaurar los mejores pesos 
 +
 + 
 + 
 +history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=40,verbose=False,callbacks=[earlystopping_callback()])
    
  
 </sxh> </sxh>
 +
 +<note tip>
 +¿Tiene sentido usar ''ModelCheckpoint'' si ya ''EarlyStopping'' nos permitirá obtener el mejor modelo con ''restore_best_weights=True''. Si ,porque si falla el entrenamiento , con ''ModelCheckpoint'' se va guardando a disco y así nunca lo perderemos.
 +</note>
 +
  
 Más información: Más información:
 +  * [[https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ModelCheckpoint|tf.keras.callbacks.ModelCheckpoint]]
   * [[https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping| tf.keras.callbacks.EarlyStopping]]   * [[https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping| tf.keras.callbacks.EarlyStopping]]
   * [[https://towardsdatascience.com/a-practical-introduction-to-early-stopping-in-machine-learning-550ac88bc8fd|Early Stopping in Practice: an example with Keras and TensorFlow 2.0]]   * [[https://towardsdatascience.com/a-practical-introduction-to-early-stopping-in-machine-learning-550ac88bc8fd|Early Stopping in Practice: an example with Keras and TensorFlow 2.0]]
 +
  
 ===== Ejercicios ===== ===== Ejercicios =====
  
-==== Ejercicio 1 ====+==== Ejercicio 1.A ====
 Crea una red neuronal para predecir si una persona va a tener una enfermedad cardíaca. Para ello se han usado los datos de {{https://www.kaggle.com/datasets/alexteboul/heart-disease-health-indicators-dataset}}. Crea una red neuronal para predecir si una persona va a tener una enfermedad cardíaca. Para ello se han usado los datos de {{https://www.kaggle.com/datasets/alexteboul/heart-disease-health-indicators-dataset}}.
  
Línea 337: Línea 418:
  
 Los datos son los siguientes: {{ :clase:iabd:pia:2eval:heart_disease_health_indicators_brfss2015.csv.zip |}} Los datos son los siguientes: {{ :clase:iabd:pia:2eval:heart_disease_health_indicators_brfss2015.csv.zip |}}
 +
 +==== Ejercicio 1.B ====
 +Mejora la red normalizando los datos . Usa ''StandardScaler''.
 +
 +¿Ha mejorado la red?
 +
 +==== Ejercicio 1.C ====
 +Modifica la red de forma que haya muchas neuronas y que haya sobreajuste.
 +
 +Debes mostrar una gráfica en la que se vea el //loss// en entrenamiento y validación.
 +
 +Ahora vamos a comprobar si es mejor regularizar (L1, L2 y L1L2) o simplemente no sobreentrenar para ello crea una gráficas similares a éstas:
 +
 +{{clase:iabd:pia:2eval:regularizacion_vs_loss_mejor_epoca.png}}
 +
 +
 +==== Ejercicio 1.D ====
 +Repite ahora las gráficas pero en vez de regularizar, usa Dropout
 +
 +==== Ejercicio 1.E ====
 +Usa ahora ''EarlyStopping'' y ''ModelCheckpoint'' para obtener el modelo evitando que se entrene durante tantas épocas y que se guarde a disco automáticamente.
 +
  
  
clase/iabd/pia/2eval/tema09.1734945522.txt.gz · Última modificación: 2024/12/23 10:18 por admin