5 de febrero de 2021
En este artículo, el científico de Data Maxime Lutel resume sus aprendizajes del concurso de previsión de ventas M5, que consistía en predecir las ventas futuras en varias tiendas Walmart. Le guiará a través de nuestra solución y comentará qué modelo de aprendizaje automático funcionó mejor para esta tarea.

Utilizar el aprendizaje automático para resolver los retos empresariales de los minoristas

Una previsión precisa de las ventas es fundamental para que las empresas minoristas produzcan la cantidad necesaria en el momento adecuado. Pero aunque evitar el despilfarro y la escasez sea una de sus principales preocupaciones, los minoristas aún tienen mucho margen de mejora. Al menos, eso es lo que piensa la gente que trabaja en Walmart, que en marzo de 2020 lanzó un desafío científico abierto data-. el concurso M5 - para ver cómo podían mejorar sus modelos de previsión.

El concurso tenía como objetivo predecir las ventas futuras a nivel de producto, basándose en el histórico de data. Más de 5000 equipos de amantes del data y expertos en previsión han debatido durante meses sobre los métodos, las características y los modelos que mejor funcionarían para abordar este conocido problema de aprendizaje automático. Estos debates pusieron de manifiesto algunos problemas recurrentes que se plantean en casi todos los proyectos de previsión. Y lo que es aún más importante, pusieron de manifiesto una gran variedad de enfoques para abordarlos.

Este artículo aspira a resumir algunos ideas clave que surgieron del desafío. En Artefact creemos en el aprendizaje a través de la práctica, así que decidimos arriesgarnos y codificar nuestra propia solución para ilustrarlo. Ahora vamos a recorrer todo el proceso de previsión y a detenernos por el camino para comprender qué funcionó y qué falló.

Planteamiento del problema: Previsión jerárquica de series temporales

El dataset contiene el histórico de ventas de 5 años, de 2011 a 2016, de varios productos y tiendas. Se proporciona alguna información adicional, como los precios de venta y los eventos del calendario. Data está organizado jerárquicamente: las tiendas se dividen en 3 estados y los productos se agrupan por categorías y subcategorías.

Nuestra tarea es predecir las ventas de todos los productos de cada tienda, en los días inmediatamente posteriores al dataset disponible. Significa que hay que hacer 30 490 previsiones para cada día del horizonte de predicción.

Esta jerarquía guiará nuestras opciones de modelización, porque las interacciones dentro de las categorías de productos o las tiendas contienen información muy útil a efectos de predicción. En efecto, los artículos de las mismas tiendas y categorías podrían tener una evolución de ventas similar o, por el contrario, podrían canibalizarse mutuamente. Por lo tanto, vamos a describir cada muestra mediante características que capten estas interacciones, y dar prioridad a los enfoques basados en el aprendizaje automático frente a los tradicionales de previsión, para tener en cuenta esta información a la hora de entrenar el modelo.

Dos retos principales: valores intermitentes y un horizonte de predicción ampliado

A estas alturas, podría pensar que se trata de un problema de previsión muy común. Tiene razón y por eso es interesante: puede relacionarse con una amplia gama de otros proyectos, aunque cada industria tenga sus propias características. Sin embargo, este reto tiene 2 especificidades importantes que harán que la tarea sea más difícil de lo esperado.

La primera es que las series temporales con las que trabajamos tienen muchos valores intermitentes, es decir, largos periodos de días consecutivos sin ventas, como se ilustra en el gráfico siguiente. Esto podría deberse al agotamiento de las existencias o a la limitación de la superficie de las estanterías de las tiendas. En cualquier caso, esto complica la tarea, ya que el error se disparará si las ventas se predicen a un nivel regular mientras el producto está fuera de las estanterías.

La segunda proviene de la propia tarea, y más concretamente de la tamaño del horizonte de predicción. Los competidores deben generar previsiones no sólo para la próxima semana, sino para un periodo de 4 semanas. ¿Preferiría confiar en la previsión meteorológica para el día siguiente o para dentro de 1 mes? Lo mismo ocurre con la previsión de ventas: un horizonte de predicción ampliado hace que el problema sea más complejo, ya que la incertidumbre aumenta con el tiempo.

Ingeniería de funciones - Modelización de los factores impulsores de las ventas

Ahora que hemos comprendido la tarea que tenemos entre manos, podemos empezar a calcular características que modelen todos los fenómenos que puedan afectar a la evolución de las ventas. El objetivo aquí es describir cada tripleta Día x Producto x Tienda mediante un conjunto de indicadores que capten los efectos de factores como la estacionalidad, las tendencias o la fijación de precios.

