Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema07

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
Última revisión Ambos lados, revisión siguiente
clase:iabd:pia:2eval:tema07 [2022/03/17 15:41]
admin [Ejercicios]
clase:iabd:pia:2eval:tema07 [2024/01/25 19:24]
admin [Ejercicios]
Línea 27: Línea 27:
 La forma mas fácil de ver las diferencias que hay  entre $y$ e $\hat{y}$ es simplemente restarlas y eso nos dará lo que llamamos el error: La forma mas fácil de ver las diferencias que hay  entre $y$ e $\hat{y}$ es simplemente restarlas y eso nos dará lo que llamamos el error:
  
-$$error=y-\hat{y}$$+$$error_i=y_i-\hat{y}_i$$
  
 Pero como tenemos muchas $y$ e $\hat{y}$ así que deberemos sumar todos los errores y hacer la media (dividirlo entre el número de datos): Pero como tenemos muchas $y$ e $\hat{y}$ así que deberemos sumar todos los errores y hacer la media (dividirlo entre el número de datos):
Línea 33: Línea 33:
 <note tip>A las funciones de coste también se les llama funciones de pérdida o //loss// en inglés.</note> <note tip>A las funciones de coste también se les llama funciones de pérdida o //loss// en inglés.</note>
  
-$$loss=\frac{1}{N} \sum_{i=1}^{N} (y_i-\hat{y}_i)$$+$$loss=error \: medio=\frac{1}{N} \sum_{i=1}^{N}  
 +error_i =\frac{1}{N} \sum_{i=1}^{N} (y_i-\hat{y}_i)$$
  
 sin embargo este primer intento no es muy adecuado ya que la suma de los errores positivos mas los errores negativos se podrían cancelar y obtener que no hay coste. sin embargo este primer intento no es muy adecuado ya que la suma de los errores positivos mas los errores negativos se podrían cancelar y obtener que no hay coste.
Línea 39: Línea 40:
 La primera función de coste sería entonces hacer el valor absoluto de los errores. La primera función de coste sería entonces hacer el valor absoluto de los errores.
  
-$$loss=\frac{1}{N} \sum_{i=1}^{N}|y_i-\hat{y}_i|$$+$$loss \: con \: MAE=error \: medio \: con \: MAE=\frac{1}{N} \sum_{i=1}^{N}|y_i-\hat{y}_i|$$
  
 Siguiendo con nuestro ejemplo de: Siguiendo con nuestro ejemplo de:
Línea 50: Línea 51:
  
 $$ $$
-\large loss=loss\_function(x,y,parámetros)=\frac{1}{N} \sum_{i=1}^{N}|y_i-\frac{1}{1 + e^{-(  w_{5,2}\frac{1}{1 + e^{-( w_{2}x+b_{2}  )}}+w_{5,3}\frac{1}{1 + e^{-( w_{3}x+b_{3}  )}}+w_{5,4}\frac{1}{1 + e^{-( w_{4}x+b_{4}  )}}+b_5 )}}|    +\large loss(x,y,parámetros)=\frac{1}{N} \sum_{i=1}^{N}|y_i-\frac{1}{1 + e^{-(  w_{5,2}\frac{1}{1 + e^{-( w_{2}x+b_{2}  )}}+w_{5,3}\frac{1}{1 + e^{-( w_{3}x+b_{3}  )}}+w_{5,4}\frac{1}{1 + e^{-( w_{4}x+b_{4}  )}}+b_5 )}}|    
 $$ $$
  
Línea 62: Línea 63:
 import pandas as pd import pandas as pd
 import tensorflow as tf import tensorflow as tf
-from keras.models import Sequential +from tensorflow.keras.models import Sequential 
-from keras.layers import Dense+from tensorflow.keras.layers import Dense
 from sklearn.datasets import load_iris from sklearn.datasets import load_iris
    
-iris=load_iris() 
-x=iris.data[0:99,2] 
-y_true=iris.target[0:99] 
  
