Herramientas de usuario

Herramientas del sitio


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

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
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)&=&\frac{TP+FN}{TP+FN+FP+TN}&=&\frac{E}{E+S}&=&Prevalencia 
 +\\ 
 +P(Sano)&=&\frac{FP+TN}{TP+FN+FP+TN}&=&\frac{S}{E+S}&=&1-Prevalencia 
 +\\ 
 +P(Positivo)&=&\frac{TP+FP}{TP+FN+FP+TN}&=&\frac{PP}{PP+PN} 
 +\\ 
 +P(Negativo)&=&\frac{FN+TN}{TP+FN+FP+TN}&=&\frac{PN}{PP+PN}&=&1-P(Positivo) 
 +\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 ''matplotlib'' Para mostrar la matriz de confusión se usará la siguiente función que usa de ''matplotlib''
 <sxh python> <sxh python>
-import numpy as np +def plot_matriz_confusion(axes,TP=0,TN=0,FP=0,FN=0,fontsize=15,vpp=None,vpn=None,sensibilidad=None,especificidad=None,f1_score=None,mcc=None,auc=None,prevalencia=None):
-import matplotlib.pyplot as plt +
-import matplotlib.colors +
- +
-def plot_matriz_confusion(axes,TP=0,TN=0,FP=0,FN=0,fontsize=15,precision=None,negative_predictive_value=None,recall_sensitivity=None,specificity=None,accuracy=None,f1_score=None,mcc=None,auc=None):+
     success_color=matplotlib.colors.to_rgb('#9EE548')     success_color=matplotlib.colors.to_rgb('#9EE548')
     failure_color=matplotlib.colors.to_rgb("#C32240")     failure_color=matplotlib.colors.to_rgb("#C32240")
