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.

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
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...