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/10/11 17:41] admin [Probabilidad condicional] |
— (actual) | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== 7.e Métricas clasificación (Bayes) ====== | ||
- | En este apartado vamos a ver las métricas asociadas a problemas de clasificación. Como son muchas, seguiremos en [[tema07.metricas_derivadas]]. | ||
- | |||
- | |||
- | ===== 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** o **TP** o **Verdaderos Positivos**: | ||
- | * **True Negatives** o **TN** o **Verdaderos Negativos**: | ||
- | * **False Positives** o **FP** o **Falsos positivos**: | ||
- | * **False Negatives** o **FN** o **Falsos negativos**: | ||
- | |||
- | |||
- | Estos 4 valores se pueden representar en una matriz llamada matriz de confusión. | ||
- | |||
- | <note important> | ||
- | Para distinguir: | ||
- | * **predicho que es positivo** de **realmente es positivo** | ||
- | * **predicho que es negativo** de **realmente es negativo** | ||
- | |||
- | para ello vamos a seguir la siguiente nomenclatura basada en un ejemplo de red neuronal que detectara enfermedades: | ||
- | |||
- | * **Predicho que es positivo**=Positivo | ||
- | * **Predicho que es negativo**=Negativo | ||
- | * **Realmente es positivo**=Enfermo | ||
- | * **Realmente es negativo**=Sano | ||
- | |||
- | Por lo que podemos rehacer la lista inicial como: | ||
- | |||
- | * **TP**: Positivo y Enfermo | ||
- | * **TN**: Negativo y Sano | ||
- | * **FP**: Positivo y Sano | ||
- | * **FN**: Negativo y Enfermo | ||
- | |||
- | </ | ||
- | |||
- | |||
- | | ^^ Predicción | ||
- | | ^^ Positivo | ||
- | ^ Realidad | ||
- | ^ ::: ^ Sano | FP | TN | | ||
- | |||
- | |||
- | {{ : | ||
- | |||
- | |||
- | Más información: | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | * [[https:// | ||
- | * {{ : | ||
- | |||
- | |||
- | ===== Umbral o Threshold ===== | ||
- | En la clasificación binaria los posibles valores son '' | ||
- | A ese valor se le llama '' | ||
- | |||
- | Si el valor del '' | ||
- | |||
- | Veamos un ejemplo de ello: | ||
- | <sxh python> | ||
- | y_score=np.array([0.27, | ||
- | y_pred=y_score> | ||
- | print(y_pred) | ||
- | </ | ||
- | |||
- | Siendo el resultado | ||
- | <sxh python> | ||
- | [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 '' | ||
- | |||
- | Un ejemplo de lo que acabamos de ver está en las métricas de '' | ||
- | En [[https:// | ||
- | mientras que en [[https:// | ||
- | |||
- | |||
- | ===== Probabilidad condicional ===== | ||
- | La probabilidad condicional se expresa de la siguiente forma P(A|B) que significa , la probabilidad de que ocurra //A// sabiendo que ya ocurrido //B//. ¿Y que tiene que ver ésto con las métricas? Realmente las métricas se pueden expresar como probabilidades condicionales. Lo bueno de usar probabilidades condicionales es que se entienden mejor. | ||
- | |||
- | Para explicar las métricas vamos a imaginar los test de COVID que comprobamos en las farmacias , que nos decían si teníamos o no COVID. El ejemplo es igual que si fuera una red neuronal que dado una radiografía nos dijera si teníamos o no COVID. Pero se usa el test de farmacia de COVID para hacer más comprensible la explicación. | ||
- | |||
- | Para poner la probabilidad condicional vamos a con la nomenclatura anterior | ||
- | * Positivo: El test ha dado un valor positivo. Umbral >= 0.5 | ||
- | * Negativo: El test ha dado un valor negativo. Umbral < 0.5 | ||
- | * Enfermo: El paciente está enfermo ya que se ha usado el {{https:// | ||
- | * Sano: El paciente está sano ya que se ha usado el {{https:// | ||
- | |||
- | Veamos ahora unas probabilidades condicionales. | ||
- | |||
- | * P(Positivo|Enfermo): | ||
- | * P(Enfermo|Positivo): | ||
- | |||
- | Detengámonos un momento. ¿Cual de las 2 probabilidades nos interesa?. P(Positivo|Enferma) o P(Enferma|Positivo). Si lo pensamos , ¿para que queremos saber P(Positivo|Enferma)? | ||
- | |||
- | ===== Cálculo de las métricas ===== | ||
- | Pongamos ahora todas las combinaciones de probabilidades posibles de las métricas que realmente nos interesan. | ||
- | |||
- | * P(Enfermo|Positivo): | ||
- | * P(Sano|Positivo): | ||
- | \\ | ||
- | * P(Sano|Negativo): | ||
- | * P(Enfermo|Negativo): | ||
- | |||
- | |||
- | Mientras que las 4 siguientes aparentemente no nos interesan lo más mínimo: | ||
- | |||
- | * P(Positivo|Enfermo): | ||
- | * P(Negativo|Enfermo): | ||
- | \\ | ||
- | * P(Negativo|Sano): | ||
- | * P(Positivo|Sano): | ||
- | |||
- | |||
- | Volvamos a la matriz de confusión: | ||
- | | ^^ Predicción | ||
- | | ^^ Positivo (PP) ^ Negativo (PN) ^ | ||
- | ^ Realidad | ||
- | ^ ::: ^ Sano (N) | FP | TN | | ||
- | |||
- | $$ | ||
- | \begin{array} | ||
- | \\ | ||
- | E& | ||
- | \\ | ||
- | S& | ||
- | \\ | ||
- | PP& | ||
- | \\ | ||
- | PN& | ||
- | \\ | ||
- | \end{array} | ||
- | $$ | ||
- | |||
- | |||
- | Y siendo un poco perspicaces podremos ver como se calculan las 8 probabilidades y los nombres que tienen: | ||
- | |||
- | |||
- | $$ | ||
- | \begin{array} | ||
- | \\ | ||
- | P(Enfermo|Positivo)& | ||
- | \\ | ||
- | P(Sano|Positivo)& | ||
- | \\ | ||
- | \\ | ||
- | P(Sano|Negativo)& | ||
- | \\ | ||
- | P(Enfermo|Negativo)& | ||
- | \\ | ||
- | \end{array} | ||
- | $$ | ||
- | \\ | ||
- | \\ | ||
- | $$ | ||
- | \begin{array} | ||
- | \\ | ||
- | P(Positivo|Enfermo)& | ||
- | \\ | ||
- | P(Negativo|Enfermo)& | ||
- | \\ | ||
- | \\ | ||
- | P(Negativo|Sano)& | ||
- | \\ | ||
- | P(Positivo|Sano)& | ||
- | \\ | ||
- | \end{array} | ||
- | $$ | ||
- | \\ | ||
- | \\ | ||
- | | ^^ Predicción | ||
- | | ^^ Positivo (PP) ^ Negativo (PN) ^ | ||
- | ^ Realidad | ||
- | ^ ::: ^ Sano (S) | FP | TN | P(Positivo|Sano)=FPS | ||
- | ^ ^ Métricas | ||
- | ^ ::: ^ ::: | P(Sano|Positivo)=FPPP | ||
- | |||
- | | ^^ Predicción | ||
- | | ^^ Positivo (PP) ^ Negativo (PN) ^ | ||
- | ^ Realidad | ||
- | ^ ::: ^ Sano (S) | FP | TN | FPR=FPS | ||
- | ^ ^ Métricas | ||
- | ^ ::: ^ ::: | FDR=FPPP | ||
- | |||
- | | ^^ Predicción | ||
- | | ^^ Positivo (PP) ^ Negativo (PN) ^ | ||
- | ^ Realidad | ||
- | ^ ::: ^ Sano (S) | FP | TN | FPR=FPS | ||
- | ^ ^ Métricas | ||
- | ^ ::: ^ ::: | FDR=FPPP | ||
- | |||
- | |||
- | ===== Selección de métricas ===== | ||
- | Volvamos ahora a recapacitar otra vez sobre el significado de las métricas. En un test perfecto realmente lo que nos interesa es: | ||
- | * P(Enfermo|Positivo)=1: | ||
- | * P(Sano|Negativo)=1: | ||
- | |||
- | A esas 2 métricas se les llama: | ||
- | * P(Enfermo|Positivo)=ValorPredictivoPositivo(VPP)=PositivePredictiveValue(PPV)=Precisión | ||
- | * P(Sano|Negativo)=ValorPredictivoNegativo(VPN)=NegativePredictiveValue(NPV) | ||
- | |||
- | Se llaman así porque realmente son las 2 métricas que predicen si estás enfermo o sano cuando el test da positivo o negativo respectivamente. Y a la primera de ellas se le llama también **precisión** | ||
- | |||
- | |||
- | ===== Teorema de Bayes ===== | ||
- | El problema de calcular la precisión y el VPN es que sus valores dependen de la cantidad de enfermos y de sanos que tengamos al entrenar nuestra red. Por lo tanto del valor de E y S. Es decir que dependen de lo balanceados que tengamos nuestras clases. | ||
- | |||
- | Para calcular como de balanceadas están las clases se usa la PrevalenciaoP(Enfermo) , y es un dato muy importante que se calcula de la siguiente forma: | ||
- | |||
- | |||
- | $$ | ||
- | Prevalencia=P(Enfermo)=\frac{TP+FN}{TP+FN+FP+TN}=\frac{E}{E+S} | ||
- | $$ | ||
- | |||
- | Además están otras probabilidades que son: | ||
- | |||
- | $$ | ||
- | |||
- | \begin{array} | ||
- | \\ | ||
- | P(Enfermo)& | ||
- | \\ | ||
- | P(Sano)& | ||
- | \\ | ||
- | P(Positivo)& | ||
- | \\ | ||
- | P(Negativo)& | ||
- | \end{array} | ||
- | $$ | ||
- | |||
- | 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. | ||
- | |||
- | {{ : | ||
- | |||
- | Vemos que si aumentamos el número de positivos (por lo tanto aumentando la prevalencia), | ||
- | * Si aumentamos la prevalencia: | ||
- | * Mejora la precisión (VPP) ya que ha pasado de 0.89 a 0.96 | ||
- | * Empeora el VPN ya que ha pasado de 0.93 a 0.82 | ||
- | * Si disminuimos la prevalencia: | ||
- | * Empeora la precisión (VPP) ya que ha pasado de 0.89 a 0.74 | ||
- | * 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. | ||
- | |||
- | |||
- | Por lo tanto se podría hacer trampa y sin modificar el modelo pero variando la prevalencia de los datos de validación, | ||
- | |||
- | ¿Cual es entonces la solución? Pues usar métricas que no dependan de la prevalencia. Y esas métricas son la sensibilidad y la especificidad que habíamos descartado. ¿Y para que las queremos? Pues esas 2 métricas nos dicen lo bueno que es nuestro modelo cuando lo estamos desarrollando ya que nos decían cuanto acertaban o fallaban cuando sabíamos lo que debía dar y son métricas independientes de la prevalencia de nuestros datos. Podemos ver que esas métricas no han variado aunque se haya modificado la prevalencia. | ||
- | |||
- | Vale, pero nosotros lo que queremos es saber la precisión y la VPN. Pues resulta que el teorema de bayes es una fórmula matemática que nos calcula la precisión y la VPN en base a la sensibilidad y la especificidad y además según la prevalencia. 😍😍😍😍😍😍 | ||
- | |||
- | |||
- | $$ | ||
- | P(Enfermo|Positivo)=\frac{P(Positivo|Enfermo)*P(Enfermo)}{P(Positivo|Enfermo)*P(Enfermo)+P(Positivo|Sano)*P(Sano)} | ||
- | |||
- | |||
- | $$ | ||
- | P(Sano|Negativo)=\frac{P(Negativo|Sano)*P(Sano)}{P(Negativo|Sano)*P(Sano)+P(Negativo|Enfermo)*P(Enfermo)} | ||
- | $$ | ||
- | |||
- | y usando los nombres // | ||
- | |||
- | |||
- | $$ | ||
- | Precisión=VPP=\frac{Sensibilidad*Prevalencia}{Sensibilidad*Prevalencia+(1-Especificidad)*(1-Prevalencia)} | ||
- | |||
- | |||
- | $$ | ||
- | VPN=\frac{Especificidad*(1-Prevalencia)}{Especificidad*(1-Prevalencia)+(1-sensibilidad)*Prevalencia} | ||
- | $$ | ||
- | |||
- | |||
- | **Todo ellos nos lleva a que al desarrollar nuestra red neuronal solo nos interesan que los valores de Sensibilidad y de Especificidad sean lo más altos posibles. Y cuando vayamos a predecir, nos tendrán que indicar el valor de la prevalencia y en ese caso podremos calcular si ha salid positivo el valor de Precisión(VPP) y si ha salido negativo calcularemos el valor de VPN.** | ||
- | |||
- | Por ello en los prospectos de los test de covid, los valores que siempre se calculaban son el de Sensibilidad y de Especificidad: | ||
- | |||
- | <note important> | ||
- | ¿Y como sabemos el valor de la prevalencia? | ||
- | |||
- | En los siguientes 2 artículos vemos investigaciones para calcular la prevalencia del COVID según distintas circunstancias: | ||
- | * {{ : | ||
- | * {{ : | ||
- | |||
- | |||
- | </ | ||
- | |||
- | ===== Mejores valores de las métricas ===== | ||
- | Ahora ya sabemos que **VPP** y **VPN** son las métricas que nos interesan realmente y que sus valores deben ser lo más cercanas a 1. Pero también sabemos que esas métricas dependen de la **Prevalencia** (que no depende de lo bueno que sea nuestro modelo ) y de las métricas de **Sensibilidad** y **Especificidad** (Que si que dependen de lo bueno que sea nuestro modelo). Así que para obtener los mejores valores del VPP y VPN tenemos que conseguir en nuestro modelo consigamos los mejores valores de **Sensibilidad** y **Especificidad**. | ||
- | |||
- | |||
- | Como ya hemos visto hay las siguientes relaciones entre métricas: | ||
- | |||
- | $$ | ||
- | FNR=1-Sensibilidad | ||
- | $$ | ||
- | \\ | ||
- | $$ | ||
- | FPR=1-Especificidad | ||
- | $$ | ||
- | |||
- | Además de | ||
- | |||
- | $$ | ||
- | FDR=1-VPP | ||
- | $$ | ||
- | \\ | ||
- | $$ | ||
- | FOR=1-VPN | ||
- | $$ | ||
- | |||
- | Como esas métricas no son independientes de las anteriores, volvamos ahora a poner la tabla de confusión únicamente con las métricas que nos interesan y además los valores ideales que nos interesarían. | ||
- | |||
- | |||
- | | ^^ Predicción | ||
- | | ^^ Positivo (PP) ^ Negativo (PN) ^ | ||
- | ^ Realidad | ||
- | ^ ::: ^ Sano (S) | FP | TN | | Especificidad=1 | ||
- | ^ ^ Métricas | ||
- | ^ ::: ^ ::: | | VPN=1 | ||
- | |||
- | Y por lo tanto el resto de las métricas nos interesarían que fueran 0 pero al depender de la que hemos mostrado , ni las mediremos. | ||
- | |||
- | |||
- | ==== Resumen ==== | ||
- | {{ : | ||
- | |||
- | |||
- | Más información en: | ||
- | * [[https:// | ||
- | * [[tema07.metricas_derivadas]] | ||
- | |||
- | |||
- | |||
- | ===== Metricas en Keras ===== | ||
- | Veamos como calcular en Keras las métricas que necesitamos | ||
- | |||
- | ==== Sensibilidad ==== | ||
- | La sensibilidad en inglés es // | ||
- | |||
- | Su uso en Keras es | ||
- | <sxh python> | ||
- | metrics=[tf.keras.metrics.Recall()] | ||
- | metrics=[" | ||
- | </ | ||
- | |||
- | y usarla como | ||
- | <sxh python> | ||
- | history.history[' | ||
- | history.history[' | ||
- | </ | ||
- | |||
- | Ejemplo: | ||
- | <sxh python> | ||
- | y_true = np.array([1, | ||
- | y_pred = np.array([0.9, | ||
- | metric = tf.keras.metrics.Recall() | ||
- | metric(y_true, | ||
- | </ | ||
- | |||
- | <sxh python> | ||
- | 0.6 | ||
- | </ | ||
- | |||
- | Más información: | ||
- | * [[https:// | ||
- | |||
- | ==== Especificidad ==== | ||
- | Inexplicablemente esta métrica no existe en keras. Pero la podemos definir con el siguiente código: | ||
- | |||
- | <sxh python> | ||
- | def specificity(y_true, | ||
- | threshold=0.5 | ||
- | y_pred = tf.cast(tf.greater(y_score, | ||
- | |||
- | |||
- | true_negatives = tf.logical_and(tf.equal(y_true, | ||
- | num_true_negatives=tf.reduce_sum(tf.cast(true_negatives, | ||
- | |||
- | |||
- | negatives =tf.equal(y_true, | ||
- | num_negatives= tf.reduce_sum(tf.cast(negatives, | ||
- | |||
- | |||
- | specificity = num_true_negatives / (num_negatives + tf.keras.backend.epsilon()) | ||
- | | ||
- | return specificity | ||
- | </ | ||
- | |||
- | Su uso en Keras es | ||
- | <sxh python> | ||
- | metrics=[specificity] | ||
- | </ | ||
- | |||
- | y usarla como | ||
- | <sxh python> | ||
- | history.history[' | ||
- | history.history[' | ||
- | </ | ||
- | |||
- | Ejemplo: | ||
- | <sxh python> | ||
- | y_true = np.array([0, | ||
- | y_pred = np.array([0.9, | ||
- | specificity(y_true, | ||
- | </ | ||
- | |||
- | <sxh python> | ||
- | 0.4 | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ===== 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: | ||
- | <sxh python> | ||
- | metrics=[tf.keras.metrics.CategoricalAccuracy()] | ||
- | metrics=[" | ||
- | </ | ||
- | |||
- | y usarla como | ||
- | <sxh python> | ||
- | history.history[' | ||
- | history.history[' | ||
- | </ | ||
- | |||
- | Mas información: | ||
- | * [[https:// | ||
- | |||
- | ===== Ejercicios ===== | ||
- | |||
- | < | ||
- | Para mostrar la matriz de confusión se usará la siguiente función que usa de '' | ||
- | <sxh python> | ||
- | def plot_matriz_confusion(axes, | ||
- | success_color=matplotlib.colors.to_rgb('# | ||
- | failure_color=matplotlib.colors.to_rgb("# | ||
- | blanco_color=matplotlib.colors.to_rgb("# | ||
- | |||
- | |||
- | if ((vpp is not None) | | ||
- | (vpn is not None) | | ||
- | (sensibilidad is not None) | | ||
- | (especificidad is not None) | | ||
- | (prevalencia is not None) | | ||
- | (f1_score is not None) | | ||
- | (mcc is not None) | | ||
- | (auc is not None) ): | ||
- | show_metrics=True | ||
- | else: | ||
- | show_metrics=False | ||
- | |||
- | |||
- | if show_metrics==False: | ||
- | axes.imshow([[success_color, | ||
- | else: | ||
- | axes.imshow([[success_color, | ||
- | |||
- | |||
- | |||
- | labels = [' | ||
- | xaxis = np.arange(len(labels)) | ||
- | axes.set_xticks(xaxis) | ||
- | axes.set_yticks(xaxis) | ||
- | axes.set_xticklabels(labels, | ||
- | axes.set_yticklabels(labels, | ||
- | axes.text(0, | ||
- | axes.text(0, | ||
- | axes.text(1, | ||
- | axes.text(1, | ||
- | axes.xaxis.tick_top() | ||
- | axes.set_xlabel(' | ||
- | axes.xaxis.set_label_position(' | ||
- | axes.set_ylabel(' | ||
- | |||
- | |||
- | if show_metrics==True: | ||
- | |||
- | |||
- | if (vpp is not None): | ||
- | axes.text(0, | ||
- | if (vpn is not None): | ||
- | axes.text(1, | ||
- | if (sensibilidad is not None): | ||
- | axes.text(2, | ||
- | if (especificidad is not None): | ||
- | axes.text(2, | ||
- | |||
- | metricas_generales="" | ||
- | if (prevalencia is not None): | ||
- | metricas_generales=metricas_generales+f" | ||
- | if (f1_score is not None): | ||
- | metricas_generales=metricas_generales+f" | ||
- | if (mcc is not None): | ||
- | metricas_generales=metricas_generales+f" | ||
- | if (auc is not None): | ||
- | metricas_generales=metricas_generales+f" | ||
- | |||
- | axes.text(2, | ||
- | </ | ||
- | |||
- | </ | ||
- | |||
- | ==== 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: | ||
- | |||
- | <sxh python> | ||
- | y_score=np.array([0.27, | ||
- | </ | ||
- | |||
- | 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: | ||
- | |||
- | <sxh python> | ||
- | y_score=np.array([0.27, | ||
- | </ | ||
- | |||
- | |||
- | Pero los valores verdaderos son los siguientes: | ||
- | <sxh python> | ||
- | y_true=np.array([1, | ||
- | </ | ||
- | |||
- | |||
- | 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: | ||
- | |||
- | <sxh python> | ||
- | y_true=np.array([1, | ||
- | y_score=np.array([0.27, | ||
- | |||
- | </ | ||
- | |||
- | Calcula directamente las siguientes métricas: | ||
- | * Prevalencia | ||
- | * Sensibilidad | ||
- | * Especificidad | ||
- | * VPP | ||
- | * VPN | ||
- | |||
- | |||
- | ==== Ejercicio 2.D ==== | ||
- | Calcula ahora los valores de: | ||
- | * VPP | ||
- | * VPN | ||
- | |||
- | pero usando el teorema de bayes en base a los valores de: | ||
- | * Prevalencia | ||
- | * Sensibilidad | ||
- | * Especificidad | ||
- | |||
- | ==== Ejercicio 2.E ==== | ||
- | Muestra ahora una gráfica con matplolib en la que se vea como evolucionan los valores de VPP y VPN según la prevalencia. | ||
- | |||
- | Esa misma gráfica se puede mostrar en [[https:// | ||
- | |||
- | {{: | ||
- | |||
- | ==== Ejercicio 3.A ==== | ||
- | Crea una red neuronal con los datos de //bread cancer// con las siguientes características: | ||
- | |||
- | * neuronas por capa:'' | ||
- | * Función de activation: '' | ||
- | * Nº de epocas: '' | ||
- | * Optimizador: | ||
- | |||
- | Muestra las siguientes métricas durante el entrenamiento (para cada una de las épocas): | ||
- | * Loss | ||
- | * Sensibilidad | ||
- | * Especificidad | ||
- | |||
- | {{: | ||
- | |||
- | ==== Ejercicio 3.B ==== | ||
- | En este ejercicio vamos a mostrar la matriz de confusión de la red que acabamos de crear. | ||
- | |||
- | Para ello vamos a usar los valores de test que los tenemos en las siguientes variables del ejercicio anterior: | ||
- | * '' | ||
- | * '' | ||
- | |||
- | La variable '' | ||
- | |||
- | Para ello sigue los siguientes pasos: | ||
- | * Crea una función llamada '' | ||
- | * Calcula '' | ||
- | * Haz que '' | ||
- | * Llama a la función '' | ||
- | * Muestra la matriz de confusión | ||
- | |||
- | ==== Ejercicio 3.C ==== | ||
- | Crea una función llamada '' | ||
- | * Sensibilidad | ||
- | * Especificidad | ||
- | * VPP | ||
- | * VPN | ||
- | * Prevalencia | ||
- | |||
- | Para calcular VPP y VPN se debe usar la prevalencia. Si no se pasa el valor de prevalencia ( Es decir ' | ||
- | |||
- | |||
- | Usando los valores de '' | ||
- | |||
- | Muestra todo en la matriz de confusión. | ||
- | |||
- | ==== Ejercicio 3.D ==== | ||
- | Guarda el modelo a disco | ||
- | |||
- | |||
- | |||
- | ==== 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 con todas las métricas. | ||
- | |||
- | |||
- | |||
- | ==== Ejercicio 3.F ==== | ||
- | Muestra ahora 1 gráfica, en la que se mostrará: | ||
- | |||
- | * El valor de la sensibilidad y la especificidad según el valor del umbral | ||
- | |||
- | {{: | ||
- | |||
- | ¿Que valor de umbral dejarías? | ||
- | |||
- | ==== Ejercicio 3.G ==== | ||
- | Muestra una gráfica similar a las anteriores pero ahora sea la suma los valores de sensibilidad y la especificidad menos 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** | ||
- | |||
- | {{: | ||
- | |||
- | |||
- | |||
- | ==== Ejercicio 4 ==== | ||
- | Indica en los siguientes problemas si subirías o bajarías el umbral | ||
- | |||
- | * Una IA que detecta si hay petroleo en el subsuelo | ||
- | * Una IA que predice si un usuario en Amazon está cometiendo fraude | ||
- | * Una IA que decide si te concede un préstamo | ||
- | * 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. | ||
- | |||