Herramientas de usuario

Herramientas del sitio


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

7. Entrenamiento de redes neuronales c) Métricas

Métricas

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

model.compile(loss="binary_crossentropy",optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),metrics=["binary_accuracy"])
history=model.fit(x,y_true,epochs=20,verbose=False)

Para obtener los valores de la métrica en cada época se usa la siguiente línea

history.history['binary_accuracy']

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 train_test_split de scikit-learn

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)

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í:

history=model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=epochs,verbose=False)

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_

history.history['val_binary_accuracy']

Veamos un ejemplo completo:

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)

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

Para acabar el tema vamos a ver las distintas métricas que existen. Lo primero es indicar nombres tanto en inglés como en español ya que vamos a usar los nombres en inglés

Inglés Español
Precision Precisión
Recall Exhaustividad
F1-score Valor-F
Accuracy Exactitud
Sensitivity Sensibilidad
Confusion Matrix Matriz de Confusión
True Positive Positivos Verdaderos
True Negative Negativos Verdaderos
False Positive Positivos Falsos
False Negative Negativos Falsos
  • Regresión
    • Mean Absolute Error (MAE)
    • Mean Squared Error (MSE)
    • Distancia del coseno
    • Root Mean Squared Error (RMSE)
    • Coeficiente de determinación o R²
  • Clasificación con 2 posibles valores
    • Binary Crossentropy
    • Accuracy
    • Precision
    • Recall o Sensitivity
    • F1-score
    • Area under the curve (AUC)
  • Clasificación con más de 2 posibles valores
    • Categorical Crossentropy
    • Categorical Accuracy

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:

history.history['loss']

Para mostrar la función de coste en la validación:

history.history['val_loss']

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)

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:

metrics=[tf.keras.metrics.MeanAbsoluteError()]
metrics=["mean_absolute_error"]

metrics=["mae"]

y usarla como

history.history['mean_absolute_error']
history.history['val_mean_absolute_error']

history.history["mae"]
history.history["val_mae"]

Mas información:

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:

metrics=[tf.keras.metrics.MeanSquaredError()]
metrics=["mean_squared_error"]

metrics=["mse"]

y usarla como

history.history['mean_squared_error']
history.history['val_mean_squared_error']

history.history["mse"]
history.history["val_mse"]

Mas información:

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:

metrics=[tf.keras.metrics.CosineSimilarity()]
metrics=["cosine_similarity"]

y se usa como

history.history['cosine_similarity']
history.history['val_cosine_similarity']

