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:50]
admin [Ejercicios]
clase:iabd:pia:1eval:tema04 [2024/09/10 18:22] (actual)
admin [Dibujando en 3D]
Línea 28: Línea 28:
     * [[https://medium.com/@morganjonesartist/color-guide-to-seaborn-palettes-da849406d44f|Color Guide to Seaborn Palettes]]     * [[https://medium.com/@morganjonesartist/color-guide-to-seaborn-palettes-da849406d44f|Color Guide to Seaborn Palettes]]
     * [[https://towardsdatascience.com/simple-steps-to-create-custom-colormaps-in-python-f21482778aa2|Simple steps to create custom colormaps in Python]]     * [[https://towardsdatascience.com/simple-steps-to-create-custom-colormaps-in-python-f21482778aa2|Simple steps to create custom colormaps in Python]]
 +
 +
 +Antes de empezar mira estas 2 gráficas (Shelly y Tuya) y dime si se parecen:
 +
 +{{:clase:iabd:pia:1eval:escala1.png?direct|}}
 +
 +Obviamente no se parecen
 +
 +Y ahora mira esta otra gráfica y dime si ahora se parecen (Shelly y Tuya):
 +
 +{{:clase:iabd:pia:1eval:escala2.png?direct|}}
 +
 +En esta se parecen más. 
 +
 +Realmente la primera gráfica es el final de la segunda gráfica pero ambas gráficas están en una escala distinta.
 +
 +El ejemplo está puesto para que se vea como se interpreta de una forma u otra una gráfica según la escala a la que esté. La primera gráfica está en la escala [ 650 W - 1050 W ] mientras que la segunda gráfica su escala es [0 W - 2500 W]
 +
 +Por lo tanto, intenta que siempre las gráficas empiecen los ejes en 0.
  
 ===== Instalación e importación===== ===== Instalación e importación=====
Línea 195: Línea 214:
 ===== 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 243:
  
  
 +==== 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 304:
 {{: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 510:
 </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 ''levels'' indica el número de regiones distintas o curvas de nivel a mostrar.
  
 <sxh python> <sxh python>
Línea 435: Línea 524:
 z =  3*(1 - x)**2 * np.exp(-x**2 - (y + 1)**2)  - 10*(x/5 - x**3 - y**5)*np.exp(-x**2 - y**2) - 1./3*np.exp(-(x + 1)**2 - y**2)  z =  3*(1 - x)**2 * np.exp(-x**2 - (y + 1)**2)  - 10*(x/5 - x**3 - y**5)*np.exp(-x**2 - y**2) - 1./3*np.exp(-(x + 1)**2 - y**2) 
  
-axes.contourf(x,y,z,levelsint=30)+axes.contourf(x,y,z,levels=30)
 </sxh> </sxh>
  
Línea 692: Línea 781:
  
 {{: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 877:
 <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 948:
  
 {{:clase:iabd:pia:1eval:ejemplo_spines.png|}} {{:clase:iabd:pia:1eval:ejemplo_spines.png|}}
 +
  
 ==== Superficies ==== ==== Superficies ====
Línea 902: Línea 1007:
 {{:clase:iabd:pia:1eval:ejemplo_3d_surface_shadow.png|}} {{:clase:iabd:pia:1eval:ejemplo_3d_surface_shadow.png|}}
  
 +==== Estableciendo el estilo ====
 +Es posible establecer el estilo general que usan los gráficos en mathplotlib. Es decir que tengan ya un aspecto predefinido.
 +
 +Simplemente con la línea ''plt.style.use('ggplot')'' tendrá el estilo que se usan en [[https://ggplot2.tidyverse.org/|ggplot]]
 +
 +Haciendo que los gráficos pasen de tener este estilo por defecto:
 +
 +{{:clase:iabd:pia:1eval:style_default.png?direct|}}
 +
 +a tener este otro estilo:
 +
 +{{:clase:iabd:pia:1eval:style_ggplot.png?direct|}}
 +
 +Para saber los posibles estilos que hay , solo tenemos que ejecutar:
 +<sxh python>
 +print(plt.style.available)
 +</sxh>
 +
 +<sxh python>
 +[
 + 'Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh',
 + 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 
 + 'seaborn-v0_8', 'seaborn-v0_8-bright', 'seaborn-v0_8-colorblind', 'seaborn-v0_8-dark',
 + 'seaborn-v0_8-dark-palette', 'seaborn-v0_8-darkgrid', 'seaborn-v0_8-deep', 'seaborn-v0_8-muted', 
 + 'seaborn-v0_8-notebook', 'seaborn-v0_8-paper', 'seaborn-v0_8-pastel', 'seaborn-v0_8-poster',
 + 'seaborn-v0_8-talk', 'seaborn-v0_8-ticks', 'seaborn-v0_8-white', 'seaborn-v0_8-whitegrid', 
 + 'tableau-colorblind10'
 +]
 +</sxh>
 +
 +Como podemos ver hay muchos estilos relacionados con [[https://seaborn.pydata.org/|Seaborn]]
 ===== Ejercicios ===== ===== Ejercicios =====
  
Línea 1348: Línea 1484:
  
 <sxh python> <sxh python>
 +import numpy as np
 +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 1361: Línea 1515:
   * 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 1404: Línea 1557:
  
 ^  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.1670763045.txt.gz · Última modificación: 2022/12/11 13:50 por admin