Estacionalidad

En lugar de utilizar directamente la fecha de venta como predictor, suele ser más pertinente descomponerla en varios rasgos para caracterizar la estacionalidad: año, mes, número de semana, día de la semana... Esto último es especialmente perspicaz porque el problema tiene una fuerte periodicidad semanal: los volúmenes de ventas son mayores los fines de semana, cuando la gente pasa más tiempo en los supermercados.

Calendario de eventos como las vacaciones o las finales de la NBA también tienen un fuerte impacto estacional. Se ha creado una característica para cada acontecimiento, con los siguientes valores:

  • Valores negativos para los 15 días anteriores al acontecimiento (de -15 a -1)

  • 0 el día D

  • Valores positivos durante los 15 días siguientes al suceso (1 a 15)
  • Sin valor en periodos a más de 15 días del acontecimiento

La idea es modelizar el impacto estacional no sólo en el día D, sino también antes y después. Por ejemplo, un producto que se ofrecerá mucho como regalo de Navidad experimentará un pico de ventas los días previos y un descenso justo después.

Tendencias

Las tendencias recientes también proporcionan información útil sobre las ventas futuras y se modelan gracias a características del retraso. Un desfase es el valor de la variable objetivo desplazado un cierto periodo. Para un artículo concreto de una tienda determinada, el valor de desfase de una semana sería las ventas realizadas hace una semana para este artículo y tienda concretos. Se pueden considerar diferentes valores de desfase, y también se calcula la media de varios desfases, para obtener predictores más robustos. Los desfases también pueden calcularse sobre las ventas agregadas para captar tendencias más globales, por ejemplo a nivel de tienda o de categoría de producto.

Precios

El precio de un producto puede cambiar de una tienda a otra, e incluso de una semana a otra dentro de la misma tienda. Estas variaciones influyen mucho en las ventas y, por tanto, deben describirse mediante algunas características. En lugar de precios absolutos, es más probable que las diferencias de precios relativos entre productos relevantes expliquen la evolución de las ventas. Por eso se han calculado los siguientes predictores:

  • Diferencia relativa entre el precio actual de un artículo y su precio medio histórico, para destacar el impacto de las ofertas promocionales.
  • Diferencia relativa de precios con el mismo artículo vendido en otras tiendas, para comprender si la tienda tiene un precio atractivo o no.
  • Diferencia relativa de precios con otros artículos vendidos en la misma tienda y la misma categoría de productos, para captar algunos efectos de canibalización.

Codificación de variables categóricas

Las variables categóricas como el estado, la tienda, el nombre del producto o su categoría también tienen un importante poder predictivo. Esta información debe codificarse en características para ayudar al modelo aprovechando la jerarquía dataset. La codificación en una sola variable no es una opción en este caso porque algunas de estas variables categóricas tienen una cardinalidad muy alta (3049 productos distintos). En su lugar, hemos utilizado una codificación ordenada del objetivo, lo que significa que cada observación se codifica mediante el promedio de ventas de las observaciones anteriores que tienen el mismo valor categórico. Para esta tarea, el conjunto data se ordena por tiempo para evitar fugas de data.

Todas las variables categóricas y algunas de sus combinaciones se han codificado con este método. Esto da como resultado características muy informativas, la mejor de las cuales es la codificación de la combinación de producto y tienda. Si desea experimentar otros codificadores, puede encontrar una amplia gama de métodos aquí.

Pérdida de Tweedie para manejar valores intermitentes

Se pueden utilizar diferentes estrategias posibles para tratar el tema de los valores intermitentes. Algunos participantes decidieron crear 2 modelos distintos: uno para predecir si el producto estará disponible o no un día concreto, y otro para prever las ventas. Como muchos otros, hemos elegido otra opción, que consiste en basarnos en una función objetivo adaptada al problema: la pérdida de tweedie.

Sin entrar en los detalles matemáticos, vamos a intentar comprender por qué esta función de pérdida es adecuada para nuestro problema, comparando la distribución de ventas en el entrenamiento data y la distribución tweedie:

Se parecen bastante y ambas tienen valores concentrados en torno a 0. Establecer la pérdida tweedie como función objetivo obligará básicamente al modelo a maximizar la probabilidad de esa distribución y predecir así la cantidad correcta de 0s. Además, esta función de pérdida viene con un parámetro -cuyos valores van de 1 a 2- que puede ajustarse para adaptarse a la distribución del problema en cuestión:

