Processing math: 100%

Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema07.metricas_regresion

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:2eval:tema07.metricas_regresion [2024/10/11 10:03]
admin [Coeficiente de determinación o R²]
— (actual)
Línea 1: Línea 1:
-====== 7.c Metricas regresión ====== 
-Hasta ahora hemos visto como definir una red neuronal y como entrenarla. El último paso que nos queda es saber si la red ha funcionado correctamente.  Pero ¿Eso no se hacía con la función de coste? Pues no exactamente. La función de coste se usa para ayudar a ajustar los parámetros durante el entrenamiento mediante los datos de entrada pero no para saber si el modelo es bueno. Para saber si el modelo es bueno , se usan las métricas. 
- 
-Las métricas son muy parecidas a las funciones de coste pero hay métricas que no existen como función de coste. El muchos casos la métrica será la misma que la función de coste. 
- 
- 
-En el método ''fit'' de Keras tenemos un nuevo parámetro para indicar la métrica llamado ''metrics'' que contiene un array con todas las métricas que queremos tener en nuestra red mientras se va entrenando 
- 
-<sxh python> 
-model.compile(loss="binary_crossentropy",optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),metrics=["AUC"]) 
-history=model.fit(x,y_true,epochs=20,verbose=False) 
-</sxh> 
- 
-Para obtener los valores de la métrica en cada época se usa la siguiente línea 
- 
-<sxh python> 
-history.history['auc'] 
-history.history['val_auc'] 
-</sxh> 
- 
- 
-===== Validación ===== 
-Acabamos de ver que entrenando la red neuronal , el error se consigue bajar a prácticamente cero. Es decir que los valores de los parámetros , pesos (weight) y sesgos bias, debe ser muy buenos. No exactamente. Resulta que los parámetros se han ajustado a los datos que le hemos pasado, pero ¿Como es de bueno el modelo para nuevos datos que no ha visto? **Realmente ver como se comporta con datos nuevos y con los datos que ha ya visto es lo que nos va a decir como es de bueno nuestro modelo**. Así que pasemos a ver como sacar las métricas también con datos nuevos. 
- 
-Lo primero es averiguar de donde obtenemos nuevos datos. Normalmente no tenemos nuevos datos así que lo que hacemos es que solo vamos a entrenar nuestra red neuronal con el 80% de los datos y el 20% restante los guardaremos para validar la red neuronal. Eso lo vamos a hacer con la función [[https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html|train_test_split]] de [[https://scikit-learn.org/|scikit-learn]] 
- 
-<sxh python> 
-from sklearn.model_selection import train_test_split 
- 
-x_train, x_test, y_train, y_test = train_test_split(x, y_true, test_size=0.2, random_state=42) 
-</sxh> 
- 
-La función ''train_test_split'' tiene los siguientes argumentos: 
-  * Los primeros arrays son los datos a //dividir// entre los datos de entrenamiento o de validación (//test// en inglés). 
-  * ''test_size'': La fracción de datos que se va a usar para la validación.Es un valor de 0.0 a 1.0. Siendo 0.0 que no hay datos para validación y 1.0 que todos sería para validación.Un valor aceptable de ''test_size'' es entre ''0.2'' a ''0.3'' 
-  * ''random_state'': Es para que sea reproducible el generador de los números aleatorios.  
-  * retorna los 4 array: 
-    * ''x_train'': Array con la ''x'' de los datos de entrenamiento 
-    * ''x_test'': Array con la ''x'' de los datos de validación  
-    * ''y_train'': Array con la ''y'' de los datos de entrenamiento 
-    * ''y_test'': Array con la ''y'' de los datos de validación 
- 
-Y ahora a Keras se los tenemos que pasar así: 
- 
-<sxh python> 
-history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=epochs,verbose=False) 
-</sxh> 
- 
-Lo datos de entrenamiento se pasan igual que antes pero los de validación se pasan en en un tupla en un parámetro llamado ''validation_data''. 
- 
-Por último tenemos que obtener la métrica para los datos de validación. Se obtiene igual que antes pero el nombre de la métrica empieza por ''val_'' 
- 
-<sxh python> 
-history.history['val_binary_accuracy'] 
-</sxh> 
- 
-Veamos un ejemplo completo: 
- 
-<sxh python> 
-import numpy as np 
-import tensorflow as tf 
-import numpy as np 
-import pandas as pd 
-import keras 
-import random 
-from keras.models import Sequential 
-from keras.layers import Dense 
-from sklearn.datasets import load_iris 
-import matplotlib.pyplot as plt 
-from sklearn.model_selection import train_test_split 
- 
-iris=load_iris() 
-x=iris.data[0:99,2] 
-y_true=iris.target[0:99] 
- 
-np.random.seed(5) 
-tf.random.set_seed(5) 
-random.seed(5)   
- 
-x_train, x_test, y_train, y_test = train_test_split(x, y_true, test_size=0.2, random_state=42) 
- 
-model=Sequential() 
-model.add(Dense(3, input_dim=1,activation="sigmoid",kernel_initializer="glorot_normal")) 
-model.add(Dense(1,activation="sigmoid",kernel_initializer="glorot_normal")) 
-model.compile(loss="binary_crossentropy",optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),metrics=["binary_accuracy"]) 
-history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=40,verbose=False) 
- 
-figure=plt.figure(figsize=(8,6)) 
-axes = figure.add_subplot() 
- 
-axes.plot(history.history['binary_accuracy'],label="Entrenamiento "+str(history.history['binary_accuracy'][-1])) 
-axes.plot(history.history['val_binary_accuracy'],label="Validación "+str(history.history['val_binary_accuracy'][-1])) 
- 
-axes.legend() 
-axes.set_xlabel('Época', fontsize=15,labelpad=20,color="#003B80")   
-axes.set_ylabel('Valor métrica', fontsize=15,labelpad=20,color="#003B80") 
-axes.set_facecolor("#F0F7FF") 
-axes.grid(b=True, which='major', axis='both',color="#FFFFFF",linewidth=1) 
-</sxh> 
- 
-{{ :clase:iabd:pia:2eval:metricas_test_train.png?direct |}} 
- 
-Podemos ver en el gráfico que la métrica es muy similar con los datos de validación que con los de entrenamiento. otro detalle importante es que las métricas suelen ser buenas si su valor es 1 (al contrario de las funciones de pérdida en la que lo bueno era un 0) 
- 
-===== Tipos de métricas de regresión ===== 
-Son las métricas que se usan en problemas de regresión. Son casi las mismas que usábamos como funciones de coste.  
- 
-    * Mean Absolute Error (MAE) 
-    * Mean Squared Error (MSE) 
-    * Distancia del coseno 
-    * Root Mean Squared Error (RMSE) 
-    * Coeficiente de determinación o R² 
- 
- 
-Hay métricas que son exactamente iguales a las funciones de coste como MEA o MSE en los problemas de regresión MAE, MSE. Si ya las usamos como función de coste y queremos usarlas como métricas no es necesario indicarlas como métricas, se puede acceder a ellas de la siguiente forma: 
- 
-Para mostrar la función de coste en el entrenamiento: 
-<sxh python> 
-history.history['loss'] 
-</sxh> 
- 
- 
-Para mostrar la función de coste en la validación: 
-<sxh python> 
-history.history['val_loss'] 
-</sxh> 
- 
- 
-===== Mean Absolute Error (MAE) ===== 
-Es igual que la función de coste de Mean Absolute Error (MAE), así que no explicaremos nada mas sobre ella excepto como se usa en Keras como métrica 
- 
-Se define como: 
-<sxh python> 
-metrics=[tf.keras.metrics.MeanAbsoluteError()] 
-metrics=["mean_absolute_error"] 
- 
-metrics=["mae"] 
-</sxh> 
- 
-y usarla como 
-<sxh python> 
-history.history['mean_absolute_error'] 
-history.history['val_mean_absolute_error'] 
- 
-history.history["mae"] 
-history.history["val_mae"] 
-</sxh> 
- 
- 
- 
-Mas información: 
-  * [[https://keras.io/api/metrics/regression_metrics/#meanabsoluteerror-class|MeanAbsoluteError class]] 
- 
- 
-===== Mean Squared Error (MSE) ===== 
-Es igual que la función de coste de Mean Squared Error (MSE), así que no explicaremos nada mas sobre ella excepto como se usa en Keras como métrica 
- 
-Se define como: 
-<sxh python> 
-metrics=[tf.keras.metrics.MeanSquaredError()] 
-metrics=["mean_squared_error"] 
- 
-metrics=["mse"] 
-</sxh> 
- 
- 
-y usarla como 
-<sxh python> 
-history.history['mean_squared_error'] 
-history.history['val_mean_squared_error'] 
- 
-history.history["mse"] 
-history.history["val_mse"] 
-</sxh> 
- 
- 
- 
-Mas información: 
-  * [[https://keras.io/api/metrics/regression_metrics/#meansquarederror-class|MeanSquaredError class]] 
- 
- 
- 
-===== Distancia del coseno ===== 
-Es igual que la función de coste de Distancia del coseno, así que no explicaremos nada mas sobre ella excepto como se usa en Keras como métrica 
- 
-Se define en Keras como: 
-<sxh python> 
-metrics=[tf.keras.metrics.CosineSimilarity()] 
-metrics=["cosine_similarity"] 
-</sxh> 
- 
-y se usa como 
-<sxh python> 
-history.history['cosine_similarity'] 
-history.history['val_cosine_similarity'] 
-</sxh> 
- 
- 
-Mas información: 
-  * [[https://keras.io/api/metrics/regression_metrics/#cosinesimilarity-class|CosineSimilarity class]] 
- 
- 
-===== Root Mean Squared Error (RMSE) ===== 
-La Root Mean Squared Error (RMSE) o Raiz cuadrada del error cuadrático medio se calcula igual que el MSE pero se le aplica la raíz cuadrada. 
- 
-Por lo tanto su fórmula es 
- 
-RMSE=MSE=1NNi=1(yi^yi)2 
- 
-Ahora vamos a explicar algunas cosas de RMSE. 
-  * ¿Por qué se hace la raíz cuadrada? Pues porque antes habíamos elevado al cuadrado los errores 
-  * ¿Pero que ventaja tiene esa raíz cuadrada? La raíz cuadrada se hace para que el error esté en las mismas unidades que los datos. Es para que como //humanos// entendamos mejor el valor. Es decir que nosotros entendemos mejor el resultado de RMSE que el de MSE 
-  * ¿Por qué no existe la RMSE como función de coste? Por ahorrarnos el trabajo de hacer la raíz cuadrada. Como función de coste nos da igual el valor de MSE que la raíz cuadrada de MSE, la red va a funcionar igual. 
-  * ¿Por qué no existe RMAE? Por que con MAE no elevábamos nada al cuadrado así que no tiene sentido RMAE 
-  * A veces se intenta comprar los resultados de RMSE con MAE ya que ambos están en las mismas unidades. 
-  * Por lo que si queremos usar MSE como métrica es mejor usar RMSE   y como función de coste es mejor MSE 
- 
- 
-Se define en Keras como: 
-<sxh python> 
-metrics=[tf.keras.metrics.RootMeanSquaredError()] 
-</sxh> 
- 
-y se usa como 
-<sxh python> 
-history.history['root_mean_squared_error'] 
-history.history['val_root_mean_squared_error'] 
-</sxh> 
- 
-Mas información: 
-  * [[https://keras.io/api/metrics/regression_metrics/#rootmeansquarederror-class|RootMeanSquaredError class]] 
- 
- 
-===== Coeficiente de determinación o R² ===== 
-El coeficiente de determinación o R² se calcula de la siguiente forma: 
- 
- 
-R2=1Ni=1(yi^yi)2Ni=1(yiˉy)2 
-ˉy=1NNi=1yi^yi 
- 
-Siendo: 
- 
- 
-Ahora vamos a explicar algunas cosas de R² 
-  * MAE, MSE y RMSE son mejor cuanto menor es el valor, mientras que R² es mejor cuanto más se acerca a 1. 
-  * Un problema de R² es que aumenta su valor cuantas más variables tengamos de entrada (es decir el tamaño del vector de cada muestra) por eso se suele usar la métrica de R² ajustada. Para ello en Keras le pasaremos el argumento ''num_regressors'' a la clase ''RSquare'' 
- 
- 
-Se define en Keras como: 
-<sxh python> 
-metrics=[tfa.metrics.RSquare()] 
-</sxh> 
- 
-y se usa como 
-<sxh python> 
-history.history['r_square'] 
-</sxh> 
- 
-Mas información: 
-  * [[https://www.tensorflow.org/addons/api_docs/python/tfa/metrics/RSquare|tfa.metrics.RSquare]] 
-  * {{:clase:iabd:pia:2eval:errores_frecuentes_interpretacion_coeficiente_determinacion.pdf|Errores frecuentes en la interpretación del coeficiente de determinación lineal}} 
- 
- 
-===== Selección de métricas de regresión ===== 
-La elección de una métrica u otra se puede ver en [[https://medium.com/analytics-vidhya/mae-mse-rmse-coefficient-of-determination-adjusted-r-squared-which-metric-is-better-cd0326a5697e|MAE, MSE, RMSE, Coefficient of Determination, Adjusted R Squared — Which Metric is Better?]] y [[https://www.analyticsvidhya.com/blog/2021/05/know-the-best-evaluation-metrics-for-your-regression-model/|Know The Best Evaluation Metrics for Your Regression Model]] 
- 
-  * RMSE es mejor que MSE ya que está en las mismas unidades que el resultado y no al cuadrado. 
-  * MAE vs MSE: 
-      * MAE es mas robusto que MSE ante datos anómalos, es decir que los tiene menos en cuenta 
-      * MSE eleva el error al cuadrado y la regresión al intentar minimizar dicho error , tiende a ir hacia ese dato anómalo. Por lo que MSE tiene más en cuenta los datos anómalos. 
-      * Por lo tanto si los datos "anómalos" realmente no son anómalos sino situaciones "normales" pero poco frecuentes, deberíamos usar MSE, mientras que si los datos "anómalos" realmente son cosas "extrañas" que no deberíamos tener en cuenta, es mejor usar MAE. 
- 
- 
  
clase/iabd/pia/2eval/tema07.metricas_regresion.1728633784.txt.gz · Última modificación: 2024/10/11 10:03 por admin