Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema08.intervalo_confianza

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
clase:iabd:pia:2eval:tema08.intervalo_confianza [2024/05/18 17:32]
admin [Comparación de métricas]
clase:iabd:pia:2eval:tema08.intervalo_confianza [2025/03/03 11:45] (actual)
admin [Ejercicios]
Línea 1: Línea 1:
-====== 8. Optimización de redes neuronales b) Evaluación de Modelos ======+====== 8.e Intervalos de confianza ======
 Cuando calculamos una métrica realmente no tenemos el valor real de la métrica sino un valor (llamado estimador) que nos ayuda para saber el verdadero valor de la métrica. Cuando calculamos una métrica realmente no tenemos el valor real de la métrica sino un valor (llamado estimador) que nos ayuda para saber el verdadero valor de la métrica.
  
Línea 74: Línea 74:
  
 <sxh python> <sxh python>
-import statsmodels.stats.proportion as smp+from statsmodels.stats.proportion import proportion_confint
  
 # Número de éxitos # Número de éxitos
Línea 85: Línea 85:
 methods=['normal','beta','wilson','jeffreys','agresti_coull'] methods=['normal','beta','wilson','jeffreys','agresti_coull']
 for method in methods: for method in methods:
-    lower, upper = smp.proportion_confint(success, total, alpha=1-(confianza/100), method=method)+    lower, upper = proportion_confint(success, total, alpha=1-(confianza/100), method=method)
  
     print(f"Intervalo de confianza al {confianza}% con el método \"{method}\"= [{lower:.4f}, {upper:.4f}]")     print(f"Intervalo de confianza al {confianza}% con el método \"{method}\"= [{lower:.4f}, {upper:.4f}]")
Línea 106: Línea 106:
 ¿Porque Jeffreys? Porque es el que usa estadística bayesiana para calcular el intervalo de confianza. Así que realmente no es un intervalo de confianza sino un intervalo de credibilidad. ¿cual es la diferencia? Vamos a explicarlo con el ejemplo que estamos usando:  ¿Porque Jeffreys? Porque es el que usa estadística bayesiana para calcular el intervalo de confianza. Así que realmente no es un intervalo de confianza sino un intervalo de credibilidad. ¿cual es la diferencia? Vamos a explicarlo con el ejemplo que estamos usando: 
   * **Intervalo de confianza**  de ''Clopper-Pearson'' de ''[0.9133, 0.9904]'' significa que hay un 95% de probabilidad de que ese intervalo contenga al valor real que estamos buscando.   * **Intervalo de confianza**  de ''Clopper-Pearson'' de ''[0.9133, 0.9904]'' significa que hay un 95% de probabilidad de que ese intervalo contenga al valor real que estamos buscando.
-  * **Intervalo de credibilidad**  de ''Jeffreys'' de ''[0.9194, 0.9881]'' significa que hay un 95% de probabilidad de que el valor real que estamos buscando esté en ese intervalo.+  * **Intervalo de credibilidad**  de ''Jeffreys'' de ''[0.9194, 0.9881]'' significa que hay un 95% de probabilidad de que el valor real que estamos buscando esté en ese intervalo. Es decir, que el valor real es una variable aleatorio y cada valor posible tiene una probabilidad. Y el intervalo de credibilidad es el conjunto de valores reales cuya probabilidad es el 95%
  
 En el siguiente código se puede ver como da el mismo resultado usando ''proportion_confint(method="jeffreys")'' que calculándolo mediante el teorema de bayes y usando como prior una $Beta(0.5,0.5)$. Y por lo tanto ''Jeffreys'' es un **Intervalo de credibilidad** ya que es lo que se calcula en la estadística bayesiana. En el siguiente código se puede ver como da el mismo resultado usando ''proportion_confint(method="jeffreys")'' que calculándolo mediante el teorema de bayes y usando como prior una $Beta(0.5,0.5)$. Y por lo tanto ''Jeffreys'' es un **Intervalo de credibilidad** ya que es lo que se calcula en la estadística bayesiana.