Basándonos en nuestra distribución dataset, podemos esperar que el valor óptimo esté entre 1 y 1,5, pero para ser más precisos afinaremos ese parámetro más adelante con validación cruzada. Esta función objetivo también está disponible para otros modelos de refuerzo de gradiente como XGBoost o CatBoost, por lo que merece la pena probarla si está tratando con valores intermitentes.

¿Cómo hacer previsiones con 28 días de antelación?: Cómo aprovechar al máximo las funciones de desfase

Como ya se ha explicado, las características de desfase son ventas desplazadas en un periodo de tiempo determinado. Por lo tanto, sus valores dependen de en qué punto del horizonte de previsión se encuentre. Las ventas realizadas en un día concreto D pueden considerarse como un desfase de 1 día si está pronosticando con un día de antelación, o como un desfase de 28 días si está pronosticando con 28 días de antelación. El siguiente diagrama ilustra este punto:

Este concepto es importante para entender qué características serán disponible en el momento de la predicción. En este caso, estamos en el día D y queremos predecir las ventas de los 28 días siguientes. Si queremos utilizar el mismo modelo -y, por tanto, las mismas características- para hacer predicciones para todo el horizonte de previsión, sólo podemos utilizar los desfases disponibles para predecir todos los días entre D+1 y D+28. Esto significa que si utilizamos la característica de desfase de 1 día para entrenar el modelo, esa variable también tendrá que rellenarse para las predicciones en D+2, D+3, ... y D+28, ya que se refiere a fechas en el futuro.

Aun así, los retrasos son probablemente el características con mayor poder predictivo, por lo que es importante encontrar una forma de sacar el máximo partido a esta información. Hemos considerado 3 opciones para sortear este problema, veamos cómo han funcionado.

Opción 1: Un modelo para todas las semanas

La primera opción es la más obvia. Consiste en utilizar el mismo modelo para realizar predicciones para todas las semanas del horizonte de previsión. Como acabamos de explicar, conlleva una gran restricción: sólo se pueden utilizar las características disponibles para predecir en D+28. Por lo tanto, tenemos que deshacerse de toda la información proporcionada por los 27 rezagos más recientes. Es una pena, ya que los rezagos más recientes son también los más informativos, por lo que hemos considerado otra opción.

Opción 2: Modelos semanales

Esta alternativa consiste en entrenar un modelo LightGBM diferente para cada semana. En el diagrama anterior, cada modelo está aprendiendo de los rezagos posibles más recientes con respecto a la restricción impuesta por su horizonte de predicción. Siguiendo la misma lógica que la opción anterior, significa que cada modelo puede aprovechar todos los rezagos excepto los que son más recientes que el día más lejano para predecir.

Más concretamente:

  • El modelo 1 realiza previsiones para los días 1-7, basándose en todos los retardos excepto los 6 más recientes.
  • El modelo 2 realiza previsiones para los días 8-14, basándose en todos los desfases excepto los 13 más recientes.
  • El modelo 3 realiza previsiones para los días 15-21, basándose en todos los desfases excepto los 20 más recientes.
  • El modelo 4 realiza previsiones para los días 22-28, basándose en todos los retardos excepto los 27 más recientes, igual que en la opción 1.

Este método nos permite aprovechar mejor la información rezagada de las 3 primeras semanas y mejorar así la precisión de las previsiones de nuestra solución. Valió la pena porque era una competición de Kaggle, pero para un proyecto industrializado, también deben tenerse en cuenta cuestiones de complejidad, mantenimiento e interpretabilidad.

De hecho, esta opción podría ser costosa desde el punto de vista informático y, si pretendemos una implantación a escala de todo un país, requeriría mantener cientos de modelos en vivo. En ese caso, habría que evaluar si el incremento de rendimiento es lo suficientemente grande como para justificar esta implementación más compleja.

Opción 3: Modelado recursivo

La última opción también utiliza modelos semanales, pero esta vez de forma recursiva. Modelado recursivo significa que las predicciones generadas para una semana determinada se utilizarán como características de retraso para las semanas siguientes. Esto ocurre secuencialmente: primero realizamos predicciones para la primera semana utilizando todos los rezagos excepto los 6 más recientes. A continuación, predecimos la segunda semana utilizando nuestras predicciones anteriores como rezagos de una semana, en lugar de excluir más rezagos como en la opción 2. Repitiendo el mismo proceso, siempre disponemos de rezagos recientes, incluso para las semanas 3 y 4, lo que nos permite aprovechar esta información para entrenar los modelos.

Merece la pena probar este método, pero tenga en cuenta que es bastante inestable ya que los errores se extienden de una semana a otra. Si el modelo de la primera semana comete errores importantes, estos errores serán tomados como la verdad por el siguiente modelo, que entonces tendrá inevitablemente malos resultados, y así sucesivamente. Por eso decidimos quédese con la opción 2, que parece ser más fiable.

Garantizar la solidez del modelo con una validación cruzada adecuada: Por qué la validación cruzada es fundamental para las series temporales

En cualquier proyecto de aprendizaje automático, adoptar una estrategia de validación cruzada adecuada es fundamental para simular correctamente la precisión fuera de la muestra, seleccionar bien los hiperparámetros y evitar el sobreajuste. Cuando se trata de pronósticos, esto debe hacerse con cuidado porque existe una dependencia temporal entre las observaciones que debe preservarse. Dicho de otro modo, queremos evitar que el modelo mire hacia el futuro cuando lo entrenamos.

El periodo de validación durante el que se prueba el modelo también tiene una mayor importancia cuando se trata de series temporales. El rendimiento del modelo y el conjunto óptimo de hiperparámetros pueden variar mucho en función del periodo durante el que se entrene y se pruebe el modelo. Por lo tanto, nuestro objetivo es encontrar qué parámetros tienen más probabilidades de maximizar el rendimiento no durante un periodo aleatorio, sino durante el periodo que queremos pronosticar, es decir, las próximas 4 semanas.

Adaptar el proceso de validación al problema en cuestión

Para lograr ese objetivo, hemos seleccionado 5 conjuntos de validación que fueron relevantes para el periodo de predicción. El diagrama siguiente muestra cómo se distribuyen en el tiempo. Para cada pliegue de validación cruzada, el modelo se entrena con varias combinaciones de parámetros en el conjunto de entrenamiento y se evalúa en el conjunto de validación utilizando el error cuadrático medio.

Los pliegues 1, 2 y 3 pretenden identificar los parámetros que habrían maximizado el rendimiento en periodos recientes, básicamente en los últimos 3 meses. El problema es que estos 3 meses pueden tener especificidades diferentes a las del próximo periodo que queremos pronosticar. Por ejemplo, imaginemos que las tiendas lanzaron una gran temporada de promociones durante los últimos meses, y que acaba de terminar hoy.

Estos ascensos probablemente repercutirían en el comportamiento del modelo, pero sería arriesgado basarse sólo en estos periodos recientes para afinarlo, ya que no es representativo de lo que va a ocurrir después.

Para mitigar este riesgo, también hemos incluido los pliegues 4 y 5, que corresponden al periodo de previsión desplazado respectivamente 1 y 2 años. Es probable que estos periodos sean similares porque el problema tiene una fuerte estacionalidad anual, lo que suele ocurrir en el comercio minorista. En caso de que tuviéramos una periodicidad diferente, podríamos elegir cualquier estrategia de validación cruzada que tenga más sentido desde el punto de vista empresarial. Al final, hemos seleccionado la combinación de hiperparámetros con el error más bajo sobre los 5 pliegues para entrenar el modelo final.

Resultados

Las diferentes técnicas mencionadas nos permitieron llegar a un 0,59 RMSSE ponderado - la métrica utilizada en Kaggle- que equivale a una precisión de previsión ponderada de 82,8%. El gráfico siguiente resume el rendimiento incremental generado por cada paso:

Estas cifras son indicativas: la precisión incremental también depende del orden en que se aplique cada paso.

Principales conclusiones

Hemos aprendido mucho de este reto gracias a las ideas compartidas por los participantes y esperamos que a usted también le haya servido para reflexionar. Éstos son nuestros puntos clave:

  • Trabaje con un subconjunto pequeño pero representativo de data para iterar rápidamente.
  • Tenga mucho cuidado con las fugas data en el proceso de ingeniería de características: asegúrese de que todas las características que calcule estarán disponibles en el momento de la predicción.
  • Seleccione una arquitectura de modelo que le permita aprovechar al máximo los retrasos, pero tenga también en cuenta las consideraciones de complejidad si está dispuesto a pasar a la producción.
  • Establezca una estrategia de validación cruzada adaptada a su problema empresarial para evaluar correctamente el rendimiento de sus experimentos.

Muchas gracias por leer hasta aquí y no dude en ponerse en contacto con nosotros si tiene algún comentario sobre el tema.

Este artículo se publicó por primera vez en el Artefact Tech Blog en Medium.