Predicción de Calidad del Aire Predicción de calidad del aire en Madrid a 24 h con DCRNN

Python PyTorch DCRNN FastAPI NumPy Graph Neural Network Time Series Open-Meteo Leaflet.js MQTT NGSI-LD GeoJSON
Predicción de Calidad del Aire

Sobre el Proyecto

Sistema de predicción del Índice de Calidad del Aire (ICA) a 24 horas mediante una Red Neuronal Recurrente con Convolución Difusiva (DCRNN-lite). Entrenado con datos reales del servicio CAMS Reanalysis de Open-Meteo (2022-2023). El modelo trata cada estación de monitorización como un nodo en un grafo espacial y propaga señales de contaminación entre estaciones vecinas para capturar la dinámica de dispersión atmosférica.

Cómo medir la efectividad real del modelo

Para modelos de predicción temporal como este, hay métricas más honestas que el accuracy:

  • R² por estación = 0.84: calculado individualmente para cada estación y luego promediado. Significa que el modelo captura el 84% de la variación real hora a hora en cada punto de medición. Es más exigente que el R² global porque exige acierto local, no solo tendencia general.
  • MAE = ±2.8 ICA: el error medio está muy por debajo del umbral de cambio de categoría (p.ej. de "Buena" a "Moderada" requiere superar 100 ICA). En la práctica, el modelo rara vez confunde una categoría de riesgo con otra.
  • F1-score (macro) = 0.86 · MCC = 0.73: calculados sobre 21.024 muestras reales clasificando predicciones en categorías ICA (Buena/Moderada/Dañina). MCC≥0.7 es excelente incluso con el fuerte desbalanceo de clases del aire de Madrid (93.5% Buena). El modelo clasifica correctamente el 97% de las horas.
  • Recall "Moderada" = 0.70: el modelo detecta el 70% de los episodios de contaminación moderada. El 30% restante (falsos negativos) son episodios leves cerca del umbral 50 ICA — por diseño, el modelo es conservador para evitar falsas alarmas.
  • Coherencia espacial: la propagación en grafo (K=1 hop) garantiza que estaciones vecinas no tengan predicciones contradictorias, algo que un modelo independiente por estación no garantizaría.

Arquitectura del Modelo

  • Grafo de estaciones: 24 nodos con aristas de proximidad geográfica. Kernel gaussiano sobre distancia euclidiana, normalizado por fila (random walk).
  • DCGRUCell: Celda GRU con Diffusion Graph Convolution pura PyTorch. K=1 hop de difusión.
  • Features de entrada (10): NO₂, PM10, O₃, velocidad de viento, sin/cos dirección, temperatura, sin/cos hora del día, ICA actual.
  • Estrategia: entrenamiento H=1 (siguiente hora) + predicción iterativa 24h (autoregresivo). Más preciso que predecir directamente 24 pasos.

Tecnologías

Python 3.12 · PyTorch 2.10 · FastAPI · NumPy · scikit-learn · Leaflet.js · Open-Meteo CAMS API · Laravel (proxy HTTP)

Integración, datos y licencia

  • Integración: API REST propia (FastAPI) con 8 endpoints documentados en el repositorio; se puede consumir desde cualquier lenguaje o plataforma, con especificación OpenAPI autogenerada.
  • Tratamiento de datos: el procesamiento se realiza íntegramente en el servidor del proyecto, sin enviar datos a servicios de IA de terceros. No se almacenan las consultas de la demo.
  • Licencia: MIT — uso libre, incluido comercial, manteniendo el aviso de copyright. El repositorio contiene la aplicación completa y puede desplegarse en infraestructura propia. El código es gratuito; los costes de motor de IA, infraestructura, implantación y mantenimiento corren por cuenta de quien lo despliega (no se ofrece soporte ni consultoría).

¿Cómo lo integro?

Disponible ahora: Endpoints por ciudad y estación con predicción a 24 h; pensados para consultarse en bucle desde un panel o un script.