Línea 134: Línea 134:
 </sxh> </sxh>
  
 +¿Y cuando se podrían usar otros? El resto no son bayesianos así que dan "peor" información pero en lineas generales, podemos decir que:
 +  * Clopper-Pearson o Jeffreys: Tamaño de muestra pequeño
 +  * Wilson o Agresti-Coull: Tamaño de muestra grande y proporción no extrema
 +  * Normal (Wald): No es recomendable
  
  
Línea 242: Línea 246:
 {{:clase:iabd:pia:2eval:comparacion_intervalos_confianza_lineas.png?direct|}} {{:clase:iabd:pia:2eval:comparacion_intervalos_confianza_lineas.png?direct|}}
  
 +===== Comparación avanzada de métricas =====
 +En caso de que los intervalos se solapen, no significa exactamente que tengan la misma métrica. Para saber si realmente la tienen es necesario restar las distribuciones y ver si el cero (o algo cercano al cero) está en dicha resta.
 +
 +Para hacer los cálculos vamos a crear una serie de funciones en python.
 +
 +<sxh python>
 +def get_hdi(sample, hdi_prob):
 +    """
 +            Calculation of 100(1-a)% HDI for sample
 +            Chen-Shao HPD Estimation algorithm
 +            http://y-okamoto-psy1949.la.coocan.jp/Python/en/calc_map_est/
 +    """
 +    smpl = np.sort(sample)
 +    n = len(smpl)
 +    ckW = max(smpl) - min(smpl)
 +    cki = 0
 +    RB = int(n * (hdi_prob))
 +    L0 = 0
 +    U0 = n-1
 +    while (RB + cki < n):
 +        if smpl[RB + cki] - smpl[cki] < ckW:
 +            ckW = smpl[RB + cki] - smpl[cki]
 +            L0 = cki
 +            U0 = RB + cki
 +        cki += 1
 +    ckW = max(smpl) - min(smpl)
 +    cki = 1
 +    LB = n - int(n * (hdi_prob))
 +    L1 = 0
 +    U1 = n-1
 +    while (LB - cki >= 0):
 +        if smpl[n - cki] - smpl[LB - cki] < ckW:
 +            ckW = smpl[n - cki] - smpl[LB - cki]
 +            U1 = n - cki
 +            L1 = LB - cki
 +        cki += 1
 +    return [smpl[int((L1+L0)/2)], smpl[int((U1+U0)/2)]]
 +
 +
 +
 +def get_interval(success,total,confidence=0.95):
 +    beta_a=0.5+success
 +    beta_b=0.5+total-success
 +    actual_beta=beta(beta_a,beta_b)
 +    hdi=get_hdi(actual_beta.rvs(100000),confidence)
 +    return hdi
 +
 +
 +
 +
 +
 +def get_hdi_compare(success1,total1,success2,total2,confidence=0.95):
 +    beta_a1=0.5+success1
 +    beta_b1=0.5+total1-success1
 +    beta1=beta(beta_a1,beta_b1)
 +    beta_a2=0.5+success2
 +    beta_b2=0.5+total1-success2
 +    beta2=beta(beta_a2,beta_b2)
 +
 +    n_samples = 100000
 +    datos1=beta1.rvs(n_samples)
 +    datos2=beta2.rvs(n_samples)
 +
 +    resultado=datos1-datos2
 +    
 +    lower,upper=get_hdi(resultado,confidence)
 +
 +    return [lower,upper]
 +</sxh>
 +
 +Lo primero es que hemos creado la función ''get_interval'' que nos retorna el [[https://easystats.github.io/bayestestR/articles/credible_interval.html|intervalo de credibilidad]] (en este caso el Highest Density Interval  o HDI ). Calculamos ambos intervalos y los mostramos:
 +
 +<sxh python>
 +TP1=131
 +FN1=16
 +
 +TP2=124
 +FN2=23
 +
 +
 +interval1=get_interval(TP1,TP1+FN1)
 +interval2=get_interval(TP2,TP2+FN2)
 +
 +
 +figure=plt.figure(figsize=(5.5, 3))
 +axes = figure.add_subplot()
 +
 +intervalos=[
 +    interval1,
 +    interval2
 +]
 +ylabels=['Modelo 1', 'Modelo 2']
 + 
 +plot_intervals(axes,intervalos,"Comparación de modelos","Sensibilidad",ylabels)
 +</sxh>
 +
 +La gráfica resultante es: 
 +{{:clase:iabd:pia:2eval:comparacion_2_metricas.png?direct|}}
 +
 +
 +Y para saber si realmente tienen la misma métrica simplemente ejecutamos el siguiente código:
 +<sxh python>
 +print(get_hdi_compare(TP1,TP1+FN1,TP2,TP2+FN2))
 +</sxh>
 +Y el resultado es:
 +<sxh base>
 +[-0.029769860656823077, 0.12498680076438595]
 +</sxh>
 +
 +**Si el intervalo incluye al cero es que tienen la misma métrica.** Y en el ejemplo como el intervalo contiene el cero es que tienen la misma métrica.
 +
 +Veamos ahora otro ejemplo:
 +<sxh python>
 +TP1=131
 +FN1=16
 +
 +TP2=116
 +FN2=31
 +
 +
 +interval1=get_interval(TP1,TP1+FN1)
 +interval2=get_interval(TP2,TP2+FN2)
 +
 +
 +figure=plt.figure(figsize=(5.5, 3))
 +axes = figure.add_subplot()
 +
 +intervalos=[
 +    interval1,
 +    interval2
 +]
 +ylabels=['Modelo 1', 'Modelo 2']
 + 
 +plot_intervals_with_guides(axes,intervalos,"Comparación de modelos","Sensibilidad",ylabels)
 +</sxh>
 +{{:clase:iabd:pia:2eval:comparacion_2_metricas_b.png?direct|}}
 +
 +<sxh python>
 +print(get_hdi_compare(TP1,TP1+FN1,TP2,TP2+FN2))
 +</sxh>
 +
 +<sxh base>
 +[0.018992455698845223, 0.18505496723415582]
 +</sxh>
 +
 +Por lo que en este caso se solapan pero no tiene la misma métrica. 
 +
 +De todas en este caso, el intervalo está rozando el cero, hay un concepto llamado [[https://easystats.github.io/bayestestR/articles/region_of_practical_equivalence.html|Region of Practical Equivalence (ROPE)]] que dice que aunque no esté el cero en el intervalo, nos vale una región cercana al cero ya que de forma práctica es como si fuera el cero.
  
 +Mas información:
 +  * {{ :clase:iabd:pia:2eval:a_bayesian_interpretation_of_the_confusion_matrix.pdf |A bayesian interpretation of the confusion matrix}}
 +  * {{ :clase:iabd:pia:2eval:classifier_uncertainty.evidence_potential_impact_and_probabilistic_treatment.pdf |Classifier uncertainty:evidence, potential impact and probabilistic treatment}}
 +  * {{ :clase:iabd:pia:2eval:the_balanced_accuracy_and_its_posterior_distribution.pdf |The balanced accuracy and its posterior distribution}}
 +  * [[https://doingbayesiandataanalysis.blogspot.com/2018/05/just-published-rejecting-or-accepting.html|Just published: "Rejecting or Accepting Parameter Values in Bayesian Estimation"]]
 +  * [[https://doingbayesiandataanalysis.blogspot.com/2013/08/how-much-of-bayesian-posterior.html|How much of a Bayesian posterior distribution falls inside a region of practical equivalence (ROPE)]]
  
 ===== Ejercicios ===== ===== Ejercicios =====
Línea 284: Línea 442:
 ¿Que umbral elegirías? ¿Que umbral elegirías?
  
-<note tip>Para ahcer este típo de gráficas usa el método:+<note tip>Para hacer este típo de gráficas usa el método:
  
 ''axes.fill_between(rango_threshold, rango_sensibilidad_lower, rango_sensibilidad_upper, color=color, alpha=0.5)''</note> ''axes.fill_between(rango_threshold, rango_sensibilidad_lower, rango_sensibilidad_upper, color=color, alpha=0.5)''</note>
  
clase/iabd/pia/2eval/tema08.intervalo_confianza.1716046321.txt.gz · Última modificación: 2024/05/18 17:32 por admin