Aqualia
Connecting Waterpeople

Sobre el blog

José María de Cuenca de la Cruz
Curioso, inquieto y creativo… aprendiz de escritor, e interesado también por las nuevas tecnologías y la educación. Me encanta asumir retos y compartir lo aprendido. Trabajando en lo que me apasiona…. me siento como un pez, en el agua claro.
Minsait
Global Omnium

Hemos llegado ya a un punto en el que las faenas repetitivas han dejado de producir riqueza eficientemente. Es más, aquellas labores que aún no están digitalizadas probablemente están generando pobreza intelectual y material. Con muchas de las tareas técnicas que hoy consideramos “de alto nivel” falta muy poco para llegar a la misma situación: todos debemos espabilarnos, independientemente de la posición que ocupemos.

En nuestro tiempo no se puede dejar de aprender, hay que hacerlo incluso de los sistemas inteligentes. No solo acerca de ellos. Hasta ahora, en las organizaciones el responsable operativo solía tomar sus decisiones basándose en criterios aprendidos tras años de experiencia: lógico y loable… Pero sospechoso cuando no se detecta a tiempo una anomalía por sus indicios. E incluso irresponsable cuando no se llega a dar con la justificación técnica adecuada, aunque sea a posteriori. No digamos si ello afecta a la continuidad o a la sostenibilidad de servicios esenciales, como los nuestros.

Para que esto no suceda podemos contar con sistemas de apoyo basados en Inteligencia Artificial como los que vamos viendo en esta serie de post. La mayoría de los algoritmos utilizados han sido desarrollados por y para otros sectores no tan tradicionales, pero son perfectamente aplicables a la gestión del agua.

Por el momento, el despegue de las soluciones de IA es lento porque despiertan los recelos de una mayoría que las considera como algo demasiado complejo. Incluso para aquellos que son amantes de la tecnología y disfrutan haciendo un esfuerzo por comprenderla –como probablemente el lector-, un algoritmo de aprendizaje automático puede no resultar confiable si su funcionamiento no es fácilmente comprensible. No digamos cuando incluso sus resultados puedan variar ligeramente, ya que incorpora mecanismos aleatorios en sus cálculos, como las capas Dropout que vimos en la red neuronal LSTM para predecir el consumo de un abonado doméstico en el post anterior.

En general, debemos acostumbrarnos a la idea de que los sistemas de inteligencia artificial son “cajas negras”. Por eso, salvo que estemos dispuestos a dedicar grandes dosis de paciencia, necesarias para desentrañar el funcionamiento de un sistema experto complejo que no hemos creado nosotros, el antídoto para combatir la desconfianza es su uso en pruebas durante el tiempo necesario. Es la razón por la cual, la mayoría de plataformas de apoyo a la toma de decisiones en nuestro sector del agua se ofrecen como pilotos en un primer momento. Especialmente cuando son novedad en el mercado.

Sin embargo, muchas soluciones integran algoritmos muy probados, que fueron desarrollados por terceros con otros fines, y se liberaron para su uso público. Por ejemplo por una gran tecnológica, como Google el Tensor Flow que usamos con las redes neuronales. Porque aunque algunos problemas del agua muy concretos puedan requerir un desarrollo específico, lo normal es que sea posible utilizar un algoritmo de tipo generalista, y aplicarle incluso sin modificaciones.

En este post, veremos Prophet, desarrollado por el equipo Core Data Science de Facebook para las operaciones de marketing de la compañía. Está implementado en una librería libre, de manera que le podamos utilizar como venimos haciendo, con apenas varias líneas de código en Python, y también en R. Aunque por debajo utiliza un lenguaje de programación probabilístico, Stan, mucho más complicado que esta librería nos ahorrará conocer.

Prophet es un analizador de series temporales con fuertes componentes estacionales, que se puede utilizar para predecir los valores siguientes a uno dado, al estilo de la red neuronal de predicción de lecturas que construimos en el tercer post de esta serie. El “profeta de Facebook” utiliza un modelo aditivo para descomponer los efectos de la estacionalidad temporal (anual, semanal, diaria…), más las influencias de ciertos días señalados y vacaciones, que pueden ajustarse para cada país o también definirse por el usuario. Básicamente detecta patrones de variación estacional en los datos, utilizando únicamente consideraciones de calendario; y trata de separar esos patrones en diferentes curvas, de manera que su suma se ajuste al resultado esperado.

Le da igual que el dato numérico haga referencia a los usuarios conectados de la red social, a las intervenciones sobre un determinado tema de conversación o hashtag, al absentismo laboral en una organización suficientemente grande…. o al nivel de los depósitos o la energía consumida por un abastecimiento.

Este profeta resulta tan potente que no necesita conocer la longitud de los intervalos entre medidas, solo el inicio de cada uno, y el valor característico. Es decir, el time-stamp y el valor desde el anterior registro. Con eso es suficiente para crear un modelo que tendrá en cuenta la tendencia general de los valores, la incidencia del día de la semana y de la hora, e incluso los acontecimientos festivos. Incluso digiere bien series incompletas, o con datos atípicos, con tendencias no lineales o asintóticas. Aunque al no procesar nada más, salvo los eventos de calendario, no puede incluir nuevas características en los datos, ya que su matriz no admite nuevas “dimensiones” como vimos que sí podían hacer las redes neuronales. Pero a cambio puede procesar rápidamente cantidades enormes de datos temporales “simples”.