Integraciones habituales en este sector (valoradas como vía recomendada; salvo que se indique lo contrario, no vienen implementadas — el código está preparado para añadirlas):

  • FIWARE / NGSI-LD — YA IMPLEMENTADO: GET /ml/calidad-aire/ngsi-ld devuelve la predicción como entidades AirQualityObserved (modelo oficial de FIWARE Smart Data Models, ETSI CIM 009), volcables tal cual a un Context Broker Orion-LD, Scorpio o Stellio. La predicción a 24 h viaja en un atributo propio declarado como extensión, para no confundirlo con el estándar.
  • OpenAQ y AEMET OpenData: fuentes abiertas para alimentar el modelo con más estaciones o validar contra medición oficial.
  • Home Assistant / MQTT — YA IMPLEMENTADO: el script mqtt_publish.py publica la predicción en un broker MQTT con autodescubrimiento de Home Assistant: cada estación aparece como sensor sin editar configuration.yaml, agrupadas por ciudad. Permite automatismos del tipo «cierra la ventilación si el máximo previsto a 24 h supera X». Es un script y no un hilo del servicio porque esta API es on-demand: se programa por cron junto al broker del integrador.
  • Grafana: serie temporal de predicción vs medición real; el panel típico de un departamento de medio ambiente.

Última actualización

Bloque de prueba sintético.

Mapa del bucleDisparador: Necesito saber si mañana habrá un episodio de contaminación en la ciudad.. Acción: Propaga las lecturas entre las 24 estaciones vecinas como un grafo y predice el índice de cada una a 24 horas.. Medición: La categoría ICA prevista por estación, con un error medio de ±2,8 puntos de índice.. Decisión: Decido si aviso, si se activa el protocolo o si no hace falta hacer nada..EL BUCLE QUE CIERRAPara quien vigila la calidad delaire de Madrid1DISPARADORNecesito saber si mañanahabrá un episodio decontaminación en la ciudad.2ACCIÓNPropaga las lecturas entrelas 24 estaciones vecinascomo un grafo y predice elíndice de cada una a 24horas.3MEDICIÓNLa categoría ICA previstapor estación, con un errormedio de ±2,8 puntos deíndice.4DECISIÓNDecido si aviso, si seactiva el protocolo o si nohace falta hacer nada.Cada díalo hace una personalo hace el software

Descargar el diagrama (SVG)

Resultados

F1 = 0.86
F1-score clasificación ICA
Macro F1=0.86 · Weighted F1=0.97 · Precision Moderada=0.80 · Recall Moderada=0.70. Evaluado en 21.024 muestras reales
MCC = 0.73
Matthews Correlation Coefficient
MCC≈0.73 = fuerte incluso con clases muy desbalanceadas (93.5% Buena / 6.5% Moderada). R²=0.84 en regresión ICA
97% acc.
Exactitud en categoría ICA
24 estaciones simultáneas · predicción iterativa 24h · datos reales Open-Meteo CAMS 2022-2023 Madrid

Límites

Lo que no hace

  • Solo cubre Madrid: el grafo son las 24 estaciones de la ciudad, no otras redes.
  • No pasa de 24 horas: el horizonte de la predicción es un día.
  • No mide nada: consume las lecturas de las estaciones, no sustituye a un sensor.

Decisiones

Por qué está construido así

  • Las estaciones, como grafo en vez de una serie temporal independiente por estación

    La contaminación viaja entre estaciones vecinas. Una serie aislada no ve venir el episodio que ya está en la estación de al lado.

  • Servir en NGSI-LD y GeoJSON en vez de un JSON con formato propio

    Son los formatos que ya hablan las plataformas de ciudad y los visores de mapas, así que se conecta sin escribir un adaptador.

Try Live Demo View Code

Cómo está construido

Predecir la calidad del aire a 24 h con DCRNN: redes de grafos espacio-temporales (con código) Modelé 24 estaciones de Madrid como un grafo y entrené una DCRNN en PyTorch para predecir el Índice de Calidad del Aire a 24 horas. Arquitectura, código y métricas r...