Mas información:

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 = \sqrt{MSE}= \sqrt{\frac{1}{N} \sum\limits_{i=1}^{N}(y_{i} - \hat{y_{i}})^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:

metrics=[tf.keras.metrics.RootMeanSquaredError()]

y se usa como

history.history['root_mean_squared_error']
history.history['val_root_mean_squared_error']

Mas información:

Coeficiente de determinación o R²

El coeficiente de determinación o R² se calcula de la siguiente forma:

$$R^{2} = 1- \frac {\sum\limits_{i=1}^{N} (y_{i} - \hat{y_{i}})^2} {\sum\limits_{i=1}^{N} (y_{i} - \bar{y})^2}$$ $$\bar{y}=\frac {1}{N} \sum\limits_{i=1}^{N} y_{i} - \hat{y_{i}}$$

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:

metrics=[tfa.metrics.RSquare()]

y se usa como

history.history['r_square']

Mas información:

Selección de métricas de regresión

La elección de una métrica u otra se puede ver en MAE, MSE, RMSE, Coefficient of Determination, Adjusted R Squared — Which Metric is Better? y 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 es mas robusto que MSE ante datos anómalos ya que MSE eleva el error al cuadrado y la regresión al intentar minimizar dicho error , tiende a ir hacia ese dato anómalo.

Métricas de clasificación con 2 posibles valores

Clasificación con 2 posibles valores es cuando la salida de nuestra red neuronal solo puede tener 2 posibles valores.

Antes de entrar a ver las métricas , es necesario entender lo que son:

  • True Positives (TP)
  • True Negatives (TN)
  • False Positives (FP): También llamados errores de Tipo I
  • False Negatives (FN): También llamados errores de Tipo II
Predicción
1 0
Realidad 1 TP FN
0 FP TN

Puesto con imágenes:

Predicción
1 0
Realidad 1
0

Para explicar todos estos conceptos véase los artículos:

Más información:

Umbral o Threshold

En la clasificación binaria los posibles valores son 1 y 0 o True y False. Sin embargo nuestra red neuronal suele sacar un valor entre 0 y 1. A ese valor se le llama y_score y en función de un threshold lo transformamos en el valor predicho o y_pred.

Si el valor del score es mayor que el threshold el valor predicho será un True mientras que si el valor del score es menor que el threshold el valor predicho será un False

Veamos un ejemplo de ello:

y_score=np.array([0.27, 0.45,  0.76,  0.55,  0.28, 0.04, 0.34,0.4, 0.66, 0.88, 0.94,0.47,0.2])
y_pred=y_score>0.5
print(y_pred)

Siendo el resultado

[False False  True  True False False False False  True  True  True False False]

Por ello la mayoría de nuestras métricas son dependientes del valor que indiquemos de threshold. Excepto la métrica de AUC que es independiente del valor de threshold.

Un ejemplo de lo que acabamos de ver está en las métricas de f1-score y AUC de sklearn. En https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html los parámetros de entrada son y_true e y_pred mientras que en https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html los parámetros de entrada son y_true e y_score

Accuracy

Accuracy nos indica la proporción de aciertos que ha tenido. Es decir el porcentaje (en tanto por uno) de TP y TN respecto al total

Predicción
1 0
Realidad 1 TP FN
0 FP TN

$$Binary \: Accuracy = \frac{TN+TP}{TN+TP+FN+FP}$$

La métrica de Accuracy no funciona bien cuando no hay el mismo número de clases del tipo 0 y del tipo 1.

Su uso en Keras es

metrics=[tf.keras.metrics.BinaryAccuracy()]
metrics=["binary_accuracy"]

y usarla como

history.history['binary_accuracy']
history.history['val_binary_accuracy']

No confundir tf.keras.metrics.BinaryAccuracy() con tf.keras.metrics.Accuracy() ya que esta última necesita que los valores de $y$ e $\hat{y}$ sean exactamente iguales

Un ejemplo:

y_true = np.array([0.0, 1.0, 0.0, 1.0])
y_pred = np.array([0.1, 0.9, 0.9, 0.1])
metric = tf.keras.metrics.BinaryAccuracy()
metric(y_true, y_pred).numpy()

0.5

Más información:

Precision

Nos dice el porcentaje (en tanto por uno) de los que hemos acertado como verdaderos respecto a los predichos como verdaderos

Predicción
1 0
Realidad 1 TP FN
0 FP TN

$$Precision = \frac{TP}{TP+FP}$$

La métrica de Precision es importante cuando nos interesa que no haya muchos falsos positivos. Un ejemplo sería un modelo que predice donde hay yacimientos de petroleo. Un falso positivo implicaría invertir mucho dinero en montar el sistema de extracción de petroleo para que luego no hubiera petroleo.

Su uso en Keras es

metrics=[tf.keras.metrics.Precision()]
metrics=["Precision"]

y usarla como

history.history['precision']
history.history['val_precision']

Ejemplo:

y_true = np.array([0.0, 1.0, 1.0, 1.0])
y_pred = np.array([0.9, 0.9, 0.9, 0.1])
metric = tf.keras.metrics.Precision()
metric(y_true, y_pred).numpy()

0.6666667

Más información:

Recall o Sensitivity

Nos dice el porcentaje (en tanto por uno) de los que hemos acertado como verdaderos respecto a los que realmente eran verdaderos

Esta métrica también se suele llamar TPR (True Positive Rate) o Recall o Sensitivity
Predicción
1 0
Realidad 1 TP FN
0 FP TN

$$Sensitivity = \frac{TP}{TP+FN}$$

La métrica de Recall es importante cuando nos interesa que no haya muchos falsos negativos. Un ejemplo sería un modelo que predice si tenemos cáncer. Un falso positivo implicaría que dejaremos sin tratar a una persona que si que tiene cancer.

Su uso en Keras es

metrics=[tf.keras.metrics.Recall()]
metrics=["Recall"]

y usarla como

history.history['recall']
history.history['val_recall']

Ejemplo:

y_true = np.array([1.0, 1.0, 1.0, 0.0])
y_pred = np.array([0.9, 0.0, 0.0, 0.9])
metric = tf.keras.metrics.Recall()
metric(y_true, y_pred).numpy()

0.33333334

Más información:

NPV

Negative Predictive Value (NPV) nos dice el porcentaje (en tanto por uno) de los que hemos acertado como negativos respecto a los predichos como negativos

Predicción
1 0
Realidad 1 TP FN
0 FP TN

$$Negative Predictive Value (NPV) = \frac{TN}{TN+FN}$$

La métrica de NPV es importante cuando nos interesa que no haya muchos falsos negativos

En keras no existe esta métrica pero se ha explicado para que estén las principales métricas que se pueden hacer con la matriz de confusión.

En la siguiente tabla se pueden ver las 5 principales métricas.

F1-score

Es la media armónica entre Recall y Precision que permite combinar en una única métrica ambos valores. Se usa cuando nos interesa un compromiso entre los errores de tipo I (Falsos positivos) y los de tipo II (Falsos negativos). Se ha usado la media armónica ya que tiende atener un valor muy bajo para valores bajos. Por ello no se "cancelan" valores buenos de Recall con valores malos de Precision ya que en ese caso F1-score tenderá a ser bajo por lo que indicará que nuestro modelo es malo.

$$F1{\text -}score=\frac{2}{\frac{1}{Recall}+\frac{1}{Precision}}$$

Pero si sumamos las fracciones y hacemos la división:

$$F1{\text -}score=\frac{2}{\frac{1}{Recall}+\frac{1}{Precision}}= \frac{2}{\frac{Precision}{Recall \cdot Precision}+\frac{Recall}{Precision \cdot Recall}}= \frac{2}{\frac{Precision+Recall}{Recall \cdot Precision}} = \frac{2}{1}: \frac{Precision+Recall}{Recall \cdot Precision} = \frac { 2 \cdot Recall \cdot Precision}{Recall + Precision}$$

Siendo el resultado la formula que se ve como definición de F1-score:

$$F1{\text -}score=2 \cdot \frac {Recall \cdot Precision}{Recall + Precision}$$

La métrica de "F1-score" está en Tensorflow addons que es necesario instalar previamente.

Su uso en Keras es

import tensorflow_addons as tfa

metrics=[tfa.metrics.F1Score(num_classes=1, threshold=0.5)]

y usarla como

history.history['f1_score']
history.history['val_f1_score']

Destacar que a la clase F1Score es necesario pasarle los argumentos:
  • num_classes con el valor de 1 para clasificaciones binarias.
  • threshold con el valor que deseemos ya que por defecto su valor es None lo que implica que solo acepta como True si el valor es 1, siendo el resto de valores un False

Un ejemplo:

y_true = np.array([0.0, 1.0, 0.0, 1.0]).reshape(-1,1)
y_pred = np.array([0.1, 0.9, 0.4, 0.1]).reshape(-1,1)
metric = tfa.metrics.F1Score(num_classes=1, threshold=0.5)
metric(y_true, y_pred).numpy()[0]

0.6666667

A partir de Tensorflow 2.12.0 e instlandolo como pip install tf-nightly la métrica de F1-score se encuentra en tf.keras.metrics.F1Score.

Mas información:

Matthews Correlation Coefficient o MMC

Es otra métrica pero que tiene en cuenta que los datos no estén balanceados.

El MMC tiene un valor entre -1 a 1. Siendo:

  • 1 : El clasificador funciona perfectamente
  • 0 : El clasificador acierta aleatoriamente
  • -1 : El clasificador acierta peor que aleatoriamente, es decir que clasifica al revés "perfectamente"

$$MCC = \frac{ \mathit{TP} \times \mathit{TN} - \mathit{FP} \times \mathit{FN} } {\sqrt{ (\mathit{TP} + \mathit{FP}) ( \mathit{TP} + \mathit{FN} ) ( \mathit{TN} + \mathit{FP} ) ( \mathit{TN} + \mathit{FN} ) } }$$

Podemos hacer uso de la métrica con la función sklearn.metrics.matthews_corrcoef de sklearn

Ejemplo de uso:

from sklearn.metrics import matthews_corrcoef

y_true = [1,1,1,1,0,0,0,0]
y_pred = [1,1,1,1,0,0,0,0]
print("Valor para una predicción que acierta siempre=",matthews_corrcoef(y_true,y_pred))

y_true = [1,1,1,1,0,0,0,0]
y_pred = [1,1,0,0,1,1,0,0]
print("Valor para una predicción que acierta la mitad=",matthews_corrcoef(y_true,y_pred))

y_true = [1,1,1,1,0,0,0,0]
y_pred = [0,0,0,0,1,1,1,1]
print("Valor para una predicción que nunca acierta=",matthews_corrcoef(y_true,y_pred))

Valor para una predicción que acierta siempre= 1.0
Valor para una predicción que acierta la mitad= 0.0
Valor para una predicción que nunca acierta= -1.0

La métrica también está en tfa.metrics.MatthewsCorrelationCoefficient pero he visto que no tiene el parámetro threshold por lo que solo trabaja con valores de predicción y no de score. Se puede comprobar ya que el siguiente código da el error Classification metrics can't handle a mix of binary and continuous targets:
from sklearn.metrics import matthews_corrcoef

y_true = [1,0]
y_pred = [0.9,0.2]
matthews_corrcoef(y_true,y_pred)


Además en https://stackoverflow.com/questions/56865344/how-do-i-calculate-the-matthews-correlation-coefficient-in-tensorflow se indica que:

Also please note that MCC values printed from Keras during iterations will be incorrect because of the metric calculation per batch size. You can only trust MCC value from calling "evaluate" or "score" after fitting. This is because MCC for the whole sample is not the sum/average of the parts, unlike the other metrics. For example, if your batch size is one, MCC printed will be zero during iterations.

Mas información:

Area under the curve (AUC)

La Area under the curve (AUC) es una métrica que nos dice el área de una curva ROC. Pero pasemos primero a explicar que es una curva ROC.

Lo primero es que cuando predecimos que ciertos valores son Positivos o Negativos, lo hacemos en base a un umbral. Normalmente si algo es menor o igual que 0.5 decimos que es Negativo y si es mayor que 0.5 decimos que es Positivo. Pero ese umbral es arbitrario.

La siguiente imagen muestra la distribución de valores que hemos definido como presuntamente Positivos y los presuntamente Negativos. Si superan ese umbral se convierten en Falsos Positivos o Falsos Negativos.

En las siguientes gráficas vamos a ver como afecta a nuestro modelo el variar el umbral.

Vamos a explicar cada columna de la imagen anterior:

  • 1º Columna: Se muestra la distribución de los Positivos y los Negativos que ha hecho el modelo. Pero según el umbral podrán ser True Positive (TP), True Negative (TN),False Positive (FP) y False Negative (FN)
  • 2º Columna: Se muestra como evolucionan los True Positive (TP), True Negative (TN),False Positive (FP) y False Negative (FN) según se modificara el umbral. Para ello para cada umbral entre 0 y 1:
    • Se cuenta cuantos Positivos hay bajo el umbral que serán los False Positive (FP)
    • Se cuenta cuantos Positivos hay sobre el umbral que serán los True Positive (TP)
    • Se cuenta cuantos Negativos hay bajo el umbral que serán los True Negative (TN)
    • Se cuenta cuantos Negativos hay sobre el umbral que serán los False Negative (FN)
  • 3º Columna: Se calculan las métricas de True Positive Rate (TPR) y False Positive Rate (FPR) según las siguientes fórmulas:

\begin{align} True \: Positive \: Rate \: (TPR) &= \frac{TP}{TP+FN} \\ False \: Positive \: Rate \: (FPR) &= \frac{FP}{FP+TN} \end{align}

  • 4º Columna: Muestra el True Positive Rate (TPR) frente a False Positive Rate (FPR). Es decir que cada punto la X de la gráfica es el FPR y la Y de la gráfica es el TPR.

Cada una de las filas de la imagen son predicciones distintas, siendo:

  • 1º Fila: Una predicción perfecta.
  • 2º Fila: Una predicción buena
  • 3º Fila: Una predicción mala en la que falla lo mismo que acierta. Sería como hacerlo aleatorio con un 50% de probabilidades de acertar.
  • 4º Fila: Una predicción nefasta que falla la mayoría de las veces.
  • 5º Fila: Una predicción lamentable que nunca acierta.

Entonces, ¿Que es la Area under the curve (AUC)? Es el área de la curva ROC es decir el área rosa de las gráficas de la última columna. Si nos fijamos cuanto mejor es la predicción, mayor es el área rosa y por lo tanto mayor es la métrica de AUC.

Destacar que se hace uso de la métrica AUC que es una métrica como cualquier otra que tiende a 1 si es buena y a 0 si es mala pero lo que no vas a ver al usar la métrica de AUC es la curva ROC. La curva ROC se muestra para entender que significa la métrica AUC pero no se dibuja normalmente.

En keras podemos usar la métrica de AUC de la siguiente forma: Su uso en Keras es

metrics=[tf.keras.metrics.AUC()]
metrics=["AUC"]

y usarla como

history.history['auc']
history.history['val_auc']

¿que métrica es mejor? Depende del objetivo de tu red neuronal pero si comparamos F1-score vs ROC AUC la regla más sencilla es la siguiente:
  • Si tenemos aproximadamente la misma cantidad de positivos y negativos: Usar ROC AUC
  • Si tenemos más positivos o mas negativos: Usar F1-score

Mas información:

Mas información:

Resumen

Métricas de clasificación con más de 2 posibles valores

Categorical Accuracy

Accuracy nos indica la proporción de aciertos que ha tenido. Es decir el porcentaje (en tanto por uno) de verdaderos positivos y verdaderos negativos

Su uso en keras es:

metrics=[tf.keras.metrics.CategoricalAccuracy()]
metrics=["categorical_accuracy"]

y usarla como

history.history['categorical_accuracy']
history.history['val_categorical_accuracy']

Mas información:

Ejercicios

Ejercicio 1

Si una red neuronal para detectar si una radiografía es de un tórax ha predicho lo siguiente:

  • Para 13 radiografías que eran de tórax , en 8 ha dicho que era un tórax y en 5 ha dicho que no lo era.
  • Para 7 radiografías que no eran un tórax , en 4 ha dicho que no era un tórax y en 3 ha dicho que lo era.

Indica el nº de:

  • Verdaderos Positivos (TP)
  • Verdaderos Negativos (TN)
  • Falsos Positivos (FP)
  • Falsos Negativos (FN)

Dibuja la matriz de confusión

Ejercicio 2.A

Seguimos con la red neuronal que predice si una radiografía es de tórax.

Si para 10 imágenes ha sacado los siguientes resultados:

y_score=np.array([0.27, 0.45,  0.76,  0.55,  0.28, 0.04, 0.34,0.4, 0.66, 0.88, 0.94,0.47,0.2])

Indica para cada valor predicho , si ha predicho que era una imagen de tórax o no.

Ejercicio 2.B

Seguimos con la red neuronal que predice si una radiografía es de tórax.

Si para 10 imágenes ha sacado los siguientes resultados:

y_score=np.array([0.27, 0.45,  0.76,  0.55,  0.28, 0.04, 0.34,0.4, 0.66, 0.88, 0.94,0.47,0.2])

Pero los valores verdaderos son los siguientes:

y_true=np.array([1,0,1,0,0,0,1,0,1,1,1,1,0])

Indica el nº de:

  • Verdaderos Positivos (TP)
  • Verdaderos Negativos (TN)
  • Falsos Positivos (FP)
  • Falsos Negativos (FN)

Dibuja la matriz de confusión

Ejercicio 2.C

Siguiendo con los datos anteriores y suponiendo que el umbral es 0.5:

y_true=np.array([1,0,1,0,0,0,1,0,1,1,1,1,0])
y_score=np.array([0.27, 0.45,  0.76,  0.55,  0.28, 0.04, 0.34,0.4, 0.66, 0.88, 0.94,0.47,0.2])

Calcula las siguientes métricas:

  • Accuracy
  • Precision
  • Recall o Sensitivity
  • Negative Predictive Value
  • Specificity
  • F1-score
  • MCC

Ejercicio 3.A

Crea una red neuronal con los datos de bread cancer con las siguientes características:

  • neuronas por capa:[30,64,32,16,8,1]
  • Función de activation: ELU
  • Nº de epocas: 20
  • Tasa de aprendizaje: 0.0001
  • Optimizador: Adam

Muestra la matriz de confusión y calcula las siguientes métricas:

  • Accuracy
  • Precision
  • Recall o Sensitivity
  • Negative Predictive Value
  • Specificity
  • F1-score
  • MCC

Para ello deberás usar el método predict para obtener el array y_score y suponer que el umbral es 0.5. Usa los datos de validación

Ejercicio 3.B

Vuelve a calcular otra vez las métricas y la matriz de confusión pero ahora con los siguientes umbrales:

  • 0.4
  • 0.5
  • 0.85

¿Cual crees que sería el mejor umbral para esta red? Fíjate como mejora la sensitividad y la especificidad según varia el umbral.

Ejercicio 3.C

Vuelve a entrenar la red anterior pero ahora muestra las siguientes métricas durante el entrenamiento:

  • Accuracy
  • F1-score
  • AUC
  • MMC
clase/iabd/pia/2eval/tema07.metricas.txt · Última modificación: 2024/01/05 20:30 por admin