5. Februar 2021
In diesem Artikel fasst Data-Wissenschaftler Maxime Lutel seine Erkenntnisse aus dem M5-Wettbewerb für Umsatzprognosen zusammen, bei dem es darum ging, die zukünftigen Umsätze in mehreren Walmart-Filialen vorherzusagen. Er führt Sie durch unsere Lösung und erläutert, welches maschinelle Lernmodell für diese Aufgabe am besten geeignet war.

Mit maschinellem Lernen die geschäftlichen Herausforderungen des Einzelhandels lösen

Genaue Absatzprognosen sind für Einzelhandelsunternehmen entscheidend, um die benötigte Menge zum richtigen Zeitpunkt zu produzieren. Aber auch wenn die Vermeidung von Verschwendung und Knappheit eines ihrer Hauptanliegen ist, haben Einzelhändler noch viel Raum für Verbesserungen. Zumindest denken das die Mitarbeiter von Walmart, die im März 2020 einen offenen data-Wissenschaftswettbewerb gestartet haben. der M5 Wettbewerb - um zu sehen, wie sie ihre Prognosemodelle verbessern können.

Ziel des Wettbewerbs war die Vorhersage zukünftiger Verkäufe auf Produktebene, basierend auf historischen data. Mehr als 5000 Teams von data-Liebhabern und Prognoseexperten haben monatelang über die Methoden, Funktionen und Modelle diskutiert, die am besten geeignet sind, um dieses bekannte Problem des maschinellen Lernens zu lösen. Diese Debatten haben einige wiederkehrende Probleme aufgezeigt, die bei fast allen Prognoseprojekten auftreten. Und, was noch wichtiger ist, sie brachten eine Vielzahl von Ansätzen hervor, um sie zu lösen.

Dieser Artikel versucht, einige Informationen zusammenzufassen Die wichtigsten Erkenntnisse, die sich aus der Herausforderung ergeben haben. Bei Artefact glauben wir an "Learning by doing", also haben wir beschlossen, einen Versuch zu wagen und unsere eigene Lösung zu programmieren, um dies zu veranschaulichen. Lassen Sie uns nun die gesamte Prognose-Pipeline durchgehen und unterwegs anhalten, um zu verstehen, was funktioniert hat und was nicht.

Problemstellung: Hierarchische Zeitreihenprognose

Das dataset enthält historische 5-Jahres-Verkäufe von 2011 bis 2016 für verschiedene Produkte und Geschäfte. Es enthält einige zusätzliche Informationen, wie Verkaufspreise und Kalenderereignisse. Data ist hierarchisch aufgebaut: Die Filialen sind in 3 Staaten unterteilt und die Produkte sind nach Kategorien und Unterkategorien gruppiert.

Unsere Aufgabe ist es Vorhersage der Umsätze für alle Produkte in jeder Filiale, an den Tagen direkt nach dem verfügbaren dataset. Das bedeutet, dass für jeden Tag des Prognosehorizonts 30 490 Prognosen erstellt werden müssen.

Diese Hierarchie wird unsere Modellierungsentscheidungen leiten, denn die Interaktionen innerhalb von Produktkategorien oder Geschäften enthalten sehr nützliche Informationen für Vorhersagezwecke. Artikel in denselben Geschäften und Kategorien können nämlich eine ähnliche Umsatzentwicklung aufweisen oder sich im Gegenteil gegenseitig kannibalisieren. Daher werden wir jede Stichprobe durch Merkmale beschreiben, die diese Interaktionen erfassen, und dem maschinellen Lernen den Vorzug vor traditionellen Prognosen geben, um diese Informationen beim Training des Modells zu berücksichtigen.

Zwei große Herausforderungen: intermittierende Werte und ein erweiterter Vorhersagehorizont

