Processing math: 100%

Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:1eval:tema04

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:1eval:tema04 [2024/11/15 00:44]
admin [Mini-proyecto]
clase:iabd:pia:1eval:tema04 [2025/03/22 13:06] (actual)
admin [Personalización]
Línea 261: Línea 261:
 figure.suptitle("Título de la figura") figure.suptitle("Título de la figura")
  
-subfigure_a,subfigure_b = figure.subfigures(nrows=2, ncols=1)+subfigures = figure.subfigures(nrows=2, ncols=1).reshape(-1) 
 +subfigure_a=subfigures[0] 
 +subfigure_b=subfigures[1]
  
 subfigure_a.suptitle("Titulo de la SubFigura A") subfigure_a.suptitle("Titulo de la SubFigura A")
Línea 841: Línea 843:
 También podemos obtener el siguiente color que vamos a usar con: También podemos obtener el siguiente color que vamos a usar con:
 <sxh python> <sxh python>
 +#Versiones nuevas
 +color=axes._get_lines.get_next_color()
 +#Versiones antiguas
 color=next(axes._get_lines.prop_cycler)['color'] color=next(axes._get_lines.prop_cycler)['color']
 </sxh>  </sxh> 
Línea 1095: Línea 1100:
  
 Como podemos ver hay muchos estilos relacionados con [[https://seaborn.pydata.org/|Seaborn]] Como podemos ver hay muchos estilos relacionados con [[https://seaborn.pydata.org/|Seaborn]]
 +
 +==== Definir el propio estilo ====
 +Normalmente queremos que todas nuestras gráficas tengan un mismo estilo , por ello es bueno crear una serie de funciones estándar que siempre usaremos. 
 +
 +  * La primera función que usamos se llama ''axes_configure_labels(axes,title,xlabel,ylabel)'' que configura tanto los labels como los colores y tamaños de fuente.
 +
 +<sxh python>
 +def axes_configure_labels(axes,title,xlabel,ylabel):
 +    color="#003B80"
 +    facecolor="#FAFCFF"
 +    gridcolor="#BAD4F2"
 +    tickcolor="#011E32"
 +    fontsize_label=13
 +
 +    axes.set_xlabel(xlabel, fontsize=fontsize_label,color=color)
 +    axes.set_ylabel(ylabel, fontsize=fontsize_label,color=color)
 +    axes.set_title(title,color=color)
 +
 +    axes.set_facecolor(facecolor)
 +    axes.spines['bottom'].set_color(tickcolor)
 +    axes.spines['top'].set_color(tickcolor)
 +    axes.spines['right'].set_color(tickcolor)
 +    axes.spines['left'].set_color(tickcolor)
 +    axes.tick_params(axis='both', colors=tickcolor)
 +
 +    axes.grid(visible=True, which='major', axis='both',color=gridcolor,linewidth=1,zorder=-10)
 +    axes.set_axisbelow(True)
 +
 +    handles, labels = axes.get_legend_handles_labels()
 +    if labels:
 +        axes.legend(fontsize=fontsize_label-2,labelcolor=color)
 +
 +</sxh>
 +
 +
 +  * La siguiente función es ''axes_configure_for_metrics(axes)'' que configura las gráficas para mostrar métricas que van de [01].
 +
 +<sxh python>
 +def axes_configure_axis_for_metrics(axes):
 +    axes.set_xlim(xmin=0,xmax=1)
 +    axes.set_ylim(ymin=0,ymax=1.1)
 +
 +    axes.xaxis.set_major_locator(MultipleLocator(0.1))
 +    axes.yaxis.set_major_locator(MultipleLocator(0.1))
 +</sxh>
 +
 +
 +  * Para mostrar las gráficas de la pérdida en función de las épocas se usarán las funciones ''axes_configure_axis_for_epochs'' y ''plot_history_metric'':
 +
 +
 +<sxh python>
 +def axes_configure_axis_for_epochs(axes,ymax=1):
 +    axes.xaxis.set_major_locator(MaxNLocator(10,integer=True))
 +    axes.yaxis.set_major_locator(LinearLocator(10))
 +    axes.set_ylim(ymin=0,ymax=ymax)
 +</sxh>
 +
 +
 +<sxh python>
 +def plot_history_metric(axes,history,metric_name,label=None,color="#003B80",decimales=2):
 +
 +    if (label==None):
 +        label=metric_name
 +
 +    axes.plot(history[metric_name],linestyle="dotted",c=color,label=f"{label}:{history[metric_name][-1]:.{decimales}f}")  
 +    axes.plot(history['val_'+metric_name],linestyle="solid",c=color,label=f"Valid. {label}:{history['val_'+metric_name][-1]:.{decimales}f}"
 +    
 +    
 +</sxh>
 +
 +Usándose así:
 +
 +<sxh python>
 +figure=plt.figure(figsize=(6, 3.5))
 +axes=figure.add_subplot(1,1,1)
 +
 +plot_history_metric(axes,history.history,"loss",decimales=6)
 +axes_configure_labels(axes,"loss por épocas","Nº Épocas","Loss")
 +axes_configure_axis_for_epochs(axes,1.1)
 +</sxh>
 +
 +
 ===== Ejercicios ===== ===== Ejercicios =====
  
Línea 1758: Línea 1845:
  
 $$ $$
-loss=Perdida=error \: medio=\frac{1}{N} \sum_{i=1}^{N} (y_{true}-y_{score})=\frac{1}{N} \sum_{i=1}^{N} (pib_{true}-pib_{predicho})+loss=Perdida=error \: medio=\frac{1}{N} \sum_{i=1}^{N} |y_{true}-y_{score}|^{2}=\frac{1}{N} \sum_{i=1}^{N} |pib_{true}-pib_{predicho}|^{2}
 $$ $$
  
Línea 1773: Línea 1860:
  
 Así que resulta que no hace falta que nosotros calculemos el **Mean Squared Error** porque ya lo hace keras por nosotros.  Así que resulta que no hace falta que nosotros calculemos el **Mean Squared Error** porque ya lo hace keras por nosotros. 
-La forma de acceder a ese valor es la siguiente:+La forma de acceder a ese valor es la siguiente, el método ''model.fit()'' nos retorna un objeto ''history'' que contiene las pérdidas al inicio de cada época. Y podemos acceder al array de todas las pérdidas (una por época) mediante ''history.history['loss']'' 
 + 
 +<sxh python> 
 +    history=model.fit(x, y,verbose=False, epochs=epochs)  
 +</sxh>
  
 <sxh python> <sxh python>
Línea 1782: Línea 1873:
  
 === Paso 7 === === Paso 7 ===
-Ahora muestra una gráfica con todos los valores de //loss// para que veas como va evolucionando la pérdida a medida que se va entrenando la red+Ahora muestra una gráfica con todos los valores de //loss// para que veas como va evolucionando la pérdida a medida que se va entrenando la red en cada época
 Y muestra la última perdida Y muestra la última perdida
  
Línea 1832: Línea 1923:
  
 <sxh python> <sxh python>
-[[  1.22140488 , 59.35315077] , [  2.42834632 ,  3.50613409] , [  4.27529991 , 70.39938914] ,+def get_datos_validacion(): 
 +    datos_validacion=np.array( 
 +        [[  1.22140488 , 59.35315077] , [  2.42834632 ,  3.50613409] , [  4.27529991 , 70.39938914] ,
         [ 14.44651349 , 50.0606769 ] , [ 16.10795855 , 81.08562061] , [ 16.75024181 , 33.95365822] ,         [ 14.44651349 , 50.0606769 ] , [ 16.10795855 , 81.08562061] , [ 16.75024181 , 33.95365822] ,
         [ 26.80487149 , 47.1495392 ] , [ 28.81517859 ,106.34919698] , [ 48.56698654 ,120.25398606] ,         [ 26.80487149 , 47.1495392 ] , [ 28.81517859 ,106.34919698] , [ 48.56698654 ,120.25398606] ,
Línea 1839: Línea 1932:
         [ 84.56808303 ,120.60657657] , [ 89.2700557  ,117.3687155 ] , [ 91.03720679 ,159.47376137] ,         [ 84.56808303 ,120.60657657] , [ 89.2700557  ,117.3687155 ] , [ 91.03720679 ,159.47376137] ,
         [ 93.53406333 ,166.44439331] , [ 94.78103495 ,180.66942656]]         [ 93.53406333 ,166.44439331] , [ 94.78103495 ,180.66942656]]
 +        )
 +    return datos_validacion
 </sxh> </sxh>
  
Línea 1846: Línea 1941:
  
 {{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_sobreajuste_loss_datos_validacion.png|}} {{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_sobreajuste_loss_datos_validacion.png|}}
 +
  
 === Paso 11 === === Paso 11 ===
 +Estos nuevos datos se pueden incluir también en el método ''model.fit'' para que nos calcule la pérdida con los datos de validación en cada época. Para ello modificaremos el método ''model.fit'' añadiendo el argumento ''validation_data=(x_val,y_val)'':
 +
 +<sxh python>
 +history=model.fit(x, y,validation_data=(x_val,y_val), verbose=False, epochs=epochs) 
 +</sxh>
 +
 +Para acceder desde ''history'' a la pérdida en validación se usará:
 +
 +<sxh python>
 +val_loss=history.history['val_loss']
 +</sxh>
 +
 +Muestra ahora una nueva figura con la perdida tanto en entrenamiento como en validación y los datos.
 +
 +{{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_loss_and_datos_validacion.png|}}
 +
 +=== Paso 12 ===
 Muestra la gráfica con los datos originales pero que el resultado de la red sea hasta 200 Muestra la gráfica con los datos originales pero que el resultado de la red sea hasta 200
  
 {{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_sobreajuste_loss_and_datos_ood.png|}} {{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_sobreajuste_loss_and_datos_ood.png|}}
  
-=== Paso 12 ===+ 
 + 
 +=== Paso 13 ===
 Ahora vamos a hacer predicciones en el modelo y comprobar si hay algún problema a lo largo del tiempo.  Ahora vamos a hacer predicciones en el modelo y comprobar si hay algún problema a lo largo del tiempo. 
 Para ello vamos a realizar 300 predicciones semanales y obtener la media y la desviación estándar de todas las predicciones de una semana. Para ello vamos a realizar 300 predicciones semanales y obtener la media y la desviación estándar de todas las predicciones de una semana.
Línea 1873: Línea 1988:
  
  
-{{:clase:iabd:pia:1eval:datos_pib_modelo_red_neuronal_monitorizacion.png|}}+{{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_monitorizacion.png|}} 
 + 
 +=== Paso 14 === 
 +Siguiendo con el DataSet de los precios de viviendas en la ciudad de Boston, vamos a mostrar las gráficas con 
 +las pérdidas y la métrica del Coeficiente de determinación o R² de todas las redes neuronales que se entrenaron en el tema anterior (entrenamiento y validación) 
 + 
 +Para poder mostrar el Coeficiente de determinación o R² deberemos modificar el método ''model.compile'' de la siguiente forma: 
 +<sxh python> 
 +model.compile(loss='mean_squared_error',metrics=[tf.keras.metrics.R2Score()]) 
 +</sxh> 
 + 
 +Se usa de la siguiente forma: 
 +  * Obtener el R² para cada época en el entrenamiento 
 +<sxh python> 
 +r2_score=history.history['r2_score'
 +</sxh> 
 + 
 +  * Obtener el R² para cada época en validación 
 +<sxh python> 
 +r2_score_validacion=history.history['val_r2_score'
 +</sxh> 
 + 
 + 
 + 
 +{{:clase:iabd:pia:1eval:boston_loss_metrics_300_epocas.png|}} 
 + 
 + 
 +<sxh python> 
 +redes_neuronales=[ 
 +    [[20,1],"relu"], 
 +    [[20,1],"selu"], 
 +    [[20,1],"tanh"],        
 +    [[20,10,1],"relu"], 
 +    [[20,10,1],"selu"], 
 +    [[20,10,1],"tanh"],         
 +    [[20,30,10,1],"relu"], 
 +    [[20,30,10,1],"selu"], 
 +    [[20,30,10,1],"tanh"],   
 +    [[20,40,80,40,20,1],"relu"], 
 +    [[20,40,80,40,20,1],"selu"], 
 +    [[20,40,80,40,20,1],"tanh"], 
 +    [[20,40,80,160,80,40,20,1],"relu"], 
 +    [[20,40,80,160,80,40,20,1],"selu"], 
 +    [[20,40,80,160,80,40,20,1],"tanh"                               
 +]                              
 + 
 +epochs=300 
 +</sxh> 
 + 
 +<sxh base> 
 +  Nombre  Capas                               Épocas  Activación                MSE               R²           Tiempo           MSE            R² 
 +     Red                                                              Entrenamiento    Entrenamiento    Entrenamiento    Validación    Validación 
 +--------  --------------------------------  --------  ------------  ---------------  ---------------  ---------------  ------------  ------------ 
 +        [20, 1]                                300  relu                 25.9903        0.700825            13.2181       24.1596     0.670553 
 +        [20, 1]                                300  selu                 23.1742        0.733241            12.6924       21.8751     0.701705 
 +        [20, 1]                                300  tanh                 69.747         0.197143            12.3714       61.0294     0.167786 
 +        [20, 10, 1]                            300  relu                 24.5118        0.717845            12.8602       26.5133     0.638458 
 +        [20, 10, 1]                            300  selu                 23.5015        0.729474            12.4664       23.3333     0.681821 
 +        [20, 10, 1]                            300  tanh                 59.5199        0.314867            12.466        51.4849     0.297938 
 +        [20, 30, 10, 1]                        300  relu                 13.5217        0.844352            13.0145       17.7428     0.758054 
 +        [20, 30, 10, 1]                        300  selu                 11.4235        0.868504            12.895        16.8747     0.769892 
 +        [20, 30, 10, 1]                        300  tanh                 59.6715        0.313121            12.7907       50.0339     0.317724 
 +      10  [20, 40, 80, 40, 20, 1]                300  relu                 11.639         0.866023            13.8727       15.3683     0.790433 
 +      11  [20, 40, 80, 40, 20, 1]                300  selu                 19.7779        0.772336            13.6373       26.7263     0.635553 
 +      12  [20, 40, 80, 40, 20, 1]                300  tanh                 55.5066        0.361063            13.6796       50.5201     0.311094 
 +      13  [20, 40, 80, 160, 80, 40, 20, 1]       300  relu                 22.3828        0.742352            13.9058       27.3831     0.626596 
 +      14  [20, 40, 80, 160, 80, 40, 20, 1]       300  selu                  6.17364       0.928935            14.0711       17.3759     0.763057 
 +      15  [20, 40, 80, 160, 80, 40, 20, 1]       300  tanh                 86.8736       -2.5034e-06          14.0382       75.0856    -0.0238888 
 + 
 +</sxh> 
 + 
 +Para cada una de las redes indica: 
 +  * Si tiene unas buenas métricas en la última época 
 +  * Si es buena o mala red , es decir si la elegirías. Explica el motivo 
 +  * Compara los resultados con los del tema anterior ¿Porque hay esas variaciones? 
 + 
 +=== Paso 15 === 
 +Repite el ejercicio anterior pero ahora solo para 10 épocas y muestra solo la pérdida en entrenamiento y validación.
  
 +{{:clase:iabd:pia:1eval:boston_loss_metrics_10_epocas.png|}}
  
 +Para cada una de las redes indicas si podrías "intuir" si va a ser una buena red después de 300 épocas
  
  
clase/iabd/pia/1eval/tema04.1731627898.txt.gz · Última modificación: 2024/11/15 00:44 por admin