Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
clase:iabd:pia:2eval:tema07.metricas [2024/03/12 08:38] admin [Teorema de Bayes] |
clase:iabd:pia:2eval:tema07.metricas [2024/03/25 19:13] admin [Teorema de Bayes] |
||
---|---|---|---|
Línea 530: | Línea 530: | ||
* Mejora el VPN ya que ha pasado de 0.93 a 0.97 | * Mejora el VPN ya que ha pasado de 0.93 a 0.97 | ||
+ | {{: | ||
+ | |||
+ | En la gráfica se puede ver como varían el VPP y el VPN según la prevalencia. Y la línea roja es con la prevalencia de los datos. | ||
Línea 616: | Línea 619: | ||
Más información en: | Más información en: | ||
* [[https:// | * [[https:// | ||
- | * [[tema07-apendices-metricas]] | + | * [[tema07.metricas_derivadas]] |
Línea 698: | Línea 701: | ||
- | |||
- | |||
- | ==== 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 '' | ||
- | |||
- | |||
- | 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 | ||
- | * 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 '' | ||
- | |||
- | 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, | ||
- | |||
- | {{ : | ||
- | |||
- | <note tip> | ||
- | 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 | ||
- | <sxh python> | ||
- | metrics=[tf.keras.metrics.AUC()] | ||
- | metrics=[" | ||
- | </ | ||
- | |||
- | y usarla como | ||
- | <sxh python> | ||
- | history.history[' | ||
- | history.history[' | ||
- | </ | ||
- | |||
- | |||
- | Mas información: | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | * {{ : | ||
- | * {{ : | ||
- | * {{ : | ||
- | * [[https:// | ||
- | * [[https:// | ||
Línea 794: | Línea 729: | ||
Para mostrar la matriz de confusión se usará la siguiente función que usa de '' | Para mostrar la matriz de confusión se usará la siguiente función que usa de '' | ||
<sxh python> | <sxh python> | ||
- | import numpy as np | + | def plot_matriz_confusion(axes, |
- | import matplotlib.pyplot as plt | + | |
- | import matplotlib.colors | + | |
- | + | ||
- | def plot_matriz_confusion(axes, | + | |
success_color=matplotlib.colors.to_rgb('# | success_color=matplotlib.colors.to_rgb('# | ||
failure_color=matplotlib.colors.to_rgb("# | failure_color=matplotlib.colors.to_rgb("# | ||
Línea 804: | Línea 735: | ||
- | if ((precision | + | if ((vpp is not None) | |
- | (negative_predictive_value | + | (vpn is not None) | |
- | (recall_sensitivity | + | (sensibilidad |
- | (specificity | + | (especificidad |
- | (accuracy | + | (prevalencia |
- | (f1_score is not None) | | + | (f1_score is not None) | |
(mcc is not None) | | (mcc is not None) | | ||
(auc is not None) ): | (auc is not None) ): | ||
Línea 831: | Línea 762: | ||
axes.set_yticklabels(labels, | axes.set_yticklabels(labels, | ||
axes.text(0, | axes.text(0, | ||
- | axes.text(0, | + | axes.text(0, |
axes.text(1, | axes.text(1, | ||
- | axes.text(1, | + | axes.text(1, |
axes.xaxis.tick_top() | axes.xaxis.tick_top() | ||
- | axes.set_xlabel(' | + | axes.set_xlabel(' |
- | axes.xaxis.set_label_position(' | + | axes.xaxis.set_label_position(' |
- | axes.set_ylabel(' | + | axes.set_ylabel(' |
Línea 843: | Línea 774: | ||
- | if (precision | + | if (vpp is not None): |
- | axes.text(0, | + | axes.text(0, |
- | if (negative_predictive_value | + | if (vpn is not None): |
- | axes.text(1, | + | axes.text(1, |
- | if (recall_sensitivity | + | if (sensibilidad |
- | axes.text(2, | + | axes.text(2, |
- | if (specificity | + | if (especificidad |
- | axes.text(2, | + | axes.text(2, |
metricas_generales="" | metricas_generales="" | ||
- | if (accuracy | + | if (prevalencia |
- | metricas_generales=metricas_generales+f" | + | metricas_generales=metricas_generales+f" |
if (f1_score is not None): | if (f1_score is not None): | ||
- | metricas_generales=metricas_generales+f" | + | metricas_generales=metricas_generales+f" |
if (mcc is not None): | if (mcc is not None): | ||
metricas_generales=metricas_generales+f" | metricas_generales=metricas_generales+f" | ||
if (auc is not None): | if (auc is not None): | ||
- | metricas_generales=metricas_generales+f" | + | metricas_generales=metricas_generales+f" |
- | + | ||
- | axes.text(2, | + | |
- | + | ||
+ | axes.text(2, | ||
</ | </ | ||
Línea 965: | Línea 893: | ||
* Sensibilidad | * Sensibilidad | ||
* Especificidad | * Especificidad | ||
- | * AUC | ||
{{: | {{: | ||
Línea 986: | Línea 913: | ||
==== Ejercicio 3.C ==== | ==== Ejercicio 3.C ==== | ||
- | Crea una función llamada '' | + | Crea una función llamada '' |
* Sensibilidad | * Sensibilidad | ||
* Especificidad | * Especificidad | ||
* VPP | * VPP | ||
* VPN | * VPN | ||
- | * AUC: Para calcular el valor de '' | + | * Prevalencia |
- | Usando los valores | + | Para calcular VPP y VPN se debe usar la prevalencia. Si no se pasa el valor de prevalencia ( Es decir 'prevalencia==None', |
+ | Usando los valores de '' | ||
+ | |||
+ | Muestra todo en la matriz de confusión. | ||
==== Ejercicio 3.D ==== | ==== Ejercicio 3.D ==== | ||
Línea 1003: | Línea 933: | ||
==== Ejercicio 3.E ==== | ==== Ejercicio 3.E ==== | ||
- | En un nuevo jupyter notebook, carga el modelo y con los datos de test , vuelve a mostrar la matriz de confusión | + | En un nuevo jupyter notebook, carga el modelo y con los datos de test , vuelve a mostrar la matriz de confusión |
- | Además muestra alguna de las nuevas métricas que hay en la siguiente tabla ,como por ejemplo el F1-score: | ||
- | |||
- | {{: | ||
==== Ejercicio 3.F ==== | ==== Ejercicio 3.F ==== | ||
- | Muestra ahora 2 gráficas, en las que se mostrarán los distintos valores de las métricas según el valor del umbral. | + | Muestra ahora 1 gráfica, en la que se mostrará: |
- | * En la primera gráfica mostrarás en valor de la sensibilidad y la especificidad | + | * El valor de la sensibilidad y la especificidad según el valor del umbral |
- | * En la segunda gráfica mostrarás en valor del VPP y el VPN según el valor del umbral | + | |
{{: | {{: | ||
Línea 1021: | Línea 947: | ||
==== Ejercicio 3.G ==== | ==== Ejercicio 3.G ==== | ||
- | Muestra | + | Muestra |
- | * $Informedness=Sensibilidad+Especificidad-1$ | + | |
- | * $Markedness=VPP+VPN-1$ | + | |
- | {{: | + | A la suma de los 2 valores para obtener el máximo pero restando 1 se le llama $Informedness$ |
- | ==== Ejercicio 3.H ==== | + | $$ |
- | Muestra ahora otra gráfica pero de forma que: | + | Informedness=Sensibilidad+Especificidad-1 |
- | * El eje X sea (1-Especificidad) | + | $$ |
- | * El eje Y sea la Sensibilidad | + | |
+ | Muestra un punto con el máximo de la gráfica y el threshold correspondiente al máximo.Además para ese nivel de threshold, **imprime la sensibilidad y la especificidad** | ||
- | Además pinta el área que hay por debajo, para ello usa la función: | + | {{:clase: |
- | '' | + | |
- | Ese área que se ha pintado es el valor de la métrica **" | ||
- | {{: | + | ==== Ejercicio |
- | + | ||
- | + | ||
- | ==== Ejercicio | + | |
Indica en los siguientes problemas si subirías o bajarías el umbral | Indica en los siguientes problemas si subirías o bajarías el umbral | ||
Línea 1052: | Línea 971: | ||
+ | |||
+ | ==== Ejercicio 5.A ==== | ||
+ | Crea una nueva red neuronal para el problema del //bread cancer// | ||
+ | |||
+ | Ahora razona con cual de las 2 redes te quedarías y que threshold elegirías para cada uno de ellos. | ||
+ | |||
+ | Para elegir debes mostrar gráficas , una al lado de la otra para comparar lo siguiente: | ||
+ | * Gráficos de perdida, sensibilida y especificidad durante el entrenamiento | ||
+ | * Matriz de confusión con las métricas: Sensibilidad, | ||
+ | * Threshold vs (Sensibilidad y Especificidad) | ||
+ | * Threshold vs Informedness (Muestra en el label el máximo) | ||
+ | |||
+ | |||
+ | ¿Con que red te quedarías? | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Además para el nivel de threshold de la red que ha " | ||
+ | |||
+ | ==== Ejercicio 5.B ==== | ||
+ | Con el modelo elegido, guarda el modelo a disco | ||
+ | |||
+ | |||
+ | ==== Ejercicio 5.C ==== | ||
+ | Con modelo que has elegido, cárgalo desde disco en otro Jupyter notebook y realiza inferencia de 10 pacientes. | ||
+ | |||
+ | Para cada paciente: | ||
+ | * Indica su prevalencia (te la tienes que inventar de forma aleatoria) | ||
+ | * Indica la probabilidad de que la red haya acertado. | ||