In diesem Stadium denken Sie vielleicht, dass es sich um ein ganz gewöhnliches Prognoseproblem handelt. Sie haben Recht und genau deshalb ist es interessant: Es kann sich auf eine Vielzahl anderer Projekte beziehen, auch wenn jede Branche ihre eigenen Merkmale hat. Allerdings weist diese Herausforderung 2 wichtige Besonderheiten auf, die die Aufgabe schwieriger machen als erwartet.

Die erste ist, dass die Zeitreihen, mit denen wir arbeiten, viele intermittierende Werte aufweisen, d.h. lange Zeiträume von aufeinanderfolgenden Tagen ohne Verkäufe, wie in der folgenden Grafik dargestellt. Dies könnte auf Lagerausfälle oder begrenzte Regalflächen in den Geschäften zurückzuführen sein. In jedem Fall erschwert dies die Aufgabe, da der Fehler in die Höhe schießt, wenn die Verkäufe auf einem regelmäßigen Niveau vorhergesagt werden, während das Produkt nicht in den Regalen liegt.

Die zweite kommt von der Aufgabe selbst, genauer gesagt von der Größe des Vorhersagehorizonts. Die Wettbewerber müssen Prognosen nicht nur für die nächste Woche, sondern für einen Zeitraum von 4 Wochen erstellen. Würden Sie sich lieber auf die Wettervorhersage für den nächsten Tag oder für 1 Monat verlassen? Das Gleiche gilt für die Absatzprognose: Ein längerer Prognosehorizont macht das Problem komplexer, da die Unsicherheit mit der Zeit zunimmt.

Feature Engineering - Modellierung der verkaufsfördernden Faktoren

Jetzt, da wir die Aufgabe verstanden haben, können wir mit der Berechnung von Merkmalen beginnen, die alle Phänomene modellieren, die die Umsatzentwicklung beeinflussen könnten. Das Ziel besteht darin, jedes Triplett Tag x Produkt x Geschäft durch eine Reihe von Indikatoren zu beschreiben, die die Auswirkungen von Faktoren wie Saisonalität, Trends oder Preisgestaltung erfassen.

Saisonalität

Anstatt das Verkaufsdatum direkt als Prädiktor zu verwenden, ist es in der Regel sinnvoller, es in mehrere Merkmale zu zerlegen, um die Saisonalität zu charakterisieren: Jahr, Monat, Wochennummer, Tag der Woche... Letzteres ist besonders aufschlussreich, weil das Problem eine starke wöchentliche Periodizität aufweist: Die Verkaufsmengen sind an den Wochenenden größer, wenn die Menschen mehr Zeit in den Supermärkten verbringen.

Kalender Ereignisse wie Feiertage oder das NBA-Finale haben ebenfalls einen starken saisonalen Einfluss. Für jedes Ereignis wurde ein Merkmal mit den folgenden Werten erstellt:

  • Negative Werte für die 15 Tage vor dem Ereignis (-15 bis -1)

  • 0 am D-Tag

  • Positive Werte für die 15 Tage nach dem Ereignis (1 bis 15)
  • Kein Wert für Zeiträume, die mehr als 15 Tage vor dem Ereignis liegen

Die Idee ist, die saisonalen Auswirkungen nicht nur am D-Day, sondern auch davor und danach zu modellieren. Zum Beispiel wird ein Produkt, das häufig als Weihnachtsgeschenk angeboten wird, in den Tagen davor eine Verkaufsspitze und direkt danach einen Rückgang erleben.

Trends

Die jüngsten Trends liefern auch nützliche Informationen über zukünftige Verkäufe und werden dank der Lag-Funktionen. Eine Verzögerung ist der Wert der Zielvariablen, der um einen bestimmten Zeitraum verschoben wird. Für einen bestimmten Artikel in einem bestimmten Geschäft wäre der 1-Wochen-Verzögerungswert der Umsatz, der vor einer Woche für diesen Artikel und dieses Geschäft erzielt wurde. Es können verschiedene Verschiebungswerte berücksichtigt werden, und es wird auch der Durchschnitt mehrerer Verzögerungen berechnet, um robustere Prädiktoren zu erhalten. Verzögerungen können auch für aggregierte Umsätze berechnet werden, um globalere Trends zu erfassen, z. B. auf Ebene der Filiale oder der Produktkategorie.

