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 [2022/12/11 13:19]
admin [Ejercicios]
clase:iabd:pia:1eval:tema04 [2024/04/07 10:46] (actual)
admin [Figura]
Línea 195: Línea 195:
 ===== Figura ===== ===== Figura =====
 Acabamos de ver como colocar cada gráfica dentro de la figura. Ahora veremos unas cosas mas sobre ella. Acabamos de ver como colocar cada gráfica dentro de la figura. Ahora veremos unas cosas mas sobre ella.
 +
  
 *  Para hacer la figura mas grande solo hay que indicar el tamaño con el argumento ''figsize'' *  Para hacer la figura mas grande solo hay que indicar el tamaño con el argumento ''figsize''
Línea 223: Línea 224:
  
  
 +==== Subfiguras ====
 +Además de ''figure'' y ''axes'', a partir de matplolib 3.4 existe las ''subfigure''. Éstas se pueden usar para poder poner un título común a varios ''axes''.
  
 +Para ello se usa el método ''subfigures'' , indicando el número de filas y columnas. Este método retornará un array con todas las subfiguras. Cada subfigura será como una nueva figura.
  
-===== Proyecciones =====+<sxh python> 
 +subfigure_a,subfigure_b figure.subfigures(nrows=2, ncols=1) 
 +</sxh> 
 + 
 +Veamos un ejemplo: 
 + 
 +<sxh python> 
 +import matplotlib.pyplot as plt 
 + 
 +figure=plt.figure(figsize=(8, 6),layout='constrained'
 +figure.suptitle("Título de la figura"
 + 
 +subfigure_a,subfigure_b = figure.subfigures(nrows=2, ncols=1) 
 + 
 +subfigure_a.suptitle("Titulo de la SubFigura A") 
 +axes_1 = subfigure_a.add_subplot(1,2,1) 
 +axes_1.set_title("axes_1"
 +axes_2 = subfigure_a.add_subplot(1,2,2) 
 +axes_2.set_title("axes_2"
 + 
 +subfigure_b.suptitle("Titulo de la SubFigura B") 
 +axes_3 = subfigure_b.add_subplot(1,2,1) 
 +axes_3.set_title("axes_3"
 +axes_4 = subfigure_b.add_subplot(1,2,2) 
 +axes_4.set_title("axes_4"
 +</sxh> 
 + 
 +{{:clase:iabd:pia:1eval:subfiguras.png?400|}} 
 + 
 + 
 +==== Proyecciones ====
 Indicar como es la proyección de los ejes.  Indicar como es la proyección de los ejes. 
  
Línea 251: Línea 285:
 {{:clase:iabd:pia:1eval:figure_proyecciones.png|}} {{:clase:iabd:pia:1eval:figure_proyecciones.png|}}
  
 +
 +==== Clase Figura ====
 +La siguiente clase permite simplificar la creación de ''Axes'' cuando queremos mostrar muchos en forma de matriz con varias columnas y muchas filas.
 +<sxh python>
 +class Figura:
 +  def __init__(self,ncols,naxes,axes_width_inches=6, axes_height_inches=None):
 +    self.ncols=ncols
 +    self.num_axes=naxes
 +    self.nrows=math.ceil(naxes/ncols)
 +    if axes_height_inches==None:
 +      axes_height_inches=axes_width_inches*0.86
 + 
 +    self.figure, self.arr_axes = plt.subplots(ncols=self.ncols, nrows=self.nrows, figsize=(self.ncols*axes_width_inches,self.nrows*axes_height_inches),
 +                        layout="constrained")
 + 
 +    if isinstance(self.arr_axes, (list, tuple, np.ndarray))==False:
 +      self.arr_axes=np.array([[self.arr_axes]])
 +
 +  def get_axes(self):
 +        return np.array(self.arr_axes).reshape(-1)
 +</sxh>
 +
 +
 +El uso de la clase es la siguiente. 
 +
 +Imagina que quieres mostrar 12 ''Axes'' en 3 columnas y luego obtener cada uno de los axes. 
 +
 +<sxh python>
 +figura=Figura(ncols=3,naxes=12)
 +
 +for axes in figura.get_axes():
 +  axes.plot()
 +</sxh>
 +
 +
 +La ventaja de esta clase es que no te tienes que preocupar del número de filas que va a haber. Que en este caso serán 4
 ===== Dibujando en 2D ===== ===== Dibujando en 2D =====
 Ahora veamos una serie de métodos para dibujar en un ''Axes'' o gráfica en 2 dimensiones Ahora veamos una serie de métodos para dibujar en un ''Axes'' o gráfica en 2 dimensiones
Línea 421: Línea 491:
 </note> </note>
  
-  * Otra forma de dibujar superficies en 3D es mostrar el eje Z como colores similar a las curvas de nivel en los mapas topográficos, se usa el método ''contourf''. El parámetro ''level'' indica el número de regiones distintas o curvas de nivel a mostrar.+  * Otra forma de dibujar superficies en 3D es mostrar el eje Z como colores similar a las curvas de nivel en los mapas topográficos, se usa el método ''contourf''. El parámetro ''levelsint'' indica el número de regiones distintas o curvas de nivel a mostrar.
  
 <sxh python> <sxh python>
Línea 692: Línea 762:
  
 {{:clase:iabd:pia:1eval:ejemplo_color.png|}} {{:clase:iabd:pia:1eval:ejemplo_color.png|}}
 +
 +También podemos obtener el siguiente color que vamos a usar con:
 +<sxh python>
 +color=next(axes._get_lines.prop_cycler)['color']
 +</sxh> 
 +
 +<note tip>
 +Destacar que al obtener el siguiente color ya no se usará ya que ese color se ha "gastado". Eso es porque al obtener el color se ha avanzado en el ciclo de colores y ese ya no se usaría.
 +Aunque obviamente se podría usar el color ya que tenemos el color en la variable ''color''
 +</note>
  
   * Con el método ''annotate'' podemos anotar los datos.   * Con el método ''annotate'' podemos anotar los datos.
Línea 778: Línea 858:
 <sxh python> <sxh python>
 axes.grid(visible=True, which='major', axis='both',color="#A0A0A0",linewidth=1) axes.grid(visible=True, which='major', axis='both',color="#A0A0A0",linewidth=1)
 +axes.set_axisbelow(True)
 </sxh> </sxh>
  
-{{:clase:iabd:pia:1eval:ejemplo_grid.png|}}+{{:clase:iabd:pia:1eval:ejemplo_grid.png?400|}} 
 + 
 +<note tip> 
 +Incluir ''axes.set_axisbelow(True)'' para que el grid esté por debajo en el z-orden. 
 +</note>
  
 <note tip> <note tip>
Línea 844: Línea 929:
  
 {{:clase:iabd:pia:1eval:ejemplo_spines.png|}} {{:clase:iabd:pia:1eval:ejemplo_spines.png|}}
 +
  
 ==== Superficies ==== ==== Superficies ====
Línea 1348: Línea 1434:
  
 <sxh python> <sxh python>
 +import numpy as np
 import pandas as pd import pandas as pd
 import seaborn as sns import seaborn as sns
 +from sklearn.datasets import load_iris
 +
 +iris=load_iris()
 +
 +#Obtener los datos
 +data=iris.data
 +target=iris.target
 +
 +feature_names=['longitud sepalo ','ancho sepalo','longitud petalo','ancho petalo'] #iris.feature_names
 +target_names=['setosa', 'versicolor', 'virginica'] #iris.target_names
 +target_unique=[0,1,2] #np.unique(target)
 +
 +#Crear el DataFrame con los datos
 +df=pd.DataFrame(data, columns=feature_names)
 +df['flores']=target
 +df['flores'] = df['flores'].replace(target_unique,target_names)
  
-iris =sns.load_dataset("iris") 
  
-sns.pairplot(iris,hue="species")+#Crear el gráfico 
 +sns.pairplot(df,hue="flores")
 </sxh> </sxh>
  
Línea 1359: Línea 1462:
  
 ==== Ejercicio 23.A ==== ==== Ejercicio 23.A ====
-De las diversas redes neuronales de las flores que hemos usado en temas anteriores, muestra una gráfica en la que se muestre:+De la primera red neuronal de las flores que hemos usado en el tema 1, muestra una gráfica en la que se muestre:
   * Eje X: Nº de época   * Eje X: Nº de época
   * Eje Y: Valor de la función de pérdida. Recuerda que los datos están en ''history.history['loss']''   * Eje Y: Valor de la función de pérdida. Recuerda que los datos están en ''history.history['loss']''
-  * El título del subplot constará de las neuronas de cada capa junto con el último valor de la función de pérdida entre paréntesis con dos decimales. Ej: //2, 4, 1 (0.56)// +  * Personaliza el gráfico de la forma siguiente: 
-  Etiqueta del eje X: "Nº de época" +    * El tamaño de la figura será de (7 y 5) 
-  Etiqueta del eje Y: "Valor pérdida+    * Eje X: 
-  Se usarán 100 épocas+      * El //label// será  "Nº Épocas", con color "#003B80" y tamaño de fuente 13 
 +      * Los números que parecerán serán siempre  números enteros y no con decimales 
 +    * Eje Y: 
 +      * El //label// será  "Métricas" con color "#003B80" y tamaño de fuente 13 
 +      Se verá del 0 al 1.1 
 +      * Los números a salir los números del eje Y serán  0.1, 0.2, etc  
 +    * El título del subplot será "Red:" y el número de neuronas de cada capa. 
 +    El color del fondo es ''#F0F7FF'' 
 +    * Que se vea el grid de los ejes de color blanco con ancho de las líneas de 2 píxeles. 
 +    * Para que la línea salga punteada para ello usa ''linestyle="dotted"'' en el método ''plot'' 
 +    El número que se muestra en la leyenda es "loss entrenamiento:" y  el valor en //loss// la última época con 2 decimales
  
-Indica a partir de que época ya no habría sido necesario seguir entrenando la red. 
  
-==== Ejercicio 23.B ==== 
-Crea una función de Python llamada ''plot_metrics(axes,history,title)'' 
  
-A la función la debes llamar de usa forma similar a la siguiente: 
  
-<sxh python> +**Para el entrenamiento se usarán 40 épocas**
-figure=plt.figure() +
-axes = figure.add_subplot() +
-history=model.fit()+
  
-plot_metrics(axes,history.history,"[2,4,8,4,2]")  +{{ :clase:iabd:pia:1eval:tema_4_ejercicio_23_a.png?direct |}}
-</sxh>+
  
-y debe mostrar una imagen similar a la siguiente:+==== Ejercicio 23.B ==== 
 +Crea una función de Python llamada ''plot_metrics(axes,history,title)'' de forma que salga el mismo gráfico que en el ejercicio anterior
  
-{{ :clase:iabd:pia:1eval:plot_epocas_loss.png?direct |}}+A la función la debes llamar de usa forma similar a la siguiente:
  
-  *Para que el eje X siempre sean números enteros, debes añadir la siguiente línea: 
 <sxh python> <sxh python>
-from matplotlib.ticker import MaxNLocator+history=model.fit(x, y,epochs=40,verbose=False)
  
-axes.xaxis.set_major_locator(MaxNLocator(integer=True))+figure=plt.figure(figsize=(7, 5)) 
 +axes figure.add_subplot(1,1,1) 
 + 
 +plot_metrics(axes,history.history,"Red:6,12,6,1"
 </sxh> </sxh>
  
-  * El color del fondo es ''#F0F7FF'' 
-  * El número que se muestra en la leyenda es el valor en la última época 
-  * Para que la línea salga punteada usa ''linestyle="dotted"'' en el método ''plot'' 
-  * Para sean del mismo color , calcula el color con ''color=next(axes._get_lines.prop_cycler)['color']'' 
-  * El eje Y siempre va de 0 a 1.1 
-  * Siempre deben salir los números del eje Y: 0.1, 0.2, etc. 
  
  
Línea 1405: Línea 1507:
  
 ^  Nº Neuronas en cada capa  ^ ^  Nº Neuronas en cada capa  ^
-|  2,4,2,+|  4, 8, 4, 2, 1  | 
-|  4,8,4,+|  8, 16, 8, 4, 1  | 
-|  8,16,8,+|  16, 32, 16, 8, 1  | 
-|  4,8,4,2,+|  32, 64, 32, 8, 1  | 
-|  8,16,8,4,+|  64, 128, 64, 8, 1  |
-|  16,32,16,8,+
-|  32,64,32,8,+
-|  64,128,64,8,1  | +
-|  8,16,32,64,32,16,8,1  |+
  
 Además: Además:
-  * Deberás mostrar los subplots en la  disposición de 3x3+  * Deberás mostrar los subplots en la  disposición de 2 filas y 3 columnas
   * El título de la figura será "Redes flores"   * El título de la figura será "Redes flores"
-  * El título de cada subplot será el nº de neuronas por capa +  * El Nº de épocas será 40.
-  * +
  
 Indica para cada red, a partir de que época ya no habría sido necesario seguir entrenando dicha red y cuales son las mejores redes Indica para cada red, a partir de que época ya no habría sido necesario seguir entrenando dicha red y cuales son las mejores redes
  
  
 +{{ :clase:iabd:pia:1eval:tema_4_ejercicio_23_c.png?direct |}}
 +
 +
 +==== Ejercicio 23.D ====
 +Repite el ejercicio anterior pero ahora divide los datos en entrenamiento y validación.
 +
 +Para ello usa la función ''train_test_split'' de sklearn
 +
 +<sxh python>
 +from sklearn.model_selection import train_test_split
 + 
 +x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
 +</sxh>
 +
 +El parámetro ''test_size'' indica el % de datos (en tpu) que serán para el test.
 +
 +Ahora deberás indicar en el método ''fit'' que ahora hay datos de entrenamiento y de test
 +
 +<sxh python>
 +history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=epochs,verbose=False)
 +</sxh>
 +
 +Para acabar ahora están las métricas de:
 +  * ''loss'' : La pérdida en entrenamiento
 +  * ''val_loss'' : La pérdida en validación
  
 +Al mostrar la gráfica, muestra tanto ''loss'' como ''val_loss'' del mismo color pero que la línea de ''val_loss'' sea continua y la línea de ''val_loss'' sea puenteada
  
 +{{:clase:iabd:pia:1eval:tema_4_ejercicio_23_d.png?direct|}}
  
  
clase/iabd/pia/1eval/tema04.1670761158.txt.gz · Última modificación: 2022/12/11 13:19 por admin