Saltar al contenido

# regresion-logistica-bayesiana-con-pymc

Regresión Logística Bayesiana con PyMC

Volver a la portada del curso
Lectura (Markdown)

Aproximación Variacional

Sección 3 · Técnicas Avanzadas y Ajustes

Aproximación variacional

NUTS es el estándar de oro para muestrear una posterior, pero su costo crece con el tamaño de los datos: cada paso recorre todas las observaciones varias veces. Cuando tienes millones de filas o necesitas reajustar el modelo cada pocos minutos, existe otra estrategia: en lugar de muestrear la posterior, aproximarla con una distribución sencilla resolviendo un problema de optimización. Eso es la inferencia variacional, y PyMC la ofrece con pm.fit.

La idea: optimizar en vez de muestrear

Se elige una familia de distribuciones fáciles $q_\phi(\theta)$, por ejemplo normales con media y varianza ajustables, y se buscan los parámetros $\phi$ que la acercan más a la posterior $p(\theta \mid y)$. «Más cerca» se mide con la divergencia de Kullback-Leibler, que no se puede calcular directamente; en su lugar se maximiza una cota inferior de la evidencia, el ELBO:

$$\text{ELBO}(\phi) = \mathbb{E}_{q_\phi}\left[\log p(y, \theta)\right] - \mathbb{E}_{q_\phi}\left[\log q_\phi(\theta)\right]$$

Maximizar el ELBO equivale a minimizar $\mathrm{KL}(q_\phi \,\|\, p)$. ADVI (Automatic Differentiation Variational Inference) lo hace de forma automática: transforma los parámetros con restricciones a la recta real, estima el gradiente del ELBO con muestras de $q$ y lo optimiza con un método de descenso estocástico.

Campo medio y rango completo

  • Campo medio (method="advi"): una normal independiente por parámetro. Es rápido y escala bien, pero ignora las correlaciones entre parámetros.
  • Rango completo (method="fullrank_advi"): una normal multivariada con matriz de covarianza completa. Capta correlaciones, a cambio de un costo que crece con el cuadrado del número de parámetros.

ADVI en PyMC

with modelo:
    aprox = pm.fit(20000, method="advi", random_seed=42)

perdida = aprox.hist                      # -ELBO por iteración
idata_vi = aprox.sample(4000, random_seed=42)
az.summary(idata_vi, var_names=["alpha", "beta"], kind="stats")

pm.fit devuelve un objeto de aproximación. Su atributo hist guarda la pérdida (el ELBO con signo negativo) de cada iteración: grafícala para confirmar que se estabilizó. En el modelo de créditos baja de unos 1,042 al inicio a un promedio de 416.65 en las últimas 1,000 iteraciones. aprox.sample genera un InferenceData con el que puedes usar las mismas funciones de ArviZ que con NUTS.

¿Qué tan buena es la aproximación?

En el modelo de créditos (800 filas, 4 parámetros), ADVI y NUTS tardaron cada uno entre 3 y 4 s en nuestras pruebas. Las medias casi coinciden: ADVI da −0.661, 0.628 y −0.704 para ingreso, deuda y antigüedad, y NUTS −0.651, 0.625 y −0.711. ADVI de rango completo da medias casi iguales y desviaciones algo mayores (0.104-0.112). El punto débil aparece en las desviaciones estándar. En el proyecto del curso (cáncer de mama, 398 filas de entrenamiento), ADVI de campo medio reporta para mean smoothness una desviación de 0.243, mientras que NUTS da 0.315: ADVI subestima la incertidumbre. Es una propiedad conocida de minimizar $\mathrm{KL}(q \,\|\, p)$: la aproximación prefiere quedarse dentro de la masa de la posterior antes que cubrir sus colas, y el campo medio, además, ignora las correlaciones.

¿Cuándo usarla?

  • Datos grandes, donde NUTS tardaría horas (ADVI admite minilotes con pm.Minibatch).
  • Exploración rápida de muchas especificaciones antes de elegir una para NUTS.
  • Inicializar NUTS: pm.sample(init="advi+adapt_diag") usa ADVI para encontrar un buen punto de partida.

Para el reporte final, con intervalos que alguien va a usar para decidir, prefiere NUTS siempre que sea factible.

Trampas comunes

  • No revisar la convergencia. Si la curva de aprox.hist sigue bajando al final, aumenta las iteraciones; no hay $\hat{R}$ que te avise.
  • Confiar en los intervalos de campo medio. Las medias suelen ser buenas; las varianzas, optimistas.
  • Llamar a pm.fit después de sample_posterior_predictive en el mismo modelo. En PyMC 5.28 falla con NotImplementedError. Ajusta ADVI antes o en un modelo recién creado.
  • Confundir ADVI con MAP. pm.find_MAP da un solo punto (aquí −1.067 para el intercepto) sin incertidumbre; ADVI da una distribución.

Cierre

La inferencia variacional cambia exactitud por velocidad. Úsala cuando la velocidad importa y compárala con NUTS en una muestra de los datos antes de confiar en sus intervalos.

Recursos