Preisgestaltung

Der Preis eines Produkts kann sich von einem Geschäft zum anderen und sogar von einer Woche zur anderen innerhalb desselben Geschäfts ändern. Diese Schwankungen haben einen starken Einfluss auf den Verkauf und sollten daher durch einige Merkmale beschrieben werden. Anstelle von absoluten Preisen, relative Preisunterschiede zwischen relevanten Produkten erklären eher die Umsatzentwicklung. Aus diesem Grund wurden die folgenden Prädiktoren berechnet:

  • Relative Differenz zwischen dem aktuellen Preis eines Artikels und seinem historischen Durchschnittspreis, um die Wirkung von Werbeangeboten hervorzuheben.
  • Relative Preisdifferenz zum gleichen Artikel in anderen Geschäften, um zu verstehen, ob das Geschäft einen attraktiven Preis hat oder nicht.
  • Relative Preisdifferenz zu anderen Artikeln, die im gleichen Geschäft und in der gleichen Produktkategorie verkauft werden, um gewisse Kannibalisierungseffekte zu erfassen.

Kodierung kategorischer Variablen

Kategorische Variablen wie das Bundesland, das Geschäft, der Produktname oder die Kategorie haben ebenfalls eine hohe Vorhersagekraft. Diese Informationen müssen in Features kodiert werden, damit das Modell die dataset-Hierarchie nutzen kann. Die One-Hot-Kodierung ist hier keine Option, da einige dieser kategorischen Variablen eine sehr hohe Kardinalität aufweisen (3049 unterschiedliche Produkte). Stattdessen haben wir eine geordnete Zielkodierung, was bedeutet, dass jede Beobachtung durch den durchschnittlichen Umsatz vergangener Beobachtungen mit demselben kategorischen Wert kodiert wird. Das dataset ist bei dieser Aufgabe nach Zeit geordnet, um data-Lecks zu vermeiden.

Alle kategorialen Variablen und einige ihrer Kombinationen wurden mit dieser Methode kodiert. Dies führt zu sehr informativen Merkmalen, von denen das beste die Kodierung der Kombination von Produkt und Geschäft ist. Wenn Sie mit anderen Kodierern experimentieren möchten, finden Sie eine breite Palette von Methoden Hier.

Tweedie-Verlust bei intermittierenden Werten

Es gibt verschiedene mögliche Strategien, um mit dem Problem der intermittierenden Werte umzugehen. Einige Teilnehmer haben sich dafür entschieden, 2 getrennte Modelle zu erstellen: eines, um vorherzusagen, ob das Produkt an einem bestimmten Tag verfügbar sein wird oder nicht, und ein zweites, um die Verkäufe zu prognostizieren. Wie viele andere haben auch wir uns für eine andere Option entschieden, nämlich die Verwendung einer an das Problem angepassten Zielfunktion: die Tweedie Verlust.

Ohne auf die mathematischen Details einzugehen, lassen Sie uns versuchen zu verstehen, warum diese Verlustfunktion für unser Problem geeignet ist, indem wir die Umsatzverteilung im Training data und die Tweedie-Verteilung vergleichen:

Sie sehen recht ähnlich aus und haben beide Werte, die sich um 0 herum konzentrieren. Wenn Sie den Tweedie-Verlust als Zielfunktion festlegen, wird das Modell im Grunde dazu gezwungen maximieren Sie die Wahrscheinlichkeit dieser Verteilung und damit die richtige Anzahl von 0s vorhersagen. Außerdem verfügt diese Verlustfunktion über einen Parameter - dessen Werte zwischen 1 und 2 liegen -, der an die Verteilung des vorliegenden Problems angepasst werden kann:

