Challenge Intermarché : Prédiction des volumes de ventes des produits de grande consommation

Publié le 29 juin 2021
10 minutes de lecture
Image de Kenny Eliason sur Unsplash

En science des données, les compétitions permettent à la communauté de Data Scientist d’échanger et d’apprendre sur les solutions offrant les meilleures performances. La prédiction des ventes est l’une des solutions d’intelligence artificielle que nous proposons chez OpenStudio. Ainsi, cet article présente notre participation au concours Intermarché et les approches que nous utiliserons afin d’améliorer les performances de nos modèles prédictifs.

Contexte et objectif

OpenStudio propose un module de prédiction (ventes, chiffre d’affaires, etc) dans le projet Thelia AI. Afin de tester différentes méthodes et d’approfondir notre expertise sur ce sujet, nous avons décidé de participer au challenge Intermarché sur la prédiction des volumes de ventes.

Ce challenge consistait à fournir un modèle prédictif permettant d’estimer les volumes de ventes journaliers réalisés par différents points de vente, pour divers produits de grande consommation (hors produits frais ou à poids variable). Le modèle devait pouvoir prédire ces volumes sur un horizon de 3 mois à la maille jour. Nous devions restituer des modèles susceptibles d’être industrialisés à l’échelle et généralisables à d’autres produits et points de vente.

Les données disponibles

Nous disposions d’une base d’apprentissage contenant les ventes journalières et d’une sélection de produits réalisée selon un échantillon de points de vente sur l’année 2018. Les algorithmes étaient évalués par rapport aux volumes réalisés sur le premier trimestre 2019.

Nous avions à notre disposition un historique des ventes journalières de 2500 produits de grande consommation, réalisées dans 149 points de vente Intermarché localisés en France, en 2018. Les données des ventes étaient accompagnées des tables contenant les caractéristiques des points de vente, des produits et des prix :

  • La région d’implantation du point de vente ;
  • le nombre de caisses du point de vente ;
  • la surface du point de vente ;
  • le libellé du rayon auquel appartient le produit ;
  • le libellé de la famille du produit ;
  • le libellé anonymisé de la sous-famille du produit ;
  • la fourchette de prix unitaire.

Extraction de connaissances

Il était interdit d’utiliser des données autres que celles fournies dans le cadre du challenge : incorporer la météo n’était par exemple pas autorisé. Nous avons donc créé d’autres variables à partir des informations dont nous disposions. En effet, à partir des dates calendaires, nous avons pu extraire de nombreuses caractéristiques, qui ont permis d’améliorer la qualité des prédictions pour chaque jour. Cette technique de « feature engineering » a créé les variables suivantes :

  • Le mois,
  • Le jour du mois,
  • La semaine,
  • Le jour de la semaine,
  • Les jours fériés,
  • Le type de vacances scolaires (hiver, printemps, été, automne, fin d’année).

Sélection de variables

Ces variables ont été sélectionnées judicieusement grâce à un processus de sélection adapté. Cette méthode consiste à rechercher un modèle parcimonieux assurant un bon équilibre entre la qualité de l’ajustement et la variance des paramètres, afin de minimiser le risque empirique. Pour cela, on commence par un modèle complet avec toutes les variables. Puis, on supprime une à une les variables, ainsi, un nouveau modèle est considéré. La procédure est arrêtée dès qu’il n’y a plus d’amélioration de la qualité des prédictions.

Ces travaux ont abouti à la sélection des variables ci-dessus, mais ont aussi permis d’en supprimer d’autres, qui dégradaient les prédictions. Par exemple, la variable binaire week-end (samedi + dimanche) n’était pas pertinente car les volumes les plus conséquents de la semaine sont vendus le samedi, et inversement, les minimums de la semaine, le dimanche. La présence de la variable jour de la semaine est donc suffisante.

La principale difficulté du challenge est de trouver les jours pour lesquels un magasin n’a enregistré aucune vente pour un produit donné. En effet, Intermarché ne fournit pas d’enregistrements pour lesquels la variable cible (quantité) est égale à 0. Nous avons trouvé que l’ajout des zéros, lorsqu’une paire de vente (magasin/article) n’existait pas, améliore les performances prédictives de nos modèles d’environ 18 %.

Prétraitement des données

