DEV Community

Cover image for astrocp: Conformal Prediction con cobertura condicional por clase para astronomía
Fenix
Fenix

Posted on

astrocp: Conformal Prediction con cobertura condicional por clase para astronomía

astrocp: Conformal Prediction con cobertura condicional por clase para astronomía

Una librería pequeña (AD-MCP) que da conjuntos de predicción con cobertura
por cada clase en datasets astronómicos con clases raras — y el registro
honesto de cómo pasó de "funciona" a "funciona y está verificado".

El problema

En sondeos astronómicos (PLAsTiCC, SDSS) las clases raras —supernovas
poco frecuentes, quasars raros— conviven con clases mayoritarias. Un
clasificador bien calibrado puede dar una cobertura marginal del 90% y,
aun así, dejar a la clase rara en un 40%. La cobertura marginal engaña:
oculta que el modelo falla justo donde importa.

Conformal Prediction (CP) controla la cobertura con garantía de muestra
finita. Pero la variante estándar (un solo cuantil global) repite el mismo
defecto: protege el promedio, no a cada clase.

Qué existe ya (y qué no)

La predicción conformista se ha aplicado a astronomía:
Giertych, Williams & Ghosh (2024) — "Conformal Prediction for Astronomy
Data with Measurement Error"
construye
intervalos de predicción para regresión con error de medición
heterocedástico (masas de exoplanetas).

El gap que astrocp aborda es distinto y más estrecho:

No existe una librería mantenida de Conformal Prediction para
clasificación multi-clase con incertidumbre condicional por clase en
astronomía
— es decir, que controle la cobertura de cada clase
(incluidas las raras) por separado, no solo la marginal.

AD-MCP es clasificación multi-clase con estratificación Mondrian por
anomaly score; el paper de 2024 es regresión. No se solapan.

Cómo funciona AD-MCP

ADMCP combina dos piezas sobre MAPIE 1.4.1:

  1. Un modelo base global (RandomForest).
  2. Cuantiles de conformidad RAPS por bin del anomaly score (IsolationForest), en vez de un único cuantil global. Cada punto usa el cuantil de su estrato de anomalía.

El conjunto de predicción = { clases c : score_c <= q_estrato }.

El cuantil se fija por validación cruzada (select_lambda), no a ojo.

El guardrail que el método necesitaba

Con clases de 16-30 muestras en calibración, repartidas en varios estratos,
el cuantil por estrato es ruido puro: ninguna estratificación (por
anomaly o por cualquier otra variable) es viable por falta de señal. No es
fallo del método, es falta de datos.

Por eso ADMCP marca las clases con menos de n_min_class muestras en
calibración como inviable y delega a un cuantil global para ellas. El
paquete avisa cuándo no debe estratificar, en vez de ocultar la
limitación.

Resultados (sin inflar)

  • AD-MCP mejora la cobertura condicional relativa vs baseline en régimen favorable (SDSS; PLAsTiCC con features pobres).
  • Con features ricas, el baseline de conformalización global puede superar a AD-MCP en la peor clase: el límite real no es de "régimen de anomaly" sino de muestras mínimas por clase.
  • lambda_reg se fija por CV con un criterio compuesto, no a dedo.

La comparación que importa es relativa (AD-MCP vs baseline, mismo
dataset, mismo modelo), no contra un umbral absoluto que se haya movido en
el camino.

Cómo se verificó (la parte que importa)

El repo no se fusionó a main porque "Hermes dijo que pasaba". Pasó por
auditoría ciega desde clone limpio:

  • Clone en directorio nuevo, .venv nuevo, 27 dependencias desde cero.
  • pytest11 passed, 2 failed. Los 2 fallidos son el criterio de aceptación original, preservado a propósito en rojo porque se relajó tras ver los datos (trazabilidad de los postes movidos, no borrar el test que falla).
  • La auditoría encontró y corrigió 3 bugs de reproducibilidad que el entorno local ocultaba: dependencia astroML no declarada, datos en .gitignore, y un cache de features que no codificaba el tamaño de muestra.
  • El autor (Sil) reprodujo el clone limpio por su cuenta: mismo resultado.

Esto es la prueba de calidad, no un adjetivo.

Pruébalo

git clone https://github.com/amurlaniakea/astrocp.git
cd astrocp && python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[test]"
pytest   # esperado: 11 passed, 2 failed (test_coverage_red.py rojo a propósito)
Enter fullscreen mode Exit fullscreen mode

Stack

Componente Rol
MAPIE 1.4.1 Conformal Prediction base (RAPS)
scikit-learn RandomForest, IsolationForest
astroML Carga de SDSS (local, sin red)
PLAsTiCC Lightcurves de supernova (Zenodo)

Links


Licencia: AGPL-3.0-or-later. Copyright © 2026 Pedro Sordo Martínez.

Top comments (0)