En este artículo explico mi solución al Aguathon: el primer Hackathon del Agua, organizado por ITAINNOVA.
Índice
Introducción al Aguathon: el Hackathon del Agua de ITAINNOVA
El Instituto Tecnológico de Aragón ha organizado el 1er Hackathon del Agua, “AGUATHON”. A continuación vamos a ver las partes más relevantes para entender en qué consiste este reto, por qué es tan importante, qué tipo de solución necesitan, qué datos proporcionan y cómo evalúan las soluciones propuestas.
Objetivo
El objetivo de este Hackathon es modelizar el comportamiento del nivel del río Ebro a su paso por la ciudad de Zaragoza para obtener predicciones realistas de su variación en cada instante. Con estas predicciones, la Administración Pública (sistemas de emergencia y etc.) podrá generar alertas automáticas de posibles desbordamientos (inundaciones) y activar los sistemas de emergencia y supervisión para evitar posibles daños que pueden llegar a ocasionar al ciudadano de la ciudad de Zaragoza.
¿Qué forma tiene la predicción?
En concreto el modelo ganador será el que realice predicciones del nivel del río en Zaragoza con mayor precisión. Las predicciones que debe devolver el modelo son a 24, 48 y 72 horas de antelación.
Evaluación de las soluciones
Para evaluar las soluciones, se considerarán dos valoraciones:
- 90% de peso: la media del error cuadrático medio de las predicciones a 24h, 48h y 72h
- 10% de peso: la novedad de los algoritmos entregados comparado con las técnicas del estado del arte y su complejidad
Datos proporcionados
Los datos comprenden desde la fecha-hora: 2008-01-01 00:00:00 a 2018-12-07 23:00:00. En total el archivo contiene 95857 filas. Las columnas son las siguientes:
- time: fecha y hora de la medición (horas exactas, minutos y segundos igual cero).
- ALAGON_NR: Nivel del río Ebro al paso por Alagón. Unidades: metros.
- GRISEN_NR: Nivel del río Jalón al paso por Grisén. Unidades: metros.
- NOVILLAS_NR: Nivel del río Ebro al paso por Novillas. Unidades: metros.
- TAUSTE_NR: Nivel del río Arba al paso por Tauste. Unidades: metros.
- TUDELA_NR: Nivel del río Ebro al paso por Tudela. Unidades: metros.
- ZGZ_NR: Nivel del río Ebro al paso por Zaragoza. Unidades: metros.
- RIESGO: Variable booleana representando si hubo riesgo de inundación en Zaragoza o no. Sin unidades, es un valor lógico: True/False.
- pred_24h: Nivel del río Ebro al paso por Zaragoza 24 horas después del tiempo especificado en la variable time. Unidades: metros.
- pred_48h: Nivel del río Ebro al paso por Zaragoza 48 horas después del tiempo especificado en la variable time. Unidades: metros.
- pred_72h: Nivel del río Ebro al paso por Zaragoza 72 horas después del tiempo especificado en la variable time. Unidades: metros.
Para que os hagáis una idea, así es la forma que tienen los datos (puedes ver más información aquí):
¿Quién está detrás del Aguathon?
Organiza: Instituto Tecnológico de Aragón ITAINNOVA (Gobierno de Aragón)
Patrocina: Instituto Aragonés del Agua (Gobierno de Aragón)
Colaboran: Confederación Hidrográfica del EBro (CHE) – Ministerio para la Transición Ecológica (Gobierno de España); Sistema Automático de Información Hidrológica SAIH; Universidad de Zaragoza; Grupo de Investigación COSMOS y Cluster ZINNAE.
Datos y características para crear los modelos del Aguathon
Una vez descrito el problema a resolver en este hackathon del agua, explico qué datos he usado y las características (features) que he calculado.
Datos que he usado para el entrenamiento
No he usado todas las filas que había disponibles. Como el modelo sólo se evalúa en las filas donde hay riesgo, sólo he usado esas filas. Además, he incluido hasta 16 filas anteriores (correspondientes a 16 horas antes de cada “bloque de riesgo”) porque las necesito para calcular las características.
Características (features) que he creado
Características relativas a la cantidad de agua
- sumNR = suma de todos los niveles de agua
- sumNR-TUDELA_NR = sumNR restándole el nivel de TUDELA_NR
- sumNR-TUDELA_NR-NOVILLAS_NR = sumNR-TUDELA_NR restándole NOVILLAS_NR
- NOVILLAS_NR_y_TUDELA_NR = NOVILLAS_NR + TUDELA_NR
- ebroNR_SUM = TUDELA_NR + NOVILLAS_NR + ALAGON_NR + ZGZ_NR
- no_ebroNR_SUM = GRISEN_NR + TAUSTE_NR
Características polinómicas de grado 2
Cálculo de todas las interacciones polinómicas de grado 2 entre los atributos originales y las características relativas a la cantidad de agua. Sin embargo no considero cada elemento al cuadrado.
Características por diferencias
Para todas las características calculadas anteriormente F, calculamos las diferencias a diferentes intervalos: F(t) – F(t-1), F(t) – F(t-2), F(t) – F(t-4), F(t) – F(t-8), F(t) – F(t-16)
Características de ventana deslizante
Para todas las características calculadas hasta ahora, además de calculan en ventanas deslizantes de tamaño 2, 4, 8, 16 las siguientes características:
- Medias móviles exponenciales
- Valor mínimo
- Valor máximo
- Valor normalizado = (valor – mínimo) / (máximo – mínimo)
Características por fechas
La única característica de fecha que he incluido es el día del año de cada muestra
Datos externos
La organización del hackathon permite usar datos externos. Al mismo tiempo recomienda que los datos externos que se usen «no sean dependientes de un instante de tiempo específico». En su lugar, recomiendan datos del tipo «media de las precipitaciones en la primera quincena de Abril en los últimos 10 años, tiempo máximo sin precipitaciones en otoño en los últimos 50 años, distancias, …»
Con el tipo de algoritmos de aprendizaje automático que tengo pensado utilizar, estos datos estadísticos no serían muy relevantes porque serían constantes para cada muestra. Como estos algoritmos pueden también aprender estos sesgos, no necesitamos este tipo de información. Así que no he usado ningún tipo de dato externo.
Modelos de Aprendizaje Automático que he usado en el Aguathon
He usado la media aritmética de dos modelos de aprendizaje automático.
Predicción del nivel del Ebro a su paso por Zaragoza
Este modelo predice el nivel del río Ebro a su paso por Zaragoza con 24h, 48h y 72h de antelación
Predicción relativa al nivel actual del Ebro a su paso por Zaragoza
Este modelo predice cuánto va a subir (o bajar) el nivel del río Ebro con respecto al nivel actual. Así que predice:
- ZGZ_NR 24h – ZGZ_NR
- ZGZ_NR 48h – ZGZ_NR
- ZGZ_NR 72h – ZGZ_NR
Para usar este modelo necesitamos sumarle a las predicciones, el nivel actual del río Ebro a su paso por Zaragoza. Por ejemplo, para la predicción a 24 horas, le sumamos el nivel del río Ebro a su paso por Zaragoza actualmente más la predicción de cuánto va a subir (o bajar) el nivel en las siguientes 24 horas.
Predicción combinando el modelo de predicción del nivel del Ebro y el modelo de predicción relativa
La predicción final se hace haciendo la media aritmética de esos 2 modelos. Los dos modelos usan los mismos datos de entrada descritos en la sección anterior. Sólo la salida es diferente.
La ventaja de usar estos dos modelos es que son complementarios. La características (features) que son importantes para un modelo no lo son tanto para el otro, y viceversa. Esto hace que los errores de los modelos no estén correlados y que al combinarlos sus errores se compensen, dando lugar a resultados mejores. La siguiente tabla pone en evidencia qué características son importantes para cada modelo y permite comprobar cómo se complementan.
Importancia de las características (features) para cada uno de los 2 modelos [10 atributos más importantes] |
|
Predicción del Nivel del Ebro en Zaragoza |
Predicción del cambio en el Nivel del Ebro en Zaragoza |
0.0728 TUDELA_NR
0.0658 max2(TUDELA_NR) 0.0523 min2(TUDELA_NR) 0.0494 max4(TUDELA_NR) 0.0435 max2(TUDELA_NR NOVILLAS_NR_y_TUDELA_NR) 0.0383 min2(TUDELA_NR sumNR) 0.0352 ewma2(TUDELA_NR) 0.0347 TUDELA_NR NOVILLAS_NR_y_TUDELA_NR 0.0336 min4(TUDELA_NR NOVILLAS_NR_y_TUDELA_NR) 0.029 min2(NOVILLAS_NR TUDELA_NR) |
0.5788 normalized2(ALAGON_NR NOVILLAS_NR_y_TUDELA_NR)
0.0125 ewma16(diff1(NOVILLAS_NR TUDELA_NR)) 0.0125 ewma16(diff2(NOVILLAS_NR TUDELA_NR)) 0.011 ewma16(diff2(TUDELA_NR)) 0.0084 diff1(sumNR ebroNR_SUM) 0.0081 doy 0.0079 ewma16(diff4(TUDELA_NR)) 0.0072 diff1(sumNR-TUDELA_NR-NOVILLAS_NR NOVILLAS_NR_y_TUDELA_NR) 0.0072 ewma16(diff8(TUDELA_NR)) 0.0067 ewma8(diff4(TUDELA_NR ebroNR_SUM)) |
Técnicas de Machine Learning
Como técnica de aprendizaje automático he usado la implementación de ExtraTreesRegressor de scikit-learn para los 2 modelos.
Quería utilizar alguna técnica que usara “ensembles”. La ventaja del uso de ensembles es que mejoran la generalización. La generalización es la capacidad que tienen los modelos de machine learning de obtener buenas predicciones con datos nuevos.
En muchas competiciones de machine learning, los bosques aleatorios (random forests) son la elección por defecto. Es un ensemble de varios árboles de decisión que generaliza bastante bien.
Sin embargo, como la velocidad de entrenamiento y predicción eran relevantes, me he decantado por el uso de ExtraTrees. Los ExtraTrees son más rápidos que los RandomForests porque no intentan encontrar el valor óptimo donde tomar la decisión, sino que esta decisión se toma al azar. Esto resulta en un entrenamiento más rápido y, normalmente, en una generalización mejor ya que también ayuda a disminuir el sesgo durante el entrenamiento.
Evaluación: estimación del rendimiento de los modelos para el Hackathon del Agua
Para evaluar el rendimiento del modelo, he dividido los datos proporcionados en 2 conjuntos:
- Entrenamiento: para construir el modelo
- Validación: para evaluar el modelo
La práctica habitual para construir el conjunto de validación es la elección de muestras aleatoriamente. Sin embargo, para el problema del Aguathon esto no sería una buena idea porque los resultados de evaluación sería artificialmente buenos. Esto se debe a que el modelo estaría entrenado con datos futuros con respecto a algunas muestras del conjunto de validación. Para evitar este fenómeno, he usado el primer 80% de los datos proporcionados como conjunto de entrenamiento y el 20% final como validación.
He usado este conjunto de validación para ir viendo cómo mejoraba el rendimiento a medida que iba añadiendo más características y también para ver qué otras características que había pensando no añadían ningún valor predictivo al modelo.
Resultados de Evaluación
A continuación, muestro los resultados de evaluar los dos modelos. También podemos apreciar cómo los resultados mejoran al combinar los dos modelos.
En el conjunto de validación los errores cuadráticos medios que obtengo son:
Error Cuadrático Medio | Predicción Nivel | Predicción Relativa | Predicción combinada |
24h | 0.015962 | 0.039450 | 0.010716 |
48h | 0.086630 | 0.105484 | 0.076918 |
72h | 0.259210 | 0.272680 | 0.243048 |
A continuación muestro cómo quedan las predicciones combinadas en el conjunto de validación. Las gráficas sólo consideran los datos que contienen riesgo (y las 16 horas anteriores para cada bloque de riesgo)
Ejemplo de la calidad de predicción a 24h
Ejemplo de la calidad de predicción a 48h
Ejemplo de la calidad de predicción a 72h
Modelo final enviado al Aguathon
El modelo final consiste en la media aritmética de los dos modelos entrenados con todos los datos disponibles (tanto los que he usado para entrenamiento como para validación).
Modelo Sustituto (surrogate) para explicar qué hacen los modelos del Aguathon
Los ExtraTrees son un modelo de caja negra. Teóricamente podemos ver lo que hace cada árbol … pero en la práctica es difícil entender lo que hace. Para poder ganar visibilidad en lo que hace los modelos de caja negra, vamos a usar un modelo sustituto (surrogate en inglés).
El objetivo de ITAINNOVA es el de considerar la incorporación de los modelos del Aguathon en un sistema automático de alarma de inundaciones que puede avisar a los sistemas de emergencia. Para justificar las decisiones del modelo de caja negra, podemos usar modelos sustitutos de caja blanca … aunque su rendimiento sean algo peor.
¿Cómo funcionan los modelos sustitutos (surrogates)?
El modelo sustituto es un modelo de caja blanca que se usa para describir lo que hace un modelo de caja negra (posiblemente, con pérdida de rendimiento).
El modelo sustituto se construye usando:
- Como entrada, los datos que queramos
- Como salida, la predicción del modelo de caja negra para los mismos datos de entrada
El modelo sustituto
El modelo sustituto que elegido es un árbol de decisión de profundidad 3. El árbol lo he construido usando como entrada el conjunto de entrenamiento y como salida, las predicciones del ExtraTreeRegressor para los mismos datos. Aquí tenéis el árbol de decisión sustituto:
En cada nodo final podéis observar el vector de predicción para [24h, 48h, 72h]
Nota: la única razón de usar profundidad 3 en el modelo sustituto es porque queda mejor en la documentación. Un árbol de decisión sustituto más profundo daría mejores resultados y seguiría siendo explicable para pocas profundidades. Podéis hacer click en el árbol para obtener una imagen ampliada.
Evaluación del modelo sustituto
El árbol de decisión sustituto es muy simple y fácil de entender. Vamos a comparar el rendimiento en el conjunto de validación de combinar los dos modelos y su modelo sustituto.
Error Cuadrático Medio
(mejor cuanto más bajo) |
Predicción Combinada
(Caja Negra) |
Árbol de Decisión Sustituto
(Caja Blanca) |
Predicción a 24 horas | 0.010716 | 0.050637 |
Predicción a 48 horas | 0.076918 | 0.124144 |
Predicción a 72 horas | 0.243048 | 0.292900 |
Como era de esperar, el rendimiento del modelo sustituto de caja blanca es peor. Aun así, su rendimiento es sorprendentemente bueno si tenemos en cuenta su simplicidad. Si queremos mejorar el rendimiento del modelo sustituto conservando la explicabilidad, podríamos aumentar su profundidad.
Ejemplos con el modelo sustituto
A continuación vemos las predicciones del modelo sustituto en el conjunto de validación para predicción a 24h, 48h y 72h.
Recomendaciones para mejorar la predicción del nivel del río Ebro a su paso por Zaragoza
Uso de datos del nivel del agua en otras ciudades
Como podéis ver en el modelo sustituto de caja blanca, el nivel del Ebro a su paso por Tudela es lo que más influencia tiene en el modelo. Esto funciona bastante bien para las predicciones a 24h y 48h, pero no es suficiente para predicciones a 72h.
Sin ser un entendido en hidrología, me da la impresión de que el agua que hay en Tudela llega a Zaragoza por el Ebro en menos de 2 días … y que por eso es tan difícil predecir a 3 días. Si tuviésemos acceso al nivel del río en otros puntos del Ebro anteriores a Tudela, quizás las predicciones serían mejores.
Recomendación 1: añadir nivel del Ebro y afluentes de Ebro en otros lugares anteriores a Tudela
Uso de datos de datos meteorológicos
Creo que el uso de datos meteorológicos (lluvia sobre todo) en distintos puntos geográficos ayudaría a mejorar la predicción.
Una posibilidad sería usar los datos abiertos de la Agencia Estatal de Meteorología (AEMET) disponibles como datos abiertos meteorológicos. La resolución de estos datos es diaria. Si se pudiese establecer alguna colaboración con la AEMET, quizá se podría usar los datos por horas
Recomendación 2: añadir al modelo datos meteorológicos
Uso de previsiones meteorológicas
Las predicciones meteorológicas están mejorando mucho últimamente. Si añadiésemos a los datos disponibles, el pronóstico de lluvia en 24h, 48h, 72h seguramente podríamos obtener mejores resultados.
El problema podría ser que el histórico de predicciones meteorológicas mezcle metodologías de predicción. Aun así, merece la pena investigarlo y, eventualmente, reducir el conjunto de entrenamiento para ser compatible con la metodología de predicción meteorológica actual.
Recomendación 3: añadir al modelo predicciones meteorológicas
Conclusiones de mi participación en el Aguathon
Por mi parte, quiero creer que he ayudado a mejorar el sistema de predicción de posibles inundaciones. Espero que las predicciones sean lo bastante buenas como para que puedan usarse para generar alertas automáticas. También espero que mi propuesta de usar modelos sustitutos explicables ayude a mejorar la aceptación de técnicas de Inteligencia Artificial en la ayuda a la toma de decisiones.
Agradecimientos al equipo de ITAINNOVA
Me imagino el esfuerzo que requiere organizar este hackathon: preparar los datos, decidir qué datos dar y cuáles no, publicitar el Aguathon, dar soporte a los participantes, construir una plataforma para evaluar automáticamente las soluciones, leer los documentos de las soluciones más prometedoras …
Me gustaría dar las gracias al equipo de ITAINNOVA por la organización de este primer Hackathon del Agua tan interesante.
Exelente! contanos como te fue al final
Hola gaston,
Te dejo este extracto: «César Montenegro Portillo, de la Universidad del País Vasco, ha conseguido el primer premio, tras lograr un error de 0,15 metros (m) en las predicciones a 24 horas (h), de 0,37m a 48h y de 0,47m a 72h para los momentos de riesgo de desbordamiento del río. Generó un modelo que predecía para 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72 horas. Utilizaba las observaciones en episodios de eventos históricos para la calibración del modelo.»
Fuente: https://www.itainnova.es/blog/noticias/un-investigador-de-la-universidad-del-pais-vasco-ganador-del-aguathon/