-np.random.seed(5) +def get_model(loss): 
-tf.random.set_seed(5) +    np.random.seed(5) 
-  +    tf.random.set_seed(5) 
-model=Sequential() +    random.seed(5)   
-model.add(Dense(3, input_dim=1,activation="sigmoid")) +     
-model.add(Dense(1,activation="sigmoid")) +    model=Sequential() 
-model.compile(loss='mae'+    model.add(Dense(3, input_dim=1,activation="sigmoid")) 
-history=model.fit(x, y_true,epochs=1500,verbose=False)+    model.add(Dense(1,activation="sigmoid")) 
 +    model.compile(loss=loss
 +     
 +    return model 
 </sxh> </sxh>
  
Línea 110: Línea 112:
 La creación de la red neuronal mediante la fórmula es: La creación de la red neuronal mediante la fórmula es:
 <sxh python> <sxh python>
-def sigmoid(x): +def sigmoid(z): 
-    return 1/(1 + np.exp(-x))+    return 1/(1 + np.exp(-z))
    
 def predict_formula(x,w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5): def predict_formula(x,w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5):
Línea 136: Línea 138:
  
 <sxh python> <sxh python>
 +iris=load_iris()
 +x=iris.data[0:99,2]
 +y_true=iris.target[0:99]
 +
 +model=get_model("mae")
 +history=model.fit(x, y_true,epochs=1500,verbose=False)
 +
 w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5=get_parameters_from_model(model) w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5=get_parameters_from_model(model)
 y_pred=predict_formula(x,w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5) y_pred=predict_formula(x,w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5)
Línea 386: Línea 395:
 $$Binary \: Cross \: Entropy = - \frac{1}{N} \sum_{i=1}^{N} y_{i} \cdot log(\hat{y_i}) + (1-y_{i}) \cdot log(1-\hat{y_i}) $$  $$Binary \: Cross \: Entropy = - \frac{1}{N} \sum_{i=1}^{N} y_{i} \cdot log(\hat{y_i}) + (1-y_{i}) \cdot log(1-\hat{y_i}) $$ 
  
-Se ha puesto la fórmula para explicar que su valor va de $[0,\infty[$. Ya que por un lado el logaritmo de un número cercano a cero es menos infinito, de ahí que se ponga el signo menos al principio. Y que los datos de $y_i$ e $\hat{y_i}$ al ser probabilidades su rango es entre 0 y 1.+Los valores de $y_i$ suelen ser o 1mientras que los valores de $\hat{y_i}$ es un número real entre 0 y 1 
 + 
 +Veamos ahora graficamente como es la fórmula según si $y=0$ o $y=1$ 
 +{{:clase:iabd:pia:2eval:binary_crossentropy.png?nolink|}} 
 + 
  
 Su uso en Keras es: Su uso en Keras es:
Línea 397: Línea 411:
 Mas información: Mas información:
   * [[https://keras.io/api/losses/probabilistic_losses/#binarycrossentropy-class|BinaryCrossentropy class]]   * [[https://keras.io/api/losses/probabilistic_losses/#binarycrossentropy-class|BinaryCrossentropy class]]
 +  * [[https://towardsdatascience.com/where-did-the-binary-cross-entropy-loss-function-come-from-ac3de349a715|Where did the Binary Cross-Entropy Loss Function come from?]]
 +  * [[https://stats.stackexchange.com/questions/181035/how-to-derive-the-likelihood-function-for-binomial-distribution-for-parameter-es|How to derive the likelihood function for binomial distribution for parameter estimation?]]
   * [[https://machinelearningmastery.com/cross-entropy-for-machine-learning/|A Gentle Introduction to Cross-Entropy for Machine Learning]]   * [[https://machinelearningmastery.com/cross-entropy-for-machine-learning/|A Gentle Introduction to Cross-Entropy for Machine Learning]]
  
Línea 420: Línea 436:
 | Regresión  |  Lineal  |  MSE o Distancia del coseno  | | Regresión  |  Lineal  |  MSE o Distancia del coseno  |
 | Clasificación con 2 posibles valores |  Sigmoide  |  Binary Cross Entropy  | | Clasificación con 2 posibles valores |  Sigmoide  |  Binary Cross Entropy  |
-| Clasificación con más de 2 posibles valores |  Softmax  |  Categorical Cross Entropy  |+| Clasificación con más de 2 posibles valores NO excluyentes entre si |  Sigmoide  |  Binary Cross Entropy 
 +| Clasificación con más de 2 posibles valores SI excluyentes entre si |  Softmax  |  Categorical Cross Entropy  |
  
  
Línea 433: Línea 450:
 np.random.seed(5) np.random.seed(5)
 tf.random.set_seed(5) tf.random.set_seed(5)
- +random.seed(5)  
    
 model=Sequential() model=Sequential()
Línea 447: Línea 464:
 ===== Ejercicios ===== ===== Ejercicios =====
  
-==== Ejercicio 1 ====+==== Ejercicio 1.A ====
 En una red neuronal En una red neuronal
   * Estos son los valores que debería haber sacado la red   * Estos son los valores que debería haber sacado la red
Línea 482: Línea 499:
  
  
-Haz un programa en python que calcule **mediante las fórmulas** la pérdida de la red con ''MAE'' ''MSE''+Haz un programa en python que calcule **mediante las fórmulas** la pérdida de la red con ''MAE''''MSE'' y ''Binary Cross Entropy''
  
 +==== Ejercicio 1.B ====
 +Repita el ejercicio anterior pero ahora en vez de usar su código en python, usan las funciones de coste de keras:
 +  * ''tf.keras.losses.mean_absolute_error''
 +  * ''tf.keras.losses.mean_squared_error''
 +  * ''tf.keras.losses.categorical_crossentropy''
 + 
 ==== Ejercicio 2 ==== ==== Ejercicio 2 ====
 Tenemos dos redes neuronales, que deberían haber sacado los siguientes datos. Tenemos dos redes neuronales, que deberían haber sacado los siguientes datos.
Línea 544: Línea 567:
  
  
-Calcula la pérdida de las 2 redes con ''MAE'' y con ''MSE'' (mediante las funciones de Keras). +Calcula la pérdida de las 2 redes con ''MAE''''MSE'' y ''Binary Cross Entropy'' (mediante las funciones de Keras). 
  
-^ ^  MAE  ^  MSE  ^  +^ ^  MAE  ^  MSE  ^ Binary Cross Entropy 
-^  Red A  |    |    | +^  Red A  |    |    |   
-^  Red B  |    |    |+^  Red B  |    |    |   |
  
 ¿cual es mejor red? Explica porqué ¿cual es mejor red? Explica porqué
Línea 580: Línea 603:
 {{ :clase:iabd:pia:2eval:ejercicio_mse_mae.png?direct |}} {{ :clase:iabd:pia:2eval:ejercicio_mse_mae.png?direct |}}
  
 +<note warning> 
 +En este tema ya hemos aprendido que la función de perdida para este ejemplo debe ser **Binary Cross Entropy** pero seguimos usando ''MAE'' y ''MSE'' porque son más fáciles de calcular manualmente por el alumno en los ejercicios. 
 +</note>
  
 ==== Ejercicio 4 ==== ==== Ejercicio 4 ====
Línea 606: Línea 631:
  
 Comprueba si las 3 pérdidas tienen el mismo valor. Comprueba si las 3 pérdidas tienen el mismo valor.
 +
 +<note warning>
 +En este tema ya hemos aprendido que la función de perdida para este ejemplo debe ser **Binary Cross Entropy** pero seguimos usando ''MAE'' y ''MSE'' porque son más fáciles de calcular manualmente por el alumno en los ejercicios.
 +</note>
  
 ==== Ejercicio 5.A ==== ==== Ejercicio 5.A ====
Línea 661: Línea 690:
 <sxh python> <sxh python>
 df = df.pivot(index='palabra_y', columns='palabra_x', values='distancia_coseno') df = df.pivot(index='palabra_y', columns='palabra_x', values='distancia_coseno')
 +</sxh>
 +
 +muestra el heatmap
 +<sxh python>
 +sns.heatmap(df,ax=axes)
 </sxh> </sxh>
  
Línea 703: Línea 737:
  
 ==== Ejercicio 7 ==== ==== Ejercicio 7 ====
-Crea una red neuronal para entrenar las flores. Tienes que entrenarla durante 100 épocas con todas las combinaciones de: +Crea una red neuronal para entrenar las flores. Tienes que entrenarla durante 300 épocas con todas las combinaciones de: 
-  * Funciones de activaciónSigmoidTanhReLULeakyReLUSeLUELU +  * Estructura de la red: 
-  * Funciones de pérdidaMSE, MAE, Binary Crossentropy, Categorical Crossentropy+    * [3] 
 +    * [43] 
 +    * [483] 
 +    * [4816, 8, 3] 
 +    * [4, 8, 16, 32, 16, 8, 4, 3] 
 +    * [4, 8, 16, 32, 64, 32, 16, 8, 4, 3] 
 +    * [4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 3] 
 +  * Funciones de activación 
 +    * Sigmoid 
 +    * Tanh 
 +    * ReLU 
 +    * LeakyReLU 
 +    * SeLU 
 +    * ELU
  
-<note tip> 
-La función de activación de la última cada siempre debe ser ''softmax'' 
-</note> 
  
-La gráfica resultante debe ser similar a ésta: 
  
-{{ :clase:iabd:pia:2eval:rendimiento_loss.png?direct&600 |}}+Responde las siguientes cuestiones: 
 +  * ¿Cual ha resultado ser la mejor estructura de red? 
 +  * ¿Cual ha sido la mejor función de activación para la mejor estructura de red?
  
 ==== Ejercicio 8.A ==== ==== Ejercicio 8.A ====
Línea 754: Línea 799:
  
 ==== Ejercicio 8.D ==== ==== Ejercicio 8.D ====
-Crea y entrena una red neuronal que averigüe si una transacción es fraudulenta. Los datos los obtendrás de [[https://www.kaggle.com/mlg-ulb/creditcardfraud|Credit Card Fraud Detection Dataset]]+Crea y entrena una red neuronal que averigüe si tiene cáncer de mama. Los datos los obtendrás con la función ''load_breast_cancer''.
  
-Deberás: 
-  * Probar con varias funciones de activación en las capas ocultas para ver cual es la mejor. 
-  * Elegir adecuadamente la función de activación de la capa de salida 
-  * Elegir adecuadamente la función de coste a usar 
  
- +<sxh python> 
-==== Ejercicio 8.E ==== +from sklearn.datasets import load_breast_cancer 
-Crea y entrena una red neuronal con los datos de las flores pero ahora ya deberás tener en cuenta los 3 tipos de flor.+</sxh>
  
 Deberás: Deberás:
clase/iabd/pia/2eval/tema07.txt · Última modificación: 2024/01/30 15:26 por admin