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/14 18:45]
admin
clase:iabd:pia:1eval:tema04 [2025/02/02 18:32] (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>
 +
 +
 +
 ===== Ejercicios ===== ===== Ejercicios =====
  
Línea 1725: Línea 1778:
          
          
-    model.fit(x, y,verbose=False,epochs=epochs) +    history=model.fit(x, y,verbose=False,epochs=epochs) 
  
-    return model+    return model,history
 </sxh> </sxh>
  
Línea 1744: Línea 1797:
  
 ==== Paso 4 ==== ==== Paso 4 ====
-Vuelve a entrenar ahora el modelo ahora con 27500 épocas y si ahora da mejores resultados.+Vuelve a entrenar ahora el modelo ahora con 27500 épocas y comprueba ahora da mejores resultados.
  
 Para ello: Para ello:
Línea 1751: Línea 1804:
  
 {{:clase:iabd:pia:1eval:datos_pib_modelo_red_neuronal_buena.png|}} {{:clase:iabd:pia:1eval:datos_pib_modelo_red_neuronal_buena.png|}}
 +
 +==== Paso 5 ====
 +Ahora vamos a calcular como de "buena" es nuestra red. Para ellos vamos a calcular "Perdida" o "Loss" de la red neuronal.
 +
 +La formula que vamos a usar es **Mean Squared Error** (MSE)
 +
 +$$
 +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}
 +$$
 +
 +Imprime el resultado
 +
 +=== Paso 6 ===
 +Si nos fijamos cuando hemos definido la red neuronal , el método ''model.compile'' hemos usado el argumento ''loss='mean_squared_error'''
 +
 +<sxh python>
 +model.compile(loss='mean_squared_error')
 +</sxh>
 +
 +Es decir que le estamos diciendo a la red neuronal que para entrenarse use el **Mean Squared Error** como función de pérdida.
 +
 +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, 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>
 +loss=history.history['loss']
 +</sxh>
 +
 +En este caso ''loss'' es un array con la pérdida en cada época. Imprime el valor de la pérdida de la última época y comparalo con el resultado del paso anterior.
 +
 +=== 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 en cada época
 +Y muestra la última perdida
 +
 +{{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_loss.png|}}
 +
 +=== Paso 8 ===
 +Muestra en una figura las 2 gráficas anteriores
 +
 +{{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_loss_and_datos.png|}}
 +
 +=== Paso 9 ===
 +Ahora vamos a crear una red neuronal muchísimo más compleja para hacer que el error sea aun menor. La red es la siguiente:
 +
 +<sxh python>
 +def compile_fit(x,y,epochs):
 +    np.random.seed(5)
 +    tf.random.set_seed(5)
 +    random.seed(5)  
 +    
 +    model=Sequential()
 +    model.add(Dense(1,activation="relu",input_dim=1))
 +    model.add(Dense(10,activation="relu"))
 +    model.add(Dense(100,activation="relu"))
 +    model.add(Dense(300,activation="relu"))
 +    model.add(Dense(600,activation="relu"))
 +    model.add(Dense(900,activation="relu"))
 +    model.add(Dense(1800,activation="relu"))
 +    model.add(Dense(900,activation="relu"))   
 +    model.add(Dense(600,activation="relu"))        
 +    model.add(Dense(300,activation="relu"))        
 +    model.add(Dense(200,activation="relu"))
 +    model.add(Dense(100,activation="relu"))                    
 +    model.add(Dense(10,activation="relu"))                        
 +    model.add(Dense(1,input_dim=1))                        
 +    model.compile(loss='mean_squared_error',optimizer="Adam")
 +    
 +    
 +    history=model.fit(x, y,verbose=False, epochs=epochs) 
 +
 +    return model,history
 +</sxh>
 +
 +Entranala durante 10000 épocas y muestra las 2 gráficas
 +
 +{{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_sobreajuste_loss_datos.png|}}
 +
 +=== Paso 10 ===
 +Ahora usando los siguientes datos, calcula manualmente la pérdida //loss// y comparala con la pérdida anterior
 +
 +<sxh python>
 +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] ,
 +        [ 26.80487149 , 47.1495392 ] , [ 28.81517859 ,106.34919698] , [ 48.56698654 ,120.25398606] ,
 +        [ 52.08015067 ,116.7993955 ] , [ 53.30646055 ,131.30936472] , [ 55.09968806 ,131.34281752] ,
 +        [ 60.39615207 , 97.77483743] , [ 73.52487026 , 92.30645543] , [ 76.2771471  ,109.9995226 ] ,
 +        [ 84.56808303 ,120.60657657] , [ 89.2700557  ,117.3687155 ] , [ 91.03720679 ,159.47376137] ,
 +        [ 93.53406333 ,166.44439331] , [ 94.78103495 ,180.66942656]]
 +        )
 +    return datos_validacion
 +</sxh>
 +
 +Añade a la gráfica los datos de validación
 +
 +¿Que ha ocurrido? Se llama Sobreajuste
 +
 +{{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_sobreajuste_loss_datos_validacion.png|}}
 +
 +
 +=== 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
 +
 +{{:clase:iabd:pia:1eval:pib_modelo_red_neuronal_sobreajuste_loss_and_datos_ood.png|}}
 +
 +
 +
 +=== Paso 13 ===
 +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.
 +Y eso lo vamos a realizar durante 600 semanas.
 +
 +Para obtener las 300 predicciones semanales vamos a usar la siguiente función ''get_gastos_educacion()'':
 +<sxh python>
 +np.random.seed(8)
 +def get_gastos_educacion(semana):
 +    num_predicciones_semanales=300
 +    gastos_educacion=np.random.uniform((semana/np.random.uniform(20,30)),30+(semana/np.random.uniform(5,20))-np.random.uniform(1,20),num_predicciones_semanales)
 +    gastos_educacion=gastos_educacion[gastos_educacion>1]
 +
 +    return gastos_educacion
 +</sxh>
 +
 +Y mostraremos para cada un de las 600 semanas la media y la desviación estandard.
 +
 +¿Ves algo raro?
 +
 +
 +{{: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.1731606315.txt.gz · Última modificación: 2024/11/14 18:45 por admin