¿Cómo podemos mejorar los resultados a la hora de hacer forecasting?

Nicolás García Aramouni
Data & AI Accenture Argentina
7 min readMar 18, 2024

--

Después de cuatro años trabajando en el equipo de Accenture Applied Intelligence, y con experiencia en varios proyectos de pronóstico de demanda, he aprendido varias lecciones que me han ayudado a encarar problemas nuevos. En este artículo, mostraremos algunos de estos aprendizajes con un ejemplo práctico. La tarea es bastante directa: hacer un forecast diario de la cantidad de vehículos que pasarán por cada estación de peaje de la Ciudad de Buenos Aires los próximos seis meses (los datos, disponibles aquí, tienen una mayor granularidad, pero para hacer la tarea más simple, agrupamos los datos a nivel estación — día).

Para evitar la turbulencia en los datos por el COVID, los resultados finales fueron medidos en el período julio-diciembre 2019. Sin embargo, para testear la performance general de los modelos, se desarrollaron varios ejercicios de back-testing (por ejemplo, pararnos a final de diciembre 2018, forecastear enero a junio 2019 y comparar ese pronóstico con lo que pasó en la realidad). Durante los próximos párrafos, intentaré mostrar el camino lógico que hice para mejorar la performance de mis modelos.

Primero, seleccionar los modelos adecuados

Una característica importante de los problemas de forecasting es la interdependencia temporal entre las observaciones (por ejemplo, el precio de un bien en un día en particular debería estar altamente correlacionado con el precio del mismo bien del día anterior). Deberíamos usar esta característica a favor nuestro para mejorar nuestro entendimiento sobre la serie de tiempo (y, en lo posible, usar modelos que incorporen esto en el proceso de entrenamiento y predicción). Esto es similar a lo que pasa en problemas de detección de imágenes con deep learning. En ese caso, un conjunto de modelos específicos -las redes neuronales convolucionales- son utilizados. Esto es porque, para identificar objetos, no podemos ver un píxel de forma independiente, sino también considerar los que están alrededor. En este sentido, en este contexto estamos hablando de una interdependencia espacial. Con forecasting de series de tiempo, la interdependencia está asociada al paso del tiempo.

Debemos aprovechar la interdependencia temporal de las series de tiempo para aumentar nuestro nivel de ententendimiento sobre los datos

Relacionado con esto, modelos de machine learning de alta complejidad y performance (como Random Forest y XGBoost), que suelen ser excelentes con datos a nivel cross-section, pueden no ser siempre los mejores con estos problemas ya que esta dependencia temporal tiene que ser seteada manualmente (por ejemplo, incluyendo lags y leads de la variable a predecir como regresores). Sin embargo, podemos intentar usar varios tipos de modelos que incluyen esta temporalidad: algunos son más simples (como un modelo Naïve o un modelo de suavizado exponencial) y otros más complejos (que además nos permiten incluir variables causales adicionales si quisiéramos): como Prophet o ARIMA.

La búsqueda constante por la mejora de performance y la pesadilla de cada forecaster

Una de las características más interesante (y a veces frustrante) del trabajo del forecaster es que no siempre más significa mejor. Se puede crear un modelo complejo, con muchas variables adicionales y muchas rondas de tuneo de hiperparámetros, pero sin embargo a veces los modelos más simples (a los que suelen llamar Naïve), pueden ser mejores. En este problema en particular, la predicción más simple implicaría usar el mismo valor para el año pasado (por ejemplo, la cantidad de autos que pasan por una estación el 6 de mayo de 2019 debería ser similar a la cantidad de autos que pasaron el 6 de mayo de 2018).

