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/02/27 19:50]
admin
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|$$
  
-pero sabiendo que:+Siguiendo con nuestro ejemplo de: 
 + 
 +{{ :clase:iabd:pia:1eval:simple_red.png?direct&400 |}}
  
 $$\hat{y}=\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 )}}$$ $$\hat{y}=\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 48: 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 )}}|    
 $$ $$
  
-La formula completa no es importante pero si sabe que el error depende tanto de los $parámetros$ como de la $x$ y de la $y$ verdadera.+La formula completa no es importante pero si saber que el error depende tanto de los $parámetros$de la $x$ y de la $y$ verdadera. 
 + 
 +Veamos el código en Python: 
 + 
 +Teníamos del tema anterior la creación de la red en Keras y hemos usado como ''loss'' (función de pérdida) a ''MAE'': 
 +<sxh python> 
 +import numpy as np 
 +import pandas as pd 
 +import tensorflow as tf 
 +from tensorflow.keras.models import Sequential 
 +from tensorflow.keras.layers import Dense 
 +from sklearn.datasets import load_iris 
 +  
 + 
 +def get_model(loss): 
 +    np.random.seed(5) 
 +    tf.random.set_seed(5) 
 +    random.seed(5)   
 +     
 +    model=Sequential() 
 +    model.add(Dense(3, input_dim=1,activation="sigmoid")) 
 +    model.add(Dense(1,activation="sigmoid")) 
 +    model.compile(loss=loss) 
 +     
 +    return model 
 + 
 +</sxh> 
 + 
 +Ahora creamos la función ''get_parameters_from_model'' para obtener los parámetros del modelo. 
 +<sxh python> 
 +def get_w(model,layer,neuron,index): 
 +    layer=model.layers[layer] 
 +    return layer.get_weights()[0][index,neuron] 
 +   
 +   
 +   
 +def get_b(model,layer,neuron): 
 +    layer=model.layers[layer] 
 +    return layer.get_weights()[1][neuron] 
 +  
 + 
 +def get_parameters_from_model(model): 
 +    w_2 =get_w(model,0,0,0) 
 +    w_3 =get_w(model,0,1,0) 
 +    w_4 =get_w(model,0,2,0) 
 +    w_52=get_w(model,1,0,0) 
 +    w_53=get_w(model,1,0,1) 
 +    w_54=get_w(model,1,0,2) 
 +    b_2 =get_b(model,0,0) 
 +    b_3 =get_b(model,0,1) 
 +    b_4 =get_b(model,0,2) 
 +    b_5 =get_b(model,1,0) 
 + 
 +    return w_2,w_3,w_4,w_52,w_53,w_54,b_2,b_3,b_4,b_5 
 +</sxh> 
 + 
 +La creación de la red neuronal mediante la fórmula es: 
 +<sxh python> 
 +def sigmoid(z): 
 +    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): 
 +    part1=w_52*sigmoid(w_2*x+b_2) 
 +    part2=w_53*sigmoid(w_3*x+b_3) 
 +    part3=w_54*sigmoid(w_4*x+b_4) 
 +    part4=b_5 
 +    z=part1+part2+part3+part4 
 +  
 +    return sigmoid(z) 
 +</sxh> 
 + 
 +Hasta aquí todo es prácticamente igual que el tema anterior. Ahora pasemos a definir la función de coste de ''MAE'' 
 + 
 +<sxh python> 
 +def loss_mae(y_true,y_pred): 
 +    error=np.abs(np.subtract(y_true,y_pred)) 
 +    mean_error=np.sum(error)/len(y_true) 
 + 
 +    return mean_error 
 +</sxh> 
 + 
 +Y por último vamos a calcular el ''loss'' tanto con Keras como con la función de coste: 
 + 
 +<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) 
 +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) 
 + 
 +print("loss con la formula:",loss_mae(y_true,y_pred),sep="\t\t"
 +print("loss con Keras     :",history.history['loss'][-1],sep="\t\t"
 +</sxh> 
 +<sxh base> 
 +loss con la formula: 0.006047901766686328 
 +loss con Keras     : 0.006072826683521271 
 +</sxh>
  
 En redes neuronales se suelen usar entre otras las siguientes funciones de coste: En redes neuronales se suelen usar entre otras las siguientes funciones de coste:
Línea 292: 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 303: 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 326: 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 339: 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 353: 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 388: 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 450: 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 486: 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 512: 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 567: 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 608: Línea 736:
   * Averiguar la cifra que se ha escrito una persona a mano.   * Averiguar la cifra que se ha escrito una persona a mano.
  
-==== Ejercicio 7.A ====+==== Ejercicio 7 ==== 
 +Crea una red neuronal para entrenar las flores. Tienes que entrenarla durante 300 épocas con todas las combinaciones de: 
 +  * Estructura de la red: 
 +    * [3] 
 +    * [4, 3] 
 +    * [4, 8, 3] 
 +    * [4, 8, 16, 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 
 + 
 + 
 + 
 +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 ====
 Crea y entrena una red neuronal que averigüe si un paciente tendrá diabetes. Los datos los obtendrás con la función ''load_diabetes''. Crea y entrena una red neuronal que averigüe si un paciente tendrá diabetes. Los datos los obtendrás con la función ''load_diabetes''.
  
Línea 620: Línea 772:
   * Elegir adecuadamente la función de coste a usar   * Elegir adecuadamente la función de coste a usar
  
-==== Ejercicio 7.B ====+==== Ejercicio 8.B ====
 Crea y entrena una red neuronal que averigüe el dígito que ha escrito una persona. Los datos los obtendrás con la función ''load_digits''. Crea y entrena una red neuronal que averigüe el dígito que ha escrito una persona. Los datos los obtendrás con la función ''load_digits''.
  
Línea 633: Línea 785:
   * Elegir adecuadamente la función de coste a usar   * Elegir adecuadamente la función de coste a usar
  
-==== Ejercicio 7.C ====+==== Ejercicio 8.C ====
 Crea y entrena una red neuronal que averigüe el tipo de un vino. Los datos los obtendrás con la función ''load_wine''. Crea y entrena una red neuronal que averigüe el tipo de un vino. Los datos los obtendrás con la función ''load_wine''.
  
Línea 646: Línea 798:
   * Elegir adecuadamente la función de coste a usar   * Elegir adecuadamente la función de coste a usar
  
-==== Ejercicio 7.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 7.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