A pesar de ello, su uso es sorprendentemente sencillo, al alcance de cualquiera… aunque no así la implementación en Stan o la comprensión de sus intimidades (curvas de crecimiento logístico para tendencias no lineales, distribución de Laplace para determinar los cambios de la tasa de crecimiento, series de Fourier, enfoque bayesiano interpretable…). Como la finalidad de esta serie de post solo es acercar las nuevas tecnologías del Machine Learning a los profesionales de nuestro sector, no me entretendré en interioridades. Pasaremos directamente a aplicarlo en la predicción del agua suministrada en un abastecimiento con una serie de datos históricos suficientemente larga como para presentar problemas a otros modelos predictivos. Todo el código y el dataset de caudales se pueden obtener aquí.

En primer lugar, para su usar esta librería profética necesitamos instalarla en Anaconda, si no lo hicimos siguiendo las instrucciones que dimos en el segundo de estos post, desde la consola con “conda install -c conda-forge fbprophet” . Como curiosidad, si queremos experimentar directamente con Stan, el lenguaje que usa Prophet para sus procesos internos, lo podemos invocar desde otra librería –PyStan- que está incluida por defecto en Anaconda. Esta plataforma ha sido escogida no solo por su potencia y gratuidad, sino porque también simplifica bastante toda la instalación de nuevos algoritmos y herramientas.

Una vez hemos instalado la librería liberada por Facebook, para construir un modelo predictivo con Prophet debemos adaptar los datos a su formato: un dataset con un índice secuencial y dos columnas, con nombres “ds” para las fechas e “y” para los datos. Las fechas además deben estar en formato de datos “datetime”. Nada más, como puede verse aquí. Esto significa que, si queremos alimentarlo con nuestro propio dataset, todo el código ofrecido es reutilizable.

Por defecto, Prophet incorpora diversos calendarios festivos, aunque no analizará sus tendencias de manera específica a menos que así lo configuremos. Para ello, al definir el modelo indicaremos que como calendario de “vacaciones” use el correspondiente a nuestro país… Esto agregará una nueva tendencia al estudio, para analizar específicamente cómo cambia el patrón de los datos durante esas fechas.

Un vez definido y entrenado el modelo, podremos crear una tabla de predicciones con el número de periodos posteriores al último dato que deseemos, en este caso, los siguientes 90 días, y visualizar en gráficos de componentes qué tendencias anuales, mensuales y de días de la semana está considerando el modelo. La gráfica con el patrón anual puede recoger diferentes estrategias de operación o de gestión: variaciones en campañas de búsqueda de fugas, realización de inversiones en redes, campañas de concienciación sobre el consumo, o simplemente cambios en equipos de medida. Las gráficas mensuales y por días de la semana pueden recoger pautas estacionales debidas al clima y los desplazamientos de población, o a los hábitos de consumo de agua (descansos de fin de semana en consumidores industriales o comerciales, variación de hábitos higiénicos,…). Todo ello es aprendido por el algoritmo de manera automática, sin ninguna indicación experta, y solo a partir de los datos de calendario… si es que estos patrones han seguido una pauta temporal, claro está. Como en post anteriores, si desea ver directamente los resultados sin ejecutar el código en Anaconda, también puede abrir este cuaderno Jupyter en su navegador.

Otra cosa curiosa aplicación deriva de la capacidad del algoritmo profético para aprender también los cambios en las tendencias: es capaz de identificar exactamente los puntos (fechas) donde se producen. Y podemos hacer que nos lo muestre con una gráfica, mediante la función changeponints_to_plot de la librería Prophet. Esto no solo es útil para auto convencerse de su funcionamiento… sino para explicarse ciertos fenómenos en determinados momentos del historial de datos, como puede ser cambios organizativos o del entorno. Los sistemas de IA usados para explicar acontecimientos y detectar patrones nos permiten crecer profesionalmente. De una manera tan objetiva como es el cálculo, o tan poco como es la estadística… pero siempre mayor que otras formas más subjetivas como recurrir solo a nuestra “experiencia”.

Reflexiones aparte, y volviendo al problema principal: en las predicciones, este algoritmo “profeta” no solo pronostica un valor para cada registro, sino también sus límites inferior y superior. Si vinculamos la predicción y sus límites -recogidos en una tabla de predicciones- con el valor realmente registrado, podemos obtener una comparación gráfica entre lo que sucedió y lo que predecía el sistema para aquel día. También podemos aislar solamente las predicciones para datos futuros, sin registro por el momento...

Además, para mejorar aún más el modelo, podemos crear e introducir nuestra propia lista de festivos, que además de los días nacionales incluya las fiestas autonómicas y locales. En el ejemplo, con los datos del dataset vemos que la influencia de los festivos ahora sí resulta similar en todos los casos, repercutiendo en unos 3.000 m3 sobre el consumo diario. El uso del calendario local mejora así la predicción.

Para terminar, debo insistir que Prophet solo es capaz de pronosticar variaciones periódicas con componentes estacionales. Su margen de error, en esta aplicación concreta, puede estar influido por cambios en la operación de las plantas de tratamiento a cuya salida se mide el caudal, o por alteraciones en el llenado de los depósitos reguladores. Pero aun así es útil para determinar la demanda media acumulada durante varios periodos sucesivos, cuando esas alteraciones se ven compensadas, y a medio plazo, para detectar la repercusión de las decisiones de explotación del servicio e incluso de los cambios en las estrategias de dirección. En sus gráficos de tendencias, a la vista está.