Ausgehend von unserer dataset-Verteilung können wir davon ausgehen, dass der optimale Wert zwischen 1 und 1,5 liegt, aber um genauer zu sein, werden wir diesen Parameter später mit einer Kreuzvalidierung abstimmen. Diese Zielfunktion ist auch für andere Gradient-Boosting-Modelle wie XGBoost oder CatBoost verfügbar, so dass es sich auf jeden Fall lohnt, sie auszuprobieren, wenn Sie mit intermittierenden Werten zu tun haben.

Wie kann man 28 Tage im Voraus prognostizieren? Das Beste aus den Lag-Funktionen machen

Wie oben erläutert, sind die Verzögerungsmerkmale um einen bestimmten Zeitraum verschobene Umsätze. Ihre Werte hängen also davon ab, wo Sie im Prognosehorizont stehen. Die an einem bestimmten Tag D getätigten Verkäufe können als 1-Tages-Verzögerung betrachtet werden, wenn Sie einen Tag im Voraus prognostizieren, oder als 28-Tages-Verzögerung, wenn Sie 28 Tage im Voraus prognostizieren. Das folgende Diagramm veranschaulicht diesen Punkt:

Dieses Konzept ist wichtig, um zu verstehen, welche Funktionen zum Zeitpunkt der Vorhersage verfügbar. Hier befinden wir uns am Tag D und möchten den Umsatz für die nächsten 28 Tage prognostizieren. Wenn wir dasselbe Modell - und damit dieselben Merkmale - für Vorhersagen für den gesamten Prognosehorizont verwenden möchten, können wir nur Lags verwenden, die für die Vorhersage aller Tage zwischen D+1 und D+28 zur Verfügung stehen. Das bedeutet, wenn wir das Merkmal 1-Tages-Lag verwenden, um das Modell zu trainieren, muss diese Variable auch für Vorhersagen an D+2, D+3, ... und D+28 gefüllt werden, während sie sich auf Daten in der Zukunft bezieht.

Dennoch sind Verzögerungen wahrscheinlich die Merkmale mit der größten Vorhersagekraft, Daher ist es wichtig, einen Weg zu finden, diese Informationen optimal zu nutzen. Wir haben 3 Optionen in Betracht gezogen, um dieses Problem zu umgehen. Lassen Sie uns sehen, wie sie abgeschnitten haben.

Option 1: Ein Modell für alle Wochen

Die erste Option ist die offensichtlichste. Sie besteht darin, dasselbe Modell zu verwenden, um Vorhersagen für alle Wochen des Prognosehorizonts zu treffen. Wie wir soeben erläutert haben, ist dies mit einer großen Einschränkung verbunden: Es können nur die Merkmale verwendet werden, die für die Vorhersage von T+28 verfügbar sind. Daher müssen wir alle Informationen aus den 27 letzten Lags loswerden. Das ist schade, denn die jüngsten Lags sind auch die informativsten, so dass wir eine andere Option in Betracht gezogen haben.

Option 2: Wöchentliche Modelle

Diese Alternative besteht darin, für jede Woche ein anderes LightGBM-Modell zu trainieren. Im obigen Diagramm lernt jedes Modell von den jüngsten möglichen Lags in Bezug auf die Einschränkung, die durch seinen Vorhersagehorizont auferlegt wird. Nach der gleichen Logik wie bei der vorherigen Option bedeutet dies, dass jedes Modell alle Lags nutzen kann, mit Ausnahme derer, die neuer sind als der am weitesten entfernte Tag, den es vorherzusagen gilt.

