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.