Dieser Artikel ist in dem kostenlosen Magazin "Data Science in Production" erschienen.
Gestern erwähnte Giovanni, unser Chief Scientist, diese vor kurzem (vor 2 Tagen auf github) veröffentlichte Open-Source-Prognose-API des Core Data Science-Teams von Facebook, und so beschloss ich, sie an einem unserer berühmten GDD-Freitage auszuprobieren.
In Prophet's eigenen Worten: "Prophet ist ein Verfahren zur Vorhersage von Zeitreihendaten. Es basiert auf einem additiven Modell, bei dem nicht-lineare Trends mit jährlicher und wöchentlicher Saisonalität sowie Feiertagen angepasst werden. Es funktioniert am besten mit täglich periodischen Daten mit mindestens einem Jahr historischer Daten. Prophet ist robust gegenüber fehlenden Daten, Verschiebungen im Trend und großen Ausreißern. Eine Erklärung des Prophet-Algorithmus finden Sie in diesem Artikel.
Prophet bietet eine R- und Python-API, ich habe natürlich die Pythton-API verwendet.
Wozu die Mühe?
Die Daten gehören zu einem Kunden, für den bereits Modelle in Produktion sind. Ich wollte sehen, wie sich die Vorhersagen von Prophet verhalten, wenn wir die gleichen Daten verwenden, die wir in einem dieser von Rogier und mir entwickelten Modelle einsetzen.
In Wirklichkeit wird die Vorhersage der Anzahl der Transaktionen in einem Geschäft als Teil eines Ensembles verwendet, um den Verkauf von Produkten vorherzusagen. Da Prophet keine Merkmale akzeptiert, wäre es unfair, einen Vergleich auf dieser Ebene anzustellen, da z.B. der Preis ein sehr wichtiger Faktor ist.
Daten: Transaktionen und Feiertage
Die Daten stammen von einem aktuellen Kunden, daher werde ich keine Details dazu preisgeben.
Unsere Modelle erstellen Prognosen für verschiedene Geschäfte dieses Unternehmens. Ich habe insbesondere 2 Geschäfte genommen, eines, das die am einfachsten vorherzusagenden Transaktionen aller Geschäfte enthält, und ein anderes mit einer etwas komplizierteren Geschichte.
Die Daten bestehen aus echten Transaktionen seit 2014. Die Daten sind täglich, wobei das Ziel die Anzahl der an einem Tag durchgeführten Transaktionen ist. In den Daten fehlen Daten, an denen das Geschäft geschlossen war, zum Beispiel an Neujahr und Weihnachten.
Die für die API bereitgestellten Feiertage sind die gleichen, die ich in unserem Modell verwende. Sie reichen von Schulferien oder großen Zeiträumen bis hin zu einzelnen Feiertagen wie Heiligabend. Insgesamt enthalten die Daten 46 verschiedene Feiertage.
Code
Wenn die Daten in einem guten Format vorliegen (das ist ein großes Wenn), bietet Prophet eine sehr einfach zu verwendende API. Nachdem ich die Daten bereinigt, aggregiert und entsorgt hatte, bestand die Berechnung aus diesen beiden Codeteilen:
def vorhersagen(tseries, vorhersagen_datum, Urlaub=Keine): Modell = Prophet(Urlaub=Urlaub) # Trainieren Sie mit Daten bis 3 Tage vorher Modell.fit(tseries[tseries.ds (vorhersagen_datum - timedelta(Tage=2))]) Prognose = Modell.vorhersagen(Modell.make_future_dataframe(Perioden=5)) return Prognose.Ort[Prognose.ds == vorhersagen_datum, ['ds', 'yhat']] pred = [] pred_holidays = [] für Datum in pd.datum_bereich('2016-1-1', '2016-12-31'): vor.anhängen.(vorhersagen(tseries_shop, Datum)) pred_holidays.anhängen.(vorhersagen(tseries_shop, Datum, Urlaub=Urlaub)) Vorhersagen = pd.zusammenführen(pd.konkaten(vor), pd.konkaten(pred_holidays), auf='ds', wie='inner', Suffixe=('','_hol'))
Die Prognose wird für 2016 mit und ohne Feiertagsdaten erstellt. Unser Produktionsmodell wird täglich über einen Airflow-Auftrag trainiert. Um einen fairen Vergleich zu ermöglichen, trainiere ich ein Prophet-Modell für jedes Datum im Jahr 2016 mit den Daten bis 3 Tage vor dem zu prognostizierenden Datum. Der Grund dafür ist, dass die Bestellung für ein Produkt 2 Tage vorher aufgegeben werden muss, d.h. es werden die bis dahin verfügbaren Daten verwendet.
Prophet hat die volle Kapazität meines Laptops ausgenutzt und alle 8 Kerne verwendet. Die Berechnung dauerte etwa 45 Minuten pro Geschäft, was bedeutet, dass ein einzelner Tag mit oder ohne Urlaub etwa 4 Sekunden dauert.
Metrisch
Die Metrik, die ich zur Messung der Prognoseleistung verwendet habe, ist das Bestimmtheitsmaß ((R^2)-Wert ). Der
Einfach einkaufen: Widushop
Unter Verwendung von Vincents großartigem Pokemon-Namensgenerator werde ich diesen Shop Widushop nennen. Dies sind die Transaktionsdaten für die letzten 3 Jahre,
Das Bild zeigt jedes Jahr ein sehr ähnliches Muster. Es zeigt auch einige Tage, die definitiv Feiertage sind, an denen die Transaktionen drastisch ab- oder zunehmen.
Prophet erstellt eine sehr genaue Vorhersage, sie erreicht 0,89 ohne Feiertage und 0,94 mit Feiertagen. Unten zeige ich einen Vergleich zwischen den Transaktionen (Wahrheit) und der Vorhersage mit Feiertagen.
Sehr schön!
Insgesamt liefert es sehr gute Ergebnisse, für Feiertage scheint es zu überbewerten (siehe Heiligabend), doch das kann mit dem Parameter holidays.prior.scale wie in der Dokumentation angegeben eingestellt werden.
Schwieriges Geschäft: Qumashop
Diesmal ist der generierte Shopname Qumashop. Der Transaktionsverlauf von Qumashop ist etwas chaotischer als der von Widushop. Unten zeige ich den Transaktionsverlauf von Qumashop.
Die Feiertage haben einen viel größeren Einfluss. Sehen Sie sich den Spitzenwert Mitte Juli an. Dies ist ein bekanntes Ereignis, das viele Menschen in die Stadt zieht (es ist in den Feiertagsdaten enthalten). Beachten Sie, dass die Transaktionen im Jahr 2016 erheblich höher sind als in anderen Jahren, insbesondere von Juli bis September. Diesen Aufwärtstrend nicht zu erwischen, würde bedeuten, eine Menge potenzieller Verkäufe zu verlieren.
Diesmal ist die Prophet-Vorhersage nicht so gut wie bei Widushop: 0,64 ohne Feiertagsdaten und ein solider Wert von 0,82 mit Feiertagen. Im Folgenden zeige ich einen Vergleich zwischen den Transaktionen (Wahrheit) und der Vorhersage mit Feiertagen für Qumashop.
Sehen Sie sich das an! Sehr schön. Ich bin besonders froh, dass es den erwähnten Trend zwischen Juli und September erwischt hat. Außerdem sind die Residuen in der Woche nach dem großen Peak im Juli, in der zweiten Woche im September und in den beiden Wochen Ende Oktober zu hoch. Denken Sie daran, dass es sich in der Praxis nur um ein Modell eines Ensembles handelt. Es ist besser, insgesamt ein etwas größeres Residuum zu haben, das durch andere Modelle reduziert werden kann, als Wochen mit so großen Fehlern zu haben.
Vielleicht können die Vorhersagen für die Woche nach dem großen Peak im Juli verbessert werden, indem man eine changepoint für den letzten Tag der Spitzenferienwoche einführt.
Nachbereitung
Die sofortigen Ergebnisse von Prophet waren beeindruckend. Die Qualität der Prognosen ist vergleichbar mit denen unseres aktuellen Modells, das für diese 2 Geschäfte produziert wird.
Die Berechnungen wurden über alle 8 Kerne meines Rechners parallelisiert. Die Trainings- und Vorhersagezeit für jedes Datum betrug etwa 4 Sekunden.
Die API ist lächerlich einfach zu benutzen und die Dokumentation scheint ausreichend zu sein.
Soweit ich in der Dokumentation lesen kann, akzeptiert Prophet keine Features. Dennoch können die Vorhersagen von Prophet Teil eines Ensembles sein, das Vorhersagen mit einer höheren Granularität erstellt.
Es wäre interessant, einen Vergleich für jeden Shop zu machen. Ich war überrascht von dem Ergebnis für die schwierige Shop-Geschichte.
Es gibt auch mehrere Hyperparameter, die interessant wären, um sie zu untersuchen, darunter insbesondere diese:
cap: der maximal mögliche Wert des Ziels.changepoint: Geben Sie an, wo wir eine abrupte Veränderung in der Zeitreihe erwarten.changepoint_prior_scale: in Bezug auf die Frage, wie stark sich das Modell an Trends anpassen sollte.holidays_prior_scale: Passen Sie die Bedeutung von Urlaubseffekten an.interval_width: legt das Unsicherheitsintervall fest, um ein Konfidenzintervall um die Vorhersage herum zu erzeugen. Dies kann für die Überwachung der Qualität der Vorhersage sehr nützlich sein. Der Standardwert ist 80%.
Jedem, der ein Projekt beginnt, bei dem Zeitreihen für Prognosen verwendet werden, empfehle ich, sich dieses Tool genau anzuschauen.
Gute Arbeit, Prophet!
Ich hoffe, dieser Blog war hilfreich. Bitte teilen Sie mir unter @rodagundez Ihre Ergebnisse mit, wenn Sie mit Prophet herumspielen.
if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) { var align = "center", Einzug = "0em", Zeilenumbruch = "false"; if (false) { align = (screen.width < 768) ? "left" : align; indent = (screen.width < 768) ? "0em" : indent;Unsere Ideen
Weitere Blogs
Contact