Genauer gesagt:

  • Modell 1 erstellt Vorhersagen für die Tage 1-7 und stützt sich dabei auf alle Verzögerungen außer den 6 jüngsten.
  • Modell 2 erstellt Vorhersagen für die Tage 8-14 und stützt sich dabei auf alle Verzögerungen außer den 13 jüngsten.
  • Modell 3 macht Vorhersagen für die Tage 15-21 und stützt sich dabei auf alle Verzögerungen außer den 20 jüngsten.
  • Modell 4 erstellt Vorhersagen für die Tage 22-28 und stützt sich dabei auf alle Verzögerungen außer den 27 jüngsten, genau wie bei Option 1.

Mit dieser Methode können wir die Verzögerungsinformationen für die ersten 3 Wochen besser zu nutzen und damit die Prognosegenauigkeit unserer Lösung zu verbessern. Es hat sich gelohnt, weil es ein Kaggle-Wettbewerb war, aber für ein industrialisiertes Projekt sollten auch Fragen der Komplexität, der Wartung und der Interpretierbarkeit in Betracht gezogen werden.

Diese Option könnte in der Tat sehr rechenintensiv sein, und wenn wir eine landesweite Einführung anstreben, müssten wir Hunderte von Modellen in Echtzeit pflegen. In diesem Fall wäre zu prüfen, ob der Leistungszuwachs groß genug ist, um diese komplexere Implementierung zu rechtfertigen.

Option 3: Rekursive Modellierung

Die letzte Option verwendet ebenfalls Wochenmodelle, aber diesmal auf rekursive Weise. Rekursive Modellierung bedeutet, dass Vorhersagen, die für eine bestimmte Woche erstellt wurden, als Verzögerungsmerkmale für die folgenden Wochen verwendet werden. Dies geschieht sequentiell: Wir machen zunächst Prognosen für die erste Woche, indem wir alle Verzögerungen außer den 6 jüngsten verwenden. Dann prognostizieren wir Woche 2, indem wir unsere vorherigen Prognosen als 1-wöchige Lags verwenden, anstatt weitere Lags wie in Option 2 auszuschließen. Indem wir den gleichen Prozess wiederholen, erhalten wir immer die jüngsten Lags, auch für die Wochen 3 und 4, was uns erlaubt, diese Informationen zum Trainieren der Modelle zu nutzen.

Es lohnt sich, diese Methode zu testen, aber bedenken Sie, dass sie ziemlich instabil, da sich die Fehler von Woche zu Woche ausbreiten. Wenn das Modell der ersten Woche große Fehler macht, werden diese Fehler vom nächsten Modell als Wahrheit angenommen, das dann unweigerlich schlecht abschneidet, und so weiter. Deshalb haben wir beschlossen bleiben Sie bei Option 2, das scheint zuverlässiger zu sein.

Sicherstellung der Robustheit von Modellen mit einer geeigneten Kreuzvalidierung: Warum die Kreuzvalidierung für Zeitreihen entscheidend ist

Bei jedem Projekt zum maschinellen Lernen ist die Anwendung einer geeigneten Kreuzvalidierungsstrategie von entscheidender Bedeutung, um die Genauigkeit außerhalb der Stichprobe korrekt zu simulieren, Hyperparameter sorgfältig auszuwählen und eine Überanpassung zu vermeiden. Bei der Vorhersage muss dies sorgfältig geschehen, denn es besteht eine zeitliche Abhängigkeit zwischen den Beobachtungen, die erhalten bleiben muss. Mit anderen Worten, wir wollen verhindern, dass das Modell in die Zukunft schaut, wenn wir es trainieren.

Der Validierungszeitraum, in dem das Modell getestet wird, ist ebenfalls von großer Bedeutung, wenn es um Zeitreihen geht. Die Leistung des Modells und der optimale Satz von Hyperparametern können je nach dem Zeitraum, in dem das Modell trainiert und getestet wird, stark variieren. Unser Ziel ist es daher, die Parameter zu finden, die am ehesten die Leistung maximieren, und zwar nicht über einen zufälligen Zeitraum, sondern über den Zeitraum, den wir prognostizieren wollen, d.h. die nächsten 4 Wochen.