Sin embargo, este modelo simple no incorpora una característica importante de este problema: la estacionalidad semanal (no hay el mismo nivel de tráfico un viernes y un sábado, por ejemplo). Por lo tanto, si el 6 de mayo fue el primer lunes de mayo de 2019, entonces la predicción “Naïve” más apropiada podría no ser el 6 de mayo de 2018, sino el valor del primer lunes de mayo de 2018. Por lo tanto, creamos dos predicciones Naïve (la primera la llamaremos “Misma Fecha” y la segunda “Misma Semana” para el primer semestre de 2019 y calculamos el WAPE (error porcentual promedio ponderado) para conseguir unos resultados preliminares:

WAPE por estación y tipo de modelo Naïve — Enero a Junio 2019

Como podemos ver, una simple modificación, que nos permite incorporar dos características importantes en nuestro modelo (estacionalidad anual y semanal), nos permite conseguir una mejora considerable en la performance general. Sin embargo, al hacer un análisis exploratorio de datos simple, se encuentran algunas cosas interesantes. En particular, cuando vemos la evolución de la variable a predecir para una estación en particular (Alberdi), se puede llegar a varias conclusiones:

Cantidad de autos diaria que visita la estación Alberdi — 2017

Se puede observar que la estacionalidad semanal de una forma muy clara. Esto nos da un indicio de por qué el segundo modelo Naïve que armamos fue significativamente mejor que el primero. Además, se puede ver que ocasionalmente, la cantidad diaria de autos cae por debajo de 6.000. Una gran porción de estos días está asociado a un feriado nacional: Carnaval, Pascuas, la Revolución de Mayo o el Día de la Bandera. Es posible pensar entonces que los feriados tienen un comportamiento distinto a los días “ordinarios”. Por lo tanto, para hacer una mejora “final” a nuestro modelo Naïve creamos un calendario de feriados para obtener por tipo de feriado, su fecha y su fecha del año anterior (lo cual puede ser importante para feriados movibles -como Pascua-). Con esto, estamos llegando a un enfoque Naïve híbrido: para días ordinarios usamos el pronóstico “Misma Semana” y para los feriados usamos el valor del mismo feriado para el año anterior. Con este cambio, llegamos a un menor WAPE, mejorando a 15,9%.

Incorporar lógicas simples de negocio muchas veces mejora la performance de los modelos matemáticos

Sin embargo, el hecho de que los modelos Naïve sean bastante buenos a veces representa una pesadilla para los forecasters. ¿Por qué? Porque nuestro trabajo es ser mejores que el modelo Naïve, incorporando nuevas variables, modelos o técnicas de procesamiento de datos. Sin embargo, el hecho de que los modelos Naïve incorporen estacionalidades anuales y semanales con lógicas simples los hace competidores fuertes. Sin embargo, esto no debería frenarnos de intentar probar hacer cosas innovadoras para mejorar nuestra performance. Dada la limitación de tiempo, estas son las cosas que intenté:

Limpieza de datos

Detección de outliers de series de tiempo: Los outliers dificultan la tarea de que los modelos entiendan qué está pasando y descubrir patrones en los datos, por lo que puede ser una buena idea intentar tratarlos de algún modo. Otra vez, es importante considerar la estructura temporal, por lo que antes de detectar outliers se le quitó la tendencia y estacionalidad anual. Cada outlier identificado en el set de entrenamiento fue reemplazado por el promedio de los valores para el mismo día de la semana y mes (por ejemplo, si el sábado 1ro de abril de 2018 es un outlier, entonces para el proceso de entrenamiento, su valor fue reemplazado por el promedio de los otros sábados de abril 2018). Para quien le interese este tema, ¡próximamente se vendrá otro post al respecto!

Modelado

· Suavizado Exponencial: Es un modelo simple que utiliza solamente la serie de tiempo para el modelado y permite incorporar tendencia y estacionalidad. Suele ser robusto y tener buena performance, especialmente para períodos cortos. Intenté dos variantes, a las que llamaré expo y expo_clean (es decir, sin outliers). Adicionalmente, intenté un experiment adicional en el que en vez de hacer forecasts diarios, se hacían forecasts semanales, los cuales eran luego desagregadas según la distribución de tráfico por día de la semana (a este experimento, lo llamaré expo_semana)

· Prophet: Modelo de forecasting desarrollado por Facebook, que permite modelar comportamientos complejos, distintos niveles de estacionalidad (anual, mensual, semanal, diaria) y tendencias. Además, nos permite incorporar regresores adicionales (aunque no fueron utilizados en estos casos). A los experimentos en los que se usó Prophet, los llamaré prophet y prophet_clean (cuando se usó la serie sin outliers)

Dado esto, presentamos los resultados para todos los experimentos realizados:

WAPE por experimento — Todas las estaciones, Enero a Junio 2019

Con estos resultados en mente, hay algunas conclusiones que salen del análisis:

La cantidad de experimentos que se puede probar es infinita. Hay varias cosas que me hubiera gustado probar, pero no se logró por límite de tiempo (por ejemplo, un modelo econométrico como ARIMA o los modelos clásicos de Machine Learning)

· Los resultados dependen no solo de los modelos, sino también de los datos. Esto implica que puede ser que utilizar la misma metodología con otros datos podría generar unos resultados totalmente distintos.

· Es importante ver y entender los datos y la lógica de negocios subyacente para tener buenos resultados (incorporar estacionalidad semanal a través de reglas de negocio nos dio una reducción del WAPE de 3,4 puntos porcentuales).

· A veces, los modelos simples van a ser mejores que los complejos, ¡no los subestimemos!

--

--

Nicolás García Aramouni
Data & AI Accenture Argentina

Argentine Data Scientist. Passionate about music, sports and data analytics