Línea 790: Línea 800:
  
  
-    if ((precision is not None) |  +    if ((vpp is not None) | 
-        (negative_predictive_value is not None) |  +        (vpn is not None) | 
-        (recall_sensitivity is not None) | +        (sensibilidad is not None) | 
-        (specificity is not None) |  +        (especificidad is not None) | 
-        (accuracy is not None) | +        (prevalencia is not None) | 
-        (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, fontsize=13, color="#003B80")     axes.set_yticklabels(labels, fontsize=13, color="#003B80")
     axes.text(0, 0, str(TP)+" TP",ha="center", va="center", color="#0A2102",fontsize=fontsize)     axes.text(0, 0, str(TP)+" TP",ha="center", va="center", color="#0A2102",fontsize=fontsize)
-    axes.text(0, 1, str(FP)+" FP",ha="center", va="center", color="#FAEAEA",fontsize=fontsize) +    axes.text(0, 1, str(FP)+" FP",ha="center", va="center", color="#FAEAEA",fontsize=fontsize)
     axes.text(1, 0, str(FN)+" FN",ha="center", va="center", color="#FAEAEA",fontsize=fontsize)     axes.text(1, 0, str(FN)+" FN",ha="center", va="center", color="#FAEAEA",fontsize=fontsize)
-    axes.text(1, 1, str(TN)+" TN",ha="center", va="center", color="#0A2102",fontsize=fontsize)         +    axes.text(1, 1, str(TN)+" TN",ha="center", va="center", color="#0A2102",fontsize=fontsize)        
     axes.xaxis.tick_top()     axes.xaxis.tick_top()
-    axes.set_xlabel('Predicción', fontsize=fontsize, color="#003B80")  +    axes.set_xlabel('Predicción', fontsize=fontsize, color="#003B80"
-    axes.xaxis.set_label_position('top')  +    axes.xaxis.set_label_position('top'
-    axes.set_ylabel('Realidad', fontsize=fontsize, color="#003B80"+    axes.set_ylabel('Realidad', fontsize=fontsize, color="#003B80")
  
  
Línea 829: Línea 839:
  
  
-        if (precision is not None): +        if (vpp is not None): 
-            axes.text(0, 2, f"Precision\n{precision:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4) +            axes.text(0, 2, f"Precision\n{vpp:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4) 
-        if (negative_predictive_value is not None): +        if (vpn is not None): 
-            axes.text(1, 2, f"VPN\n{negative_predictive_value:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4) +            axes.text(1, 2, f"VPN\n{vpn:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4) 
-        if (recall_sensitivity is not None): +        if (sensibilidad is not None): 
-            axes.text(2, 0, f"Sensibilidad\n{recall_sensitivity:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4)  +            axes.text(2, 0, f"Sensibilidad\n{sensibilidad:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4) 
-        if (specificity is not None): +        if (especificidad is not None): 
-            axes.text(2, 1, f"Especificidad\n{specificity:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4) +            axes.text(2, 1, f"Especificidad\n{especificidad:.2f}",ha="center", va="center", color="#0A2102",fontsize=fontsize-4)
  
         metricas_generales=""         metricas_generales=""
-        if (accuracy is not None): +        if (prevalencia is not None): 
-            metricas_generales=metricas_generales+f"Exactitud\n{accuracy:.2f}\n"+            metricas_generales=metricas_generales+f"Prevalencia\n{prevalencia:.2f}\n"        
         if (f1_score is not None):         if (f1_score is not None):
-            metricas_generales=metricas_generales+f"F1-score\n{f1_score:.2f}\n"   +            metricas_generales=metricas_generales+f"F1-score\n{f1_score:.2f}\n"  
         if (mcc is not None):         if (mcc is not None):
             metricas_generales=metricas_generales+f"MCC\n{mcc:.2f}\n"               metricas_generales=metricas_generales+f"MCC\n{mcc:.2f}\n"  
         if (auc is not None):         if (auc is not None):
-            metricas_generales=metricas_generales+f"AUC\n{auc:.2f}"              +            metricas_generales=metricas_generales+f"AUC\n{auc:.2f}"            
- +
-        axes.text(2, 2, metricas_generales,ha="center", va="center", color="#0A2102",fontsize=fontsize-4)           +
- +
  
 +        axes.text(2, 2, metricas_generales,ha="center", va="center", color="#0A2102",fontsize=fontsize-4)  
 </sxh> </sxh>
  
Línea 951: Línea 958:
   * Sensibilidad   * Sensibilidad
   * Especificidad   * Especificidad
-  * AUC 
  
 {{:clase:iabd:pia:2eval:metricas-epocas.png?direct|}} {{:clase:iabd:pia:2eval:metricas-epocas.png?direct|}}
Línea 972: Línea 978:
  
 ==== Ejercicio 3.C ==== ==== Ejercicio 3.C ====
-Crea una función llamada ''get_metrics(TP,TN,FP,FN)'' que retorne las siguientes métricas:+Crea una función llamada ''get_metrics(TP,TN,FP,FN,Prevalencia=None)'' que retorne las siguientes métricas:
   * Sensibilidad   * Sensibilidad
   * Especificidad   * Especificidad
   * VPP   * VPP
   * VPN   * VPN
-  * AUC: Para calcular el valor de ''AUC'' deberás usar la función ''sklearn.metrics.roc_auc_score(y_true,y_score)''+  * Prevalencia
  
-Usando los valores de ''TP'' ,''TN'', ''FP'' ''FN'' del ejercicio anterior, muestra las métricas que retorna ''get_metrics''+Para calcular VPP y VPN se debe usar la prevalencia. Si no se pasa el valor de prevalencia ( Es decir 'prevalencia==None', se usará el de los datos sino se usará la prevalencia que se pase como argumento.
  
  
 +Usando los valores de ''TP'' ,''TN'', ''FP'' y ''FN'' del ejercicio anterior, muestra las métricas que retorna ''get_metrics''
 +
 +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 todas las métricas.+En un nuevo jupyter notebook, carga el modelo y con los datos de test , vuelve a mostrar la matriz de confusión con todas las métricas.
  
-Además muestra alguna de las nuevas métricas que hay en la siguiente tabla ,como por ejemplo el F1-score: 
- 
-{{:clase:iabd:pia:2eval:metricas.png?direct|}} 
  
  
 ==== 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 según el valor del umbral +  * 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+
  
 {{:clase:iabd:pia:2eval:threshold-metricas.png?direct|}} {{:clase:iabd:pia:2eval:threshold-metricas.png?direct|}}
Línea 1007: Línea 1012:
  
 ==== Ejercicio 3.G ==== ==== Ejercicio 3.G ====
-Muestra dos gráficas similares a las anteriores pero con las métricas: +Muestra una gráfica similar a las anteriores pero ahora sea la suma los valores de sensibilidad y la especificidad menos 1.  
-  $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$ 
 + 
 +$$ 
 +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**
  
 {{:clase:iabd:pia:2eval:threshold-markedness-informedness.png?direct|}} {{:clase:iabd:pia:2eval:threshold-markedness-informedness.png?direct|}}
  
-==== Ejercicio 3.H ====+ 
 + 
 +==== 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, Especificidad, VPP, VPN, Prevalencia
 +  * Threshold vs (Sensibilidad y Especificidad)
 +  * Threshold vs Informedness (Muestra en el label el máximo)
 +
 +
 +¿Con que red te quedarías?
 +
 +{{:clase:iabd:pia:2eval:comparar_redes.png?direct|}}
 +
 +Además para el nivel de threshold de la red que ha "ganado", **imprime la sensibilidad y la especificidad**
 +
 +==== 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.
  
  
clase/iabd/pia/2eval/tema07.metricas.txt · Última modificación: 2024/03/25 19:13 por admin