Anpassen des Validierungsprozesses an das jeweilige Problem

Um dieses Ziel zu erreichen, haben wir 5 Validierungssets ausgewählt, die die für den Vorhersagezeitraum relevant sind. Das Diagramm unten zeigt, wie sie über die Zeit verteilt sind. Für jede Kreuzvalidierung wird das Modell mit verschiedenen Parameterkombinationen auf dem Trainingssatz trainiert und auf dem Validierungssatz anhand des mittleren quadratischen Fehlers bewertet.

Die Folds 1, 2 und 3 zielen darauf ab, die Parameter zu identifizieren, die die Performance in den letzten Perioden, d.h. in den letzten 3 Monaten, maximiert haben. Das Problem ist, dass diese 3 Monate möglicherweise andere Besonderheiten aufweisen als der kommende Zeitraum, den wir prognostizieren möchten. Nehmen wir zum Beispiel an, dass die Geschäfte in den letzten Monaten eine riesige Werbesaison gestartet haben, die erst heute zu Ende geht.

Diese Aktionen würden sich wahrscheinlich auf das Verhalten des Modells auswirken, aber es wäre riskant, sich nur auf diese jüngsten Zeiträume zu verlassen, um das Modell abzustimmen, da dies nicht repräsentativ für die nächsten Ereignisse ist.

Um dieses Risiko abzuschwächen, haben wir auch die Falten 4 und 5 einbezogen, die dem um 1 bzw. 2 Jahre verschobenen Prognosezeitraum entsprechen. Diese Zeiträume sind wahrscheinlich ähnlich, da das Problem eine starke jährliche Saisonalität aufweist, was im Einzelhandel häufig der Fall ist. Hätten wir eine andere Periodizität, könnten wir eine beliebige Kreuzvalidierungsstrategie wählen, die wirtschaftlich sinnvoller ist. Am Ende haben wir die Hyperparameterkombination mit dem geringsten Fehler über die 5 Foldings ausgewählt, um das endgültige Modell zu trainieren.

Ergebnisse

Die verschiedenen oben genannten Techniken ermöglichten es uns, eine 0.59 gewichteter RMSSE - die bei Kaggle verwendete Metrik - was einer gewichteten Vorhersagegenauigkeit von 82,8% entspricht. Das folgende Diagramm fasst die inkrementelle Leistung zusammen, die durch jeden Schritt erzeugt wird:

Diese Zahlen sind Richtwerte: Die inkrementelle Genauigkeit hängt auch von der Reihenfolge ab, in der die einzelnen Schritte ausgeführt werden.

Wichtigste Erkenntnisse

Wir haben dank der Erkenntnisse der Teilnehmer eine Menge aus dieser Herausforderung gelernt und hoffen, dass sie auch Sie zum Nachdenken angeregt hat. Hier sind unsere wichtigsten Erkenntnisse:

  • Arbeiten Sie an einer kleinen, aber repräsentativen Teilmenge von data, um schnell zu iterieren.
  • Achten Sie beim Feature-Engineering sehr genau auf data-Leaks: Stellen Sie sicher, dass alle von Ihnen berechneten Features zum Zeitpunkt der Vorhersage verfügbar sind.
  • Wählen Sie eine Modellarchitektur, die es Ihnen ermöglicht, Verzögerungen so weit wie möglich auszunutzen, aber bedenken Sie auch die Komplexität, wenn Sie in die Produktion gehen wollen.
  • Entwickeln Sie eine Strategie zur Kreuzvalidierung, die an Ihr Geschäftsproblem angepasst ist, um die Leistung Ihrer Experimente korrekt zu bewerten.

Vielen Dank für die Lektüre und zögern Sie nicht, sich zu melden, wenn Sie einen Kommentar zu diesem Thema haben!

Dieser Artikel wurde zuerst auf Artefact Tech Blog auf Medium veröffentlicht.