Après avoir constitué notre base de données, nous avons prétraité l’ensemble de ces données. Celles-ci étant toutes catégorielles/qualitatives, leur transformation en données numériques est nécessaire pour être interprétable par un algorithme d’intelligence artificielle.

  • Pour des variables à forte modalité (supérieur à 20), nous appliquons le label encoding. Cette transformation consiste à affecter un nombre à une modalité. Ainsi, il y aura n nombres pour les n catégories.
  • Pour les variables à faible modalité (inférieur à 20), nous appliquons le one-hot encoding. Cette transformation consiste à encoder une variable à n états sur n bits dont un seul prend la valeur 1, le numéro du bit valant 1 étant le numéro de l’état pris par la variable. Ainsi, il y aura n variables pour les n catégories.
Exemple de transformations Label et One-Hot encoding
  • La variable cible est celle que l’on cherche à prédire, c’est-à-dire le volume de ventes. Nous avons transformé cette variable numérique en la rendant centrée et réduite par la formule suivante. Ici, \mu est l’espérance (estimation de la moyenne) et \sigma est l’écart-type de la variable cible X.
X = \frac{X-\mu}{\sigma}

Choix de la méthode d’intelligence artificielle

Nous avons pensé à trois approches pour réaliser le challenge Intermarché :

  • Une première, qui considère chaque couple magasin/produit comme une série temporelle. Cette approche n’était finalement pas envisageable, car de nombreux produits ne sont disponibles à la vente qu’une partie de l’année. Par ailleurs, nous n’avons constaté que très peu de saisonnalité sur les produits quotidiens. Il n’y a donc pas intérêt à utiliser des modèles LSTM ou ARIMA, par exemple. Cette approche aurait potentiellement été réalisable si les produits frais étaient disponibles.
  • Une seconde, avec un double modèle. D’abord, un modèle classifieur qui prédit si, pour un triplet magasin/produit/date, une vente a eu lieu ou pas. Nous appliquons ensuite un deuxième modèle régressif afin d’estimer le volume vendu, si la vente a été prédite par le classifieur. Après plusieurs tests, nous avons constaté que cette méthode est environ 16 % moins efficace que la méthode du modèle unique présenté ci-dessous.
  • Une approche avec un modèle unique qui, pour le triplet magasin/produit/date, prédit directement le volume de ventes, en considérant que la quantité zéro signifie une non-vente. C’est en utilisant cette méthode que nous avons obtenu les meilleurs résultats.

Modèle du Gradient Boosting

Les algorithmes de gradient boosting sont les techniques les plus puissantes pour construire des modèles prédictifs. Ce modèle, très utilisé dans les compétitions de Data Science, est une technique de machine learning qui produit un modèle de prédiction sous la forme d’un ensemble de modèles de prédiction faibles (généralement des arbres de décision).

L’algorithme de gradient boosting fonctionne avec une fonction de perte, des apprenants faibles et un modèle additif.

  • La fonction de perte sert de critère pour déterminer la meilleure solution à un problème d’optimisation. Concrètement, elle associe une valeur à une instance d’un problème d’optimisation. Le but du problème d’optimisation est alors de minimiser ou de maximiser cette fonction jusqu’à l’optimum. Les données des volumes de ventes semblent suivre une loi de Poisson : après plusieurs tests, la fonction de perte qui minimise l’erreur de prédiction est la régression de Poisson, dont la formule est la suivante, \hat{y} étant la valeur prédite et y, la valeur attendue :
L(y, \hat{y})=\frac{1}{N} \sum_{i=0}^{N}\left(\hat{y}_{i}-y_{i} \log \hat{y}_{i}\right)
  • Les arbres de décision sont utilisés comme apprenants faible dans le boosting de gradient. Plus précisément, on utilise des arbres de régression qui produisent des valeurs réelles pour les divisions et dont les résultats peuvent être additionnés. Cela permet d’ajouter les résultats des modèles suivants et de « corriger » les résidus dans les prédictions. Il est courant de contraindre les apprenants faibles de manière spécifique, comme un nombre maximal de couches, de nœuds, de divisions ou de nœuds feuilles. Cela permet de s’assurer que les apprenants restent faibles et d’éviter le sur-apprentissage du modèle.
  • Les arbres sont ajoutés un par un, et les arbres existants dans le modèle ne sont pas modifiés. Une procédure de descente de gradient est utilisée pour minimiser la perte lors de l’ajout d’arbres. Traditionnellement, la descente de gradient est utilisée pour minimiser un ensemble de paramètres tels que les coefficients d’une équation de régression ou les poids d’un réseau neuronal. Après avoir calculé l’erreur ou la perte, les poids sont mis à jour pour minimiser cette erreur. Au lieu de paramètres, nous avons des sous-modèles d’apprenants faibles ou plus précisément des arbres de décision. Après avoir calculé la perte, pour exécuter la procédure de descente du gradient, nous devons ajouter un arbre au modèle, qui réduit la perte (c’est-à-dire suivre le gradient). Pour ce faire, nous paramétrons l’arbre, puis nous en modifierons les paramètres afin d’aller dans la bonne direction, en réduisant la perte résiduelle. Cette approche est généralement appelée descente de gradient. La sortie du nouvel arbre est ensuite ajoutée à la sortie de la séquence d’arbres existants, dans le but de corriger ou d’améliorer la sortie finale du modèle. Un nombre fixe d’arbres est ajouté ou l’apprentissage s’arrête une fois que la perte a diminué.
Fonctionnement de l’algorithme du Gradient Boosting

Implémentation et paramétrisation

Il existe plusieurs implémentations du Gradient Boosting en Python. Les librairies les plus connues sont Scikit-Learn, XGBoost, LightGBM et CatBoost. Dans le cadre de ce challenge, nous avons testé ces quatre librairies, qui ont fourni des qualités de prédictions quasi-similaires. Cependant, nous avons privilégié la librairie LightGBM pour une légère meilleure performance prédictive, mais surtout pour sa rapidité de calcul, afin de tester rapidement plusieurs paramétrisations.

En machine learning, l’optimisation ou le réglage des paramètres est le choix d’un ensemble de paramètres optimaux pour un algorithme d’apprentissage. L’optimisation tente de trouver une combinaison de paramètres produisant un modèle optimal, qui minimise une fonction de perte prédéfinie sur des données indépendantes. La validation croisée est utilisée pour estimer cette performance de généralisation. Ainsi, l’objectif de cette analyse est de déterminer le tuple de paramètre permettant d’obtenir la meilleure perte de la fonction objective, sans avoir de problème de sur-apprentissage (overfitting).

Afin de paramétrer notre modèle LigthGBM du gradient boosting, nous avons sélectionné notre paramétrisation en effectuant une recherche sur grille avec la fonction sklearn GridSearchCV. Les paramètres généraux du Gradient Boosting peuvent se catégoriser en deux groupes :

  • Les paramètres spécifiques aux arbres de décision du modèle influencent les performances et évitent le sur-apprentissage. Cela permet de contrôler l’overfit, car une profondeur plus élevée permettrait au modèle d’apprendre des relations très spécifiques à un échantillon particulier. Il existe une multitude d’autres paramètres spécifiques aux arbres. Nous avons concentré nos recherches sur la profondeur des arbres (max_depth) et le nombre d’échantillons dans les feuilles (min_samples_split), qui sont de bons paramètres pour contrôler le risque d’overfitting du modèle sur l’échantillon d’apprentissage.
Quelques paramètres spécifiques aux arbres de décision
  • Pour les paramètres spécifiques au boosting, nous avons fait une recherche sur grille sur les trois principaux paramètres du boosting :
    • Le “n_estimators”, qui est le nombre d’arbres à modéliser. Le modèle est assez robuste pour un plus grand nombre d’arbres, mais il peut devenir synonyme d’overfitting. Par conséquent, il est important de trouver le juste milieu entre performance et overfitting, d’où un réglage de ce paramètre en utilisant des cross validation. Le plus simple est l’utilisation de l’option « early_stop » qui stoppera l’itération lorsque l’erreur sur l’échantillon de test/validation augmentera.
    • Le “subsample” est la proportion des observations à sélectionner pour chaque arbre. La sélection se fait par échantillonnage aléatoire. Des valeurs légèrement inférieures à 1 rendent le modèle robuste et évitent l’overfitting.
    • Le “learning_rate” détermine l’impact de chaque arbre sur le résultat final. En effet, le Gradient Boosting commence par une initialisation de ces estimations, qui est mise à jour en utilisant la sortie de chaque arbre. Le paramètre d’apprentissage contrôle l’ampleur de ce changement dans les estimations. De plus, ce paramètre permet au modèle d’éviter l’overfit, mais aussi de bien généraliser.

Évaluation des prédictions

Dans ce challenge, les soumissions ont été évaluées sur la base de l’erreur RMSLE (Root Mean Squared Logarithmic Error) :

\text { RMSLE }=\sqrt{\frac{1}{n} \sum_{i=1}^{n}\left(\log \left(\hat{y}_{i}+1\right)-\log \left(y_{i}+1\right)\right)^{2}}

Où :

  • n est le nombre de prédictions attendues
  • \hat{y} est la prédiction du volume de ventes
  • y est le volume réel de ventes

L’évaluation s’applique uniquement aux prédictions attendues, c’est-à-dire, pour lesquelles au moins une vente réelle (du produit par le point de vente en question) est bien constatée le jour même ou dans les six jours précédents. Dans le cas contraire, la prédiction n’est pas pénalisée et n’entrera pas dans le calcul du score. Notre interprétation des six jours précédents serait que le produit prédit n’était finalement pas disponible à l’achat (rupture de stock par exemple).

Nous avons finalement entraîné notre modèle sur toute l’année 2018, excepté le mois de décembre. Nous avons en effet constaté, après plusieurs tests et fouilles de données, que le mois de décembre a un comportement très particulier, qui s’explique par les fêtes de fin d’année. Dans ce challenge, nous étions évalués sur les trois premiers mois de 2019. Ainsi, un entraînement sur le mois de décembre 2018 dégradait la qualité des prédictions.

Quelles ont été les approches pour de meilleurs résultats sur ce challenge ?

L’avantage de ces concours de Data Science est le partage d’idées et de connaissances. La communauté soumet ses prédictions et un classement est établi selon le critère d’évaluation RMSLE. À la fin du concours, les meilleurs data scientists partagent leurs méthodes, ainsi que leur code, pour résoudre les problématiques du concours. Ce partage de connaissance est très enrichissant pour apprendre les techniques les plus performantes et récentes.

Les data scientists étant arrivés premier, troisième et quatrième ont partagé leurs codes. Nous avons ainsi identifié des similitudes avec notre approche, mais aussi des différences susceptibles d’expliquer leurs meilleurs résultats.

  • Les trois participants ont utilisé le même modèle que nous : un gradient boosting avec LightGBM. Le premier au classement a fait une moyenne du résultat du LightGBM avec le résultat d’un réseau de neurones multicouches. Ces méthodes de bagging améliorent généralement la stabilité et la précision des algorithmes de machine learning.
  • Certains ont utilisé plusieurs modèles de LightGBM. Par exemple, le premier a créé un modèle pour chaque jour de la semaine. Cela signifie qu’il a entraîné un modèle sur chacun des volumes de ventes des lundis de l’année 2018 afin de prédire les lundis de 2019, et de même pour les autres jours de la semaine. Cette approche s’est aussi révélée efficace en réalisant un modèle par tranche de prix, par magasin, par produit, etc.
  • Le prétraitement de la variable cible s’est fait par une transformation logarithmique. En effet, la fonction f(x) = log( 1 + x) a été appliquée sur la variable cible pour entraîner leurs modèles.
  • En plus d’avoir implémenté la métrique d’évaluation RMSLE, certains des participants ont pris en considération qu’une partie de leur prédiction n’est pas évaluée pendant le défi. En effet, l’évaluation s’applique uniquement aux ventes réelles constatées le jour même ou dans les six jours précédents. Ainsi, la prédiction n’est pas pénalisée et n’entrera pas dans le calcul du score.
  • Lors de la création des variables de feature engineering, nous n’avions pas fait d’extraction de connaissance à partir des volumes de ventes constatés en 2018. Or, pour obtenir de meilleurs résultats, la création de variables comme la moyenne des ventes par catégorie (exemple : par magasin, produit, tranche de prix, etc) ont considérablement amélioré la qualité des prédictions. D’autres mesures, comme la médiane, l’écart-type ou des déciles des volumes de ventes ont été créées, puis une sélection de variables a été réalisée pour ne conserver que les variables informatives.

Notre participation au challenge Intermarché sur la prédiction des volumes de ventes nous permettra d’améliorer les performances de nos prédictions pour les sites de e-commerces équipés de TheliaAI. Toutes ces nouvelles méthodologies et idées enrichissantes pourront en effet être implémentées dans nos solutions IA. Nous remercions les équipes Data d’Intermarché pour l’organisation de ce challenge enrichissant.