top of page

NOS VAMOS A CÁDIZ CON LSTM EN PYTHON

  • fjroar
  • 23 mar
  • 6 Min. de lectura

Cuando he visto ejemplos de LSTM aplicados a series temporales como los que se observan, por ejemplo aquí:



 

Se queda uno/a con la desazón de si serán o no una buena herramienta para el análisis de series temporales ya que o el ejemplo es muy pobre para tal fin, o de algún modo no se consiguen unos resultados que uno pueda decir ¡Wow! ¡Qué maravilla frente a otros modelos! o al menos generar algo con cierta calidad.


Para no hacer muy extenso esta entrada, recomiendo que quién no tenga ni idea de lo que es un modelo Long Short-Term Memory se mire al menos por encima, el siguiente blog:



Básicamente hago un resumen de la idea que se busca cuando se trata de predecir series temporales:


  • Un LSTM es un tipo de red neuronal recurrente en la que se requiere cierta persistencia cuando se quiere realizar predicciones, por tanto se desea un tipo de red neuronal que realice bucles tal y como muestra el siguiente esquema extraída del citado blog:


  • La recurrencia anterior se consigue en la práctica con una estructura en “puertas” donde se decide:

 

  • Qué información olvidar (donde se usa una función sigmoida)

  • Qué nueva información se agrega a la memoria (donde se usa una función sigmoida y una tangente hiperbólia)

  • Qué parte de la memoria se usa para generar la salida (donde se una función sigmoida y una tangente hiperbólica)

 

  • Todo lo anterior se vincula de este modo, donde en el blog referenciado se explica bastante bien:


Pues bien, analizando con mis alumnos un ejemplo sobre prever visitas a Cádiz con datos públicos descargados del INE, decidimos ir esta vez con “pólvora del rey” y aplicar un modelo como estos para afianzar conceptos clave sobre qué puede hacer un modelo de Inteligencia Artificial actual con múltiples aplicaciones como el reconocimiento de voz (y otros) además del tema en concreto que aquí nos ocupa, el de series temporales donde como he indicado al principio, no he visto ejemplos muy relevantes que me inciten a su uso intensivo y es una teoría a la que le tengo mucho cariño ya que fue con la que me introduje en el mundo de la estadística hace unos 25 años ya (que se dice pronto ...)


Dicho lo cual, nos proponemos analizar la siguiente serie temporal cuyos datos y código dejo en el siguiente github: https://github.com/FJROAR/LTSMEXAMPLE siendo la serie de datos el número de visitantes a la provincia de Cadiz que tiene la siguiente forma:


Se observa una típica serie con períodos anuales, donde se nota la caída con el período COVID del año 2020, la recuperación del 2021 y la vuelta a la normalidad a partir del 2022 finalizando el último dato disponible hasta prácticamente Febrero de este año 2025.


Además, es una serie curiosa porque se observa, sobre todo en los períodos más antiguos el pico de los carnavales, la caída tras estos y después el Verano que es cuando hay más afluencia, además se ve un comportamiento de creciente en variabilidad y claramente una fuerte estacionalidad.


En este caso el ejercicio a realizar fue muy sencillo. Se va a entrenar con el 90% de la información (básicamente hasta el año 2022) y se va a ver qué predice el LSTM a partir de ese momento. Gran parte del código lo generamos con Chat GPT que a día de hoy es un gran aliado en las clases donde se quiere hacer algo importante. Previamente creamos una variable de intervención para el año 2020 y otra para el 2021 para recoger mejor los “efectos COVID” que alteran la serie.


Pues bien, se montó un LSTM con 12 pasos siendo el núcleo "definitorio" del modelo la siguiente parte del código python que está en el git anteriormente mencionado:

Donde tras su ajuste, se obtiene el siguiente resultado:


Con un error absoluto medio relativo igual al 0.0830 que es bastante aceptable, sobre todo se tiene en cuenta que no se ha metido la variable calendario tipo “carnavales” que estoy seguro que mejoraría y reproduciría más fielmente esos picos de desfase que varían y que como dependen de la Semana Santa, por tanto hay que meter “algo lunar” para mejorar la predicción.


Pues bien, podemos generar el siguiente año dando como resultado:


Donde se observa que parece que va hacia un nivel más o menos constante de visitas, siendo mejorable la predicción si se mete el mencionado efecto carnaval que por el momento no voy a utilizar.


Y ahora la pregunta es ¿Qué pasa si comparo este resultado con el que me daría un modelo econométrico ARIMA? A ver, he tomado un modelo básicamente por defecto tipo LSTM y no le he metido mucha “más historia”, por tanto la comparación la voy a llevar a cabo con un segundo código donde voy a considerar el autoarima que ofrece Python sin meterme a trabajar la serie vía metodología de Box-Jenkins que sería lo correcto, pero entonces no iría a una solución que me ocupase tiempo y análogamente, si hago un grid-search de LSTM, seguro que incluso mejoro lo anteriormente obtenido, por tanto, las reglas del juego van a ser en que vamos a utilizar el auto-arima partiendo de la serie básica por defecto a ver qué sale y el resultado, siguiendo pasos análogos y tras seleccionar como mejor modelo arima el siguiente:



Fueron los siguientes (que se analizan en el test):



Donde el error absoluto medio relativo está en torno a 15.69 que resulta demasiado alto, siendo la predicción final la que refleja el siguiente gráfico a 12 meses:



Donde hay una clara diferencia en el mes de Febrero de 2026 que parece que la serie se va, pero entonces ¿Por qué el modelo ARIMA es tan malo? Pues bien, es que ha tomado la serie y no se ha considerado las variables de intervención para separar el efecto pandemia y recuperación, que sí se hizo en el ejemplo anterior. Así pues que se va a dar un paso adicional y tras la selección de ese primer modelo ARIMA, vamos a utilizarlo pero esta vez pero con esas variables explicativas adicionales observándose que entonces se genera el siguiente resultado bastante mejor que el anterior:



Un ajuste bastante mejor con un error absoluto medio ahora ya en torno al 0.1001 que se acerca bastante al anteriormente obtenido generándose una predicción bastante razonable tal como sigue:


Que es bastante más razonable y en línea con lo dado por el LSTM, por tanto en resumen tenemos que las predicciones de viajeros de Marzo de 2025 hasta Febrero de 2026 por los modelos considerados serán:



Para no extender más este trabajo, ya que se podría discutir sobre comparar con modelos ML y con el Prophet (lo que da para otro post), voy a finalizar con unas conclusiones y consejos cuando se trabaja con series temporales:

 

  1. En general es recomendable usar medidas tipo error absoluto medio relativo con algunas variantes adicionales, entendiendo que cuando se está por debajo de un 0.1 se tiene, por lo general, un buen modelo


  2. En esta serie el LSTM ha ido bien, al igual que el ARIMA con variables exógenas porque la serie tiene claras componentes pero, en series más complejas, tendremos problemas si no se cuenta con buenas variables exógenas y en series financieras el problema suele ser muy complejo, sino sería millonario y por desgracia, no es el caso


  3. Siempre hay que ver las predicciones, tanto el LSTM como el ARIMA con exógenas, parecen ofrecer resultados bastantes consistentes, que varían del modelo ARIMA simple donde el impacto de la Pandemia y de la Recuperación del 2021 al no tenerse controlado, distorsionan la predicción final


  4. Al igual que con tuning creo que el LSTM mejoraría bastante más su error absoluto medio, no hay que ignorar la potencia de la metodología clásica Box - Jenkins, ya que en la serie, no se han realizado transformaciones de box-cox ni un análisis serio para considerar el tema de autocorrelaciones, estacionariedad que seguramente también mejoraría el resultado


  5. No olvidar que mientras un LTSM es un modelo caja negra, el ARIMA tiene una ecuación y parámetros de tipo lineal que se puede escribir y dar lugar una ligera interpretabilidad, lo cual resulta muy positivo


  6. Si aceptamos el LTSM, este año habrá unos 2.930.431 viajeros aproximadamente que visitarán Cádiz, espero que se lo pasen genial

Comments


© 2021 by Francisco J. Rodríguez Aragón. Proudly created with Wix.com

bottom of page