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 Próxima revisión Ambos lados, revisión siguiente | ||
clase:iabd:pia:2eval:tema07.metricas [2024/03/10 10:35] admin [Cálculo de las métricas] |
clase:iabd:pia:2eval:tema07.metricas [2024/03/20 01:01] admin [Ejercicios] |
||
---|---|---|---|
Línea 491: | Línea 491: | ||
Para calcular como de balanceadas están las clases se usa la $Prevalencia \; o \; P(Enfermo)$ , y es un dato muy importante que se calcula de la siguiente forma: | Para calcular como de balanceadas están las clases se usa la $Prevalencia \; o \; P(Enfermo)$ , y es un dato muy importante que se calcula de la siguiente forma: | ||
+ | |||
$$ | $$ | ||
- | Prevalencia=P(Enfermo)=\frac{E}{E+S}=\frac{TP+FN}{TP+FN+FP+TN} | + | Prevalencia=P(Enfermo)=\frac{TP+FN}{TP+FN+FP+TN}=\frac{E}{E+S} |
$$ | $$ | ||
- | y | + | Además están otras probabilidades que son: |
$$ | $$ | ||
- | P(Sano)=1-P(Enfermo)=\frac{S}{E+S}=\frac{FP+TN}{TP+FN+FP+TN} | + | |
+ | \begin{array} | ||
+ | \\ | ||
+ | P(Enfermo)&=& | ||
+ | \\ | ||
+ | P(Sano)&=& | ||
+ | \\ | ||
+ | P(Positivo)& | ||
+ | \\ | ||
+ | P(Negativo)& | ||
+ | \end{array} | ||
$$ | $$ | ||
- | y | + | Recordar que: |
+ | $$ | ||
+ | E+S=PP+PN=Total | ||
+ | $$ | ||
En la siguiente imagen vamos a obtener las métricas y vamos a ver como varían las métricas si aumenta o disminuye el número de positivos. Es decir vamos a ver como dependen la precisión y el VPN según la prevalencia. | En la siguiente imagen vamos a obtener las métricas y vamos a ver como varían las métricas si aumenta o disminuye el número de positivos. Es decir vamos a ver como dependen la precisión y el VPN según la prevalencia. | ||
Línea 780: | Línea 794: | ||
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 790: | Línea 800: | ||
- | 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 817: | Línea 827: | ||
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 829: | Línea 839: | ||
- | 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 951: | Línea 958: | ||
* Sensibilidad | * Sensibilidad | ||
* Especificidad | * Especificidad | ||
- | * AUC | ||
{{: | {{: | ||
Línea 972: | Línea 978: | ||
==== 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 989: | Línea 998: | ||
==== 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 1007: | Línea 1012: | ||
==== Ejercicio 3.G ==== | ==== Ejercicio 3.G ==== | ||
- | Muestra | + | Muestra |
- | | + | |
- | | + | A la suma de los 2 valores para obtener el máximo pero restando 1 se le llama $Informedness$ |
+ | |||
+ | $$ | ||
+ | Informedness=Sensibilidad+Especificidad-1 | ||
+ | $$ | ||
+ | |||
+ | 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** | ||
{{: | {{: | ||
- | ==== 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 1020: | Línea 1033: | ||
* Una IA que decide si te concede un préstamo | * Una IA que decide si te concede un préstamo | ||
* Una IA que decide una persona en un juicio es inocente | * Una IA que decide una persona en un juicio es inocente | ||
+ | * Una IA que corrige automáticamente un examen y te dice si has aprobado | ||
+ | |||
+ | |||
+ | |||
+ | ==== 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. | ||