Wie Sie die Nachfrage prognostizieren und Einkäufe mithilfe von maschinellem Lernen automatisieren können: Fall Ozon

    Bild
    Der Ozon-Onlineshop bietet so ziemlich alles: Kühlschränke, Babynahrung, Laptops für 100.000, usw. All dies befindet sich in den Lagern des Unternehmens - und je länger die Waren dort sind, desto teurer ist das Unternehmen. Um herauszufinden, wie viel und was die Leute bestellen möchten und was Ozon kaufen muss, haben wir maschinelles Lernen eingesetzt.

    Umsatzprognose: Herausforderungen


    Bevor wir uns mit der Problemstellung befassen, beginnen wir mit einem Beispiel. Dies ist ein echter Zeitplan für Ozon-Verkäufe. Frage: Wohin wird er als nächstes gehen?

    Bild

    Eine Person mit einer nahezu technischen Ausbildung für eine solche Formulierung des Problems wird Fragen haben: Wo liegen die Achsen? Und was für ein Produkt? Und in welchen Einheiten? An welchem ​​Institut haben Sie Ihren Abschluss gemacht? - und viele andere, die aus ethischen Gründen nicht in diesen Artikel aufgenommen wurden.

    Tatsächlich kann niemand die Frage in einer solchen Aussage richtig beantworten, und wenn jemand es kann, wird er sich höchstwahrscheinlich irren.

    Fügen Sie dieser Grafik weitere Informationen hinzu: Achsen und Preisänderungen auf der Ozon-Website (blau) und der Website des Konkurrenten (orange).

    Bild

    Unser Preis ist irgendwann gefallen, aber die Konkurrenz ist gleich geblieben - und Ozons Verkäufe sind gestiegen. Wir kennen die Preispläne: Unser Preis wird auf dem gleichen Niveau bleiben, aber der Wettbewerber, der Ozon folgte, senkte den Preis auf fast unseren.

    Diese Daten reichen aus, um eine aussagekräftige Annahme zu treffen - zum Beispiel, dass der Umsatz auf das vorherige Niveau zurückkehren wird. Und wenn Sie sich die Tabelle ansehen, stellt sich heraus, dass es so sein wird.

    Bild

    Das Problem ist, dass in der Tat die Nachfrage nach diesem Produkt nicht so stark vom Preis abhängt und das Umsatzwachstum unter anderem durch das Fehlen der meisten Wettbewerber dieses Produkts in unserem Geschäft verursacht wurde. Es gibt noch viele Faktoren, die wir nicht berücksichtigt haben: Wurden die Waren im Fernsehen beworben? oder vielleicht sind es Süßigkeiten und bald der 8. März?

    Eines ist klar: Eine Prognose "am Knie" zu machen, wird nicht funktionieren. Wir sind den Standardweg eines Rechen und von Krücken gegangen , um irgendeinen ML-Algorithmus zu bauen. Und so war es auch.

    Metrikauswahl


    Bei der Auswahl einer Metrik müssen Sie beginnen, wenn mindestens eine andere Person neben Ihnen Ihre Prognose verwendet.

    Betrachten Sie ein Beispiel: Wir haben drei Prognoseoptionen. Welches ist besser?
    Bild
    Aus Sicht der Spezialisten im Lager brauchen wir eine blaue Prognose - wir werden etwas weniger kaufen und Mitte Oktober den Höhepunkt verpassen, aber nichts wird im Lager bleiben. Experten, deren KPI an den Umsatz gebunden ist, vertreten die gegenteilige Meinung: Auch wenn die türkisfarbene Prognose nicht ganz richtig ist, haben sich nicht alle Nachfragesprünge niedergeschlagen - ändern Sie sie. Und aus der Sicht einer Person von der Seite ist etwas dazwischen im Allgemeinen besser - so dass jeder gut ist oder umgekehrt.

    Vor der Erstellung einer Prognose muss daher festgelegt werden, wer sie verwendet und warum. Wählen Sie also eine Metrik aus und verstehen Sie, was Sie von einer auf einer solchen Metrik basierenden Prognose erwarten können. Und warte auf genau das.

    Wir haben MAE gewählt - den durchschnittlichen absoluten Fehler. Diese Metrik eignet sich für unser stark unausgeglichenes Trainingsmuster. Da das Sortiment sehr breit ist (1,5 Millionen Artikel), wird jedes Produkt einzeln in einer bestimmten Region in kleinen Mengen verkauft. Und wenn wir insgesamt Hunderte von grünen Kleidern verkaufen, dann wird ein bestimmtes grünes Kleid mit Katzen für 2-3 pro Tag verkauft. Infolgedessen verschiebt sich die Probe zu kleinen Werten. Auf der anderen Seite gibt es iPhones, Spinner, ein neues Buch von Olga Buzova (ein Witz) usw. - und sie werden in jeder Stadt in großen Mengen verkauft. Mit MAE können Sie keine hohen Bußgelder für bedingte iPhones verhängen und arbeiten im Allgemeinen gut mit dem Großteil der Waren.

    Erste Schritte


    Wir haben zunächst die dümmste Prognose erstellt, die es geben könnte: Eine Zufallszahl von 0 bis 1000 wird in der nächsten Woche verkauft und die Metrik MAE = 496 erhalten. Wahrscheinlich kann es schlimmer sein, aber das ist bereits sehr schlimm. Also haben wir eine Richtlinie: Wenn wir einen solchen metrischen Wert erhalten, dann machen wir offensichtlich etwas falsch.

    Dann haben wir angefangen, Leute zu spielen, die wissen, wie man eine Prognose ohne maschinelles Lernen erstellt, und haben versucht, den Absatz von Waren in der nächsten Woche so zu prognostizieren, dass er dem durchschnittlichen Umsatz aller letzten Wochen entspricht, und haben die Metrik MAE = 1,45 erhalten - was viel besser ist.

    Weiterhin haben wir entschieden, dass die Verkäufe der letzten Woche für die Umsatzprognose der nächsten Woche relevanter sind. Für eine solche Prognose betrug der MAE 1,26. Bei der nächsten Prognose haben wir uns entschlossen, beide Faktoren zu berücksichtigen und den Umsatz für die nächste Woche als Summe aus 50% des durchschnittlichen Umsatzes und 50% des Umsatzes in der letzten Woche vorherzusagen - wir haben MAE = 1,23 erhalten.

    Aber es schien uns zu einfach, und wir beschlossen, die Dinge zu komplizieren. Wir haben eine kleine Trainingsstichprobe gesammelt, in der die Anzeichen vergangener und durchschnittlicher Verkäufe waren, und die Ziele waren Verkäufe in der nächsten Woche, und wir haben darauf eine einfache lineare Regression trainiert. Wir haben Gewichte von 0,46 und 0,55 für die durchschnittliche und letzte Woche und die MAE auf der Testprobe gleich 1,2.
    Fazit: Unsere Daten haben prädiktives Potenzial.

    Feature-Engineering


    Nachdem wir entschieden haben, dass die Erstellung einer Prognose aus zwei Gründen nicht unser Ziel ist, haben wir uns zusammengesetzt, um neue komplexe Funktionen zu generieren. Dies sind Informationen über vergangene Verkäufe - vor 1, 2, 3, 4 Wochen, für die Woche vor genau einem Jahr usw. Und Ansichten der letzten Wochen, Hinzufügungen zum Warenkorb, Konvertierung von Ansichten und Hinzufügungen zum Warenkorb in Bestellungen - und das alles für verschiedene Zeiträume.

    Wir mussten ein Modell des Wissens darüber geben, wie das Produkt als Ganzes verkauft wird, wie sich die Dynamik seines Verkaufs in letzter Zeit verändert hat, wie sich das Interesse daran entwickelt, wie sein Verkauf vom Preis abhängt und andere Faktoren, die unserer Meinung nach nützlich sein können.

    Als unsere Ideen erschöpft waren, gingen wir zu den Experten der Verkaufsabteilung. Dort haben wir zum Beispiel erfahren, dass das nächste Jahr das Jahr des Schweins ist, daher erfreuen sich Waren, die zumindest entfernt Schweine ähneln, zunehmender Beliebtheit. Oder zum Beispiel, dass unsere Leute nicht im Voraus, sondern genau am Tag der ersten Fröste „einfrieren“ - also bitte die Wettervorhersage berücksichtigen. Im Allgemeinen waren alle zufrieden. Wir - weil wir eine Menge neuer Ideen erhalten haben, an die wir nie gedacht hätten, und Geschäftsleute - werden bald etwas Interessanteres als die Umsatzprognose tun können.

    Aber es ist immer noch zu einfach - und wir haben kombinierte Symptome hinzugefügt:

    • Umstellung von Ansichten auf Verkäufe - wie es war, wie es sich verändert hat;
    • das Verhältnis von Verkäufen über 4 Wochen zu Verkäufen über die vergangene Woche (wenn diese Zahl von 4 stark abweicht, unterliegt die Nachfrage nach diesem Produkt derzeit "Turbulenzen");
    • das Verhältnis von Produktverkäufen zu Verkäufen in der gesamten Kategorie - wenn diese Zahl nahe bei eins liegt, dann ist das Produkt ein „Monopolist“.

    In dieser Phase müssen Sie sich so viel wie möglich einfallen lassen - werfen Sie in der Trainingsphase nicht informative Zeichen aus.

    Infolgedessen erhielten wir 170 Schilder. Mit Blick auf die Zukunft hatte das größte Merkmal Bedeutung

    • Verkäufe für die vergangene Woche (für zwei, drei und vier).
    • Die Produktverfügbarkeit in der letzten Woche ist der Prozentsatz der Zeit, in der das Produkt auf der Website vorhanden war.
    • Der Winkelkoeffizient des Diagramms der Warenverkäufe der letzten 7 Tage.
    • Das Verhältnis des vergangenen Preises zur Zukunft - mit einem enormen Rabatt beginnen Sie, Waren aktiver zu kaufen.
    • Die Anzahl der direkten Wettbewerber auf unserer Website. Wenn zum Beispiel dieser Stift der einzige in seiner Kategorie ist, wird der Verkauf ziemlich stationär sein.
    • Produktabmessungen - Es stellte sich heraus, dass Länge und Breite die Vorhersehbarkeit des Umsatzes erheblich beeinflussen. Aus irgendeinem Grund ist der Zeitplan für lange und schmale Objekte - zum Beispiel für Regenschirme oder Angelruten - viel unbeständiger. Wir wissen noch nicht, wie wir das erklären sollen.
    • Tageszahl des Jahres - zeigt an, ob das neue Jahr kommt, der 8. März, der Beginn einer saisonalen Umsatzsteigerung usw.

    Probenahme


    Die Trainingsprobe ist Schmerz. Wir haben es für ungefähr 4 Wochen gesammelt, von denen zwei einfach an verschiedene Datenverwalter gingen und fragten, was sie hätten. Dies geschieht jedes Mal, wenn Sie Daten für einen längeren Zeitraum benötigen. Selbst in einem idealen Datenerfassungssystem wird lange Zeit etwas im Sinne von „Früher haben wir so gedacht, aber dann haben wir angefangen, anders zu denken und die Daten in dieselbe Spalte zu schreiben“ geschehen. Oder vor ein oder zwei Jahren stürzte der Server ab, aber niemand schrieb genau auf, wann - und die Nullen bedeuten nicht mehr, dass es keine Verkäufe gab.

    Infolgedessen hatten wir Informationen darüber, was die Leute auf der Website gemacht haben, was und in welcher Menge sie zu Favoriten und einem Warenkorb hinzugefügt und gekauft haben. Wir haben eine Stichprobe von ungefähr 15 Millionen Stichproben mit jeweils 170 Merkmalen gesammelt. Das Ziel war die Anzahl der Verkäufe für die nächste Woche.

    Wir haben zweitausend Codezeilen auf Spark geschrieben. Es funktionierte langsam, erlaubte aber das Kauen von riesigen Datenmengen. Es scheint einfach zu sein, die Steigung einer geraden Linie zu berechnen. Und dies 10-km-mal zu tun, wenn Verkäufe von mehreren Standorten aus getätigt werden - die Aufgabe ist nichts für schwache Nerven.

    Eine weitere Woche beschäftigten wir uns mit der Datenbereinigung, damit das Modell nicht durch Emissionen und lokale Merkmale der Stichprobe abgelenkt wurde, sondern nur die wahren Abhängigkeiten der Ozonverkäufe extrahiert wurden. Hier werden 3 Sigma und schlauere Methoden zur Suche nach Anomalien eingesetzt. Am schwierigsten ist es, den Umsatz in Zeiten mangelnder Lagerbestände wiederherzustellen. Die einfachste Lösung besteht darin, Wochen wegzuwerfen, in denen das Produkt während der "gezielten" Woche herausgekommen ist.

    Bild

    Infolgedessen blieben 10 Millionen von 15 Millionen Proben übrig. Es ist hier wichtig, sich nicht mitreißen zu lassen und die Vollständigkeit der Probe nicht zu verlieren (tatsächlich ist der Mangel an Waren im Lager ein indirektes Merkmal seiner Bedeutung für das Unternehmen; das Entfernen solcher Waren aus der Probe ist nicht dasselbe wie das Herauswerfen von Zufallsproben) )

    ML Zeit


    Auf einer sauberen Probe und begann Modelle zu trainieren. Natürlich haben wir mit linearer Regression begonnen und MAE = 1,15 erhalten. Es scheint, dass dies ein sehr geringer Anstieg ist. Wenn Sie jedoch eine Stichprobe von 10 Millionen Personen haben, bei der die Durchschnittswerte 5 bis 10 betragen, führt selbst eine geringfügige Änderung des metrischen Werts zu einer nicht messbaren Verbesserung der visuellen Qualität der Prognose. Und da Sie die Lösung letztendlich den Geschäftskunden vorstellen müssen, ist die Steigerung ihrer Freude ein wichtiger Faktor.

    Als Nächstes folgte sklearn.ensemble.RandomForestRegressor, der nach einer kurzen Auswahl von Hyperparametern MAE = 1,10 zeigte. Als nächstes haben wir XGBoost ausprobiert (wo ohne) - alles wäre in Ordnung und MAE = 1.03 - nur eine sehr lange Zeit. Leider hatten wir keinen Zugriff auf die GPU, um XGBoost zu trainieren, und auf Prozessoren wurde ein Modell sehr lange trainiert. Wir haben versucht, etwas schneller zu finden, und uns für LightGBM entschieden - es trainierte doppelt so schnell und zeigte MAE sogar etwas weniger - 1,01.

    Wir haben alle Produkte wie im Katalog auf der Website in 13 Kategorien unterteilt: Tische, Laptops, Flaschen. Für jede Kategorie haben wir Modelle mit unterschiedlichen Prognosetiefen trainiert - von 5 bis 16 Tagen.

    Das Training dauerte ungefähr fünf Tage, und dafür haben wir riesige Computercluster aufgebaut. Wir haben eine solche Pipeline entwickelt: Die Zufallssuche funktioniert sehr lange, es werden die Top-10-Sätze von Hyperparametern angezeigt, und dann arbeitet der Wissenschaftler manuell damit - erstellt zusätzliche Qualitätsmetriken (wir haben MAE für verschiedene Zielbereiche gezählt), erstellt Lernkurven (wir haben zum Beispiel einen Teil des Trainings verworfen) erneut trainiert und überprüft, ob neue Daten den Verlust der Testprobe verringern) und andere Diagramme.

    Ein Beispiel für eine detaillierte Analyse für einen der Sätze von Hyperparametern:

    Detaillierte Qualitätsmetrik

    Zugset:


    Test-Set:


    Für target = 0 ist MAE = 0.142222484602Für 0 MAE = 0,141900737761
    Für Ziel> 0 ist MAPE = 45.168530676Für> 0 MAPE = 45.5771812826
    Fehler größer als 0 - 67.931341691%Fehler größer als 0 - 51.6405939896%
    Fehler größer als 1 - 19.0346986379%Fehler größer als 1 - 12.1977096603%
    Fehler von mehr als 2 - 8.94313926245%Fehler mehr als 2 - 5.16977226441%
    Fehler mehr als 3 - 5.42406856507%Fehler mehr als 3 - 3.12760834969%
    Fehler von mehr als 4 - 3.67938161595%
    Fehler von mehr als 4 - 2.10263125679%
    Fehler von mehr als 5 - 2.67322988948%
    Fehler von mehr als 5 - 1.56473158807%
    Fehler über 6 - 2.0618556701%
    Fehler über 6 - 1.19599209102%
    Fehler über 7 - 1.65887701209%Fehler größer als 7 - 0.949300173983%
    Fehler über 8 - 1.36821095777%
    Fehler über 8 - 0,78310772461%
    Fehler über 9 - 1.15368611519%Fehler größer als 9 - 0.659205318158%
    Fehler über 10 - 0.99199395014%Fehler von mehr als 10 - 0,554593106723%
    Fehler über 11 - 0.863969667827%Fehler über 11 - 0.490045146476%
    Fehler über 12 - 0.764347266082%
    Fehler über 12 - 0.428835873827%
    Fehler über 13 - 0.68086818247%Fehler von mehr als 13 - 0,386545830907%
    Fehler über 14 - 0.613446089087%Fehler von mehr als 14 - 0,343884822697%
    Fehler über 15 - 0.556297016335%
    Fehler über 15 - 0.316433391328%
    Für target = 0 ist MAE = 0.142222484602
    Für target = 0 ist MAE = 0.141900737761
    Für target = 1 ist MAE = 0,63978556493
    Für target = 1 ist MAE = 0,660823509405
    Für target = 2 ist MAE = 1.01528075312Für target = 2 ist MAE = 1.01098070566
    Für target = 3 ist MAE = 1.43762342295Für target = 3 ist MAE = 1.44836233499
    Für target = 4 ist MAE = 1.82790678437
    Für target = 4 ist MAE = 1,86539223382
    Für target = 5 ist MAE = 2.15369976552
    Für target = 5 ist MAE = 2.16017884573
    Für target = 6 ist MAE = 2.51629758129
    Für Ziel = 6, MAE = 2,51987403661
    Für target = 7 ist MAE = 2.80225497415
    Für target = 7 ist MAE = 2.97580015564
    Für target = 8 ist MAE = 3.09405048248
    Für Ziel = 8, MAE = 3,21914648525
    Für Ziel = 9 ist MAE = 3,39256765159
    Für Ziel = 9, MAE = 3,54572928241
    Für target = 10 ist MAE = 3.6640339953Für target = 10 ist MAE = 3.84409605282
    Für target = 11 ist MAE = 4.02797747118
    Für target = 11 ist MAE = 4.21828735273
    Für Ziel = 12 ist MAE = 4,17163467899
    Für Ziel = 12, MAE = 3,92536509115
    Für Ziel = 14, MAE = 4,78590364522
    Für target = 14 ist MAE = 5.11290428675
    Für Ziel = 15 ist MAE = 4,89409916994
    Für target = 15 ist MAE = 5.20892023117

    Zugverlust = 0,535842111392
    Testverlust = 0,895529959873

    Diagrammvorhersage (Ziel) für den Trainingssatz
    Bild

    Diagrammvorhersage (Ziel) für Testprobe
    Bild

    Vorhersagefehler von Zeit zu Zeit
    Bild

    Aufsteigenden Fehler des Testsatzes sortieren
    Bild

    Wenn keine übereinstimmt, erneut zufällige Suche. So haben wir das Modell für vier oder fünf Tage im industriellen Tempo trainiert. Wir hatten Dienst, jemand in der Nacht, jemand wachte morgens auf, schaute sich die Top-10-Parameter an, startete neu oder speicherte das Modell und ging weiter ins Bett. In diesem Modus haben wir eine Woche lang gearbeitet und 130 Modelle geschult - 13 Produkttypen und 10 Prognosetiefen mit jeweils 170 Funktionen. Der Durchschnittswert von MAE für die 5-fache Zeitreihe cv ist gleich 1.

    Es mag den Anschein haben, dass dies nicht sehr cool ist - und das ist auch so, es sei denn, Sie haben einen großen Anteil an der Auswahl der Einheiten. Wie eine Analyse der Ergebnisse zeigt, werden die Einheiten am schlechtesten prognostiziert - die Tatsache, dass ein Produkt einmal pro Woche gekauft wurde, sagt nichts darüber aus, ob Nachfrage danach besteht. Sobald etwas verkauft werden kann, gibt es eine Person, die eine Porzellanfigur in Form eines Zahnarztes kauft, und dies sagt nichts über zukünftige Verkäufe oder über vergangene aus. Im Allgemeinen haben wir uns darüber nicht sehr geärgert.

    Tipps und Tricks


    Was ist schief gelaufen und wie kann dies vermieden werden?

    Das erste Problem ist die Auswahl der Parameter. Wir haben mit RandomizedSearchCV begonnen - einem bekannten Tool von sklearn zum Sortieren von Hyperparametern. Hier erwartete uns die erste Überraschung.

    So
    from sklearn.model_selection import ParameterSampler
    from sklearn.model_selection import RandomizedSearchCV

    estimator = lightgbm.LGBMRegressor(application='regression_l1', is_training_metric = True, objective = 'regression_l1', num_threads=72)
    param_grid = {'boosting_type': boosting_type, 'num_leaves': num_leaves, 'max_depth': max_depth, 'learning_rate':learning_rate, 'n_estimators': n_estimators, 'subsample_for_bin': subsample_for_bin, 'min_child_samples': min_child_samples, 'colsample_bytree': colsample_bytree, 'reg_alpha': reg_alpha, 'max_bin': max_bin}

    rscv = RandomizedSearchCV(estimator, param_grid, refit=False, n_iter=100, scoring='neg_mean_absolute_error', n_jobs=1, cv=10, verbose=3, pre_dispatch='1*n_jobs', error_score=-1, return_train_score='warn')

    rscv .fit(X_train.values, y_train['target'].values)
    print('Best parameters found by grid search are:', rscv.best_params_)


    Die Berechnung bleibt einfach stehen (was wichtig ist, dass sie nicht abfällt, sondern weiterhin funktioniert, sondern auf einer immer kleineren Anzahl von Kernen und irgendwann einfach anhält).

    Ich musste den Prozess wegen RandomizedSearchCV parallelisieren
    estimator = lightgbm.LGBMRegressor(application='regression_l1', is_training_metric = True, objective = 'regression_l1', num_threads=1)

    rscv = RandomizedSearchCV(estimator, param_grid, refit=False, n_iter=100, scoring='neg_mean_absolute_error', n_jobs=72, cv=10, verbose=3, pre_dispatch='1*n_jobs', error_score=-1, return_train_score='warn')

    rscv .fit(X_train.values, y_train['target'].values)
    print('Best parameters found by grid search are:', rscv.best_params_)


    RandomizedSearchCV erfasst jedoch fast den gesamten Datensatz für jeden „Job“. Dementsprechend ist es notwendig, die RAM-Größe stark zu vergrößern, wodurch möglicherweise die Anzahl der Kerne geopfert wird.

    Wer würde uns dann von so wunderbaren Dingen wie hyperopt erzählen! Da wir gelernt haben, verwenden wir es nur.

    Ein weiterer Trick, der uns gegen Ende des Projekts in den Sinn kam, war die Auswahl von Modellen mit dem Parameter colsample_bytree (dies ist der LightGBM-Parameter, der angibt, wie viel Prozent der Funktionen für jeden Lener zu vergeben sind) im Bereich von 0,2 bis 0,3, wenn das Auto fährt Es funktioniert in der Produktion, möglicherweise sind keine Tabellen vorhanden, und einzelne Features werden möglicherweise nicht richtig gezählt. Mit einer solchen Regularisierung können Sie sicherstellen, dass diese nicht gezählten Funktionen zumindest nicht alle Lernprogramme innerhalb des Modells betreffen.
    Empirisch sind wir zu dem Schluss gekommen, dass wir mehr Schätzer machen und die Regularisierung härter verdrehen müssen. Dies ist keine Regel für die Arbeit mit LightGBM, aber ein solches Schema hat für uns funktioniert.

    Na und natürlich Spark. Zum Beispiel gibt es einen Fehler, den Spark selbst kennt: Wenn Sie mehrere Spalten aus einer Tabelle nehmen und eine neue erstellen, dann andere aus derselben Tabelle nehmen und eine neue erstellen und dann die Tabellen einstellen, bricht alles zusammen, obwohl dies nicht der Fall sein sollte. Sie können nur gerettet werden, indem Sie alle faulen Berechnungen loswerden. Wir haben sogar eine spezielle Funktion geschrieben - bumb_df, die den Datenrahmen in einen RDD zurück in einen Datenrahmen verwandelt. Das heißt, es werden alle verzögerten Berechnungen zurückgesetzt. Dies kann Sie vor den meisten Spark-Problemen schützen.

    bumb_df
    def bump_df(df):
    # to avoid problem: AnalysisException: resolved attribute(s)
    df_rdd = df.rdd
    if df_rdd.isEmpty():
    df = df_rdd.toDF(schema=df.schema)
    return df
    else:
    return df_rdd.toDF(schema=df.schema)


    Die Prognose ist fertig: Wie viel bestellen wir?


    Die Umsatzprognose ist eine rein mathematische Aufgabe, und wenn die Normalverteilung eines Mittelwertfehlers für einen Mathematiker ein Sieg ist, dann ist dies für Händler, bei denen jeder Rubel gezählt wird, inakzeptabel.

    Wenn ein zusätzliches iPhone oder ein modisches Kleid im Lager kein Problem ist, sondern ein Versicherungsbestand, bedeutet das Fehlen desselben iPhones im Lager einen Verlust von mindestens Marge und maximal Image, und dies kann nicht zugelassen werden.

    Um dem Algorithmus beizubringen, so viel wie nötig zu kaufen, mussten wir die Kosten für den Neu- und Unterkauf jedes Produkts berechnen und ein einfaches Modell trainieren, um mögliche Geldverluste zu minimieren.

    Das Modell erhält am Eingang eine Umsatzprognose, fügt zufälliges, normalverteiltes Rauschen hinzu (wir simulieren die Mängel der Lieferanten) und lernt, genau so viel zur Prognose für jedes spezifische Produkt hinzuzufügen, um Geldverluste zu minimieren.

    Ein Auftrag ist also ein Forecast + Safety-Bestand, der die Abdeckung des Forecast-Fehlers und die Unvollkommenheit der Außenwelt garantiert.

    Wie in prod


    Ozon hat einen eigenen ziemlich großen Computercluster, auf dem jede Nacht eine Pipeline (wir verwenden den Luftstrom) von mehr als 15 Jobs gestartet wird. So sieht es aus:

    Bild

    Der Algorithmus startet jede Nacht, bezieht etwa 20 GB Daten aus verschiedenen Quellen in lokale HDFS, wählt einen Lieferanten für jedes Produkt aus, sammelt Merkmale für jedes Produkt, erstellt eine Umsatzprognose und generiert Bestellungen basierend auf dem Lieferplan. Von 6 bis 7 Uhr geben wir den Tischleuten, die für die Arbeit mit Lieferanten verantwortlich sind, vorgefertigte Tische, die mit einem Knopfdruck zu den Lieferanten wegfliegen.

    Keine einzige Vorhersage


    Das trainierte Modell kennt die Abhängigkeit der Prognose von einem Feature. Wenn Sie also N-1-Zeichen einfrieren und eines ändern, können Sie beobachten, wie sich dies auf die Prognose auswirkt. Das Interessanteste dabei ist natürlich, wie der Umsatz vom Preis abhängt.

    Es ist wichtig zu beachten, dass die Nachfrage nicht nur vom Preis abhängt. Wenn Sie zum Beispiel im Sommer kleine Rabatte auf Schlitten gewähren, hilft dies ihnen immer noch nicht beim Verkauf. Wir machen mehr Rabatt, und es erscheinen Leute, die "im Sommer einen Schlitten vorbereiten". Bis zu einem gewissen Grad an Rabatten können wir jedoch immer noch nicht den Teil des Gehirns erreichen, der für die Planung verantwortlich ist. Im Winter funktioniert es wie bei jedem Produkt - Sie machen einen Rabatt und es verkauft sich schneller.

    Bild

    Pläne


    Jetzt untersuchen wir aktiv das Clustering von Zeitreihen, um Waren auf die Cluster zu verteilen, basierend auf der Art der Kurve, die ihren Umsatz beschreibt. Zum Beispiel saisonal, traditionell beliebt im Sommer oder umgekehrt im Winter. Wenn wir lernen, wie man Produkte mit langer Verkaufsgeschichte trennt, möchten wir auf Artikel bezogene Merkmale hinweisen, die Ihnen Aufschluss über das Verkaufsmuster für ein neues, gerade erschienenes Produkt geben - dies ist vorerst unsere Hauptaufgabe.

    Neuronale Netze und parametrische Modelle von Zeitreihen - und das alles im Ensemble - werden sicherlich noch weiter gehen.

    Insbesondere dank des neuen Prognosesystems wechselte Ozon vom Einkauf von Waren mit Lagerbestand zu zyklischen Lieferungen, wenn wir von einer Lieferung zur nächsten kauften und keine Salden auf Lager hielten.

    Jetzt müssen wir entscheiden, wie der Algorithmus zur Vorhersage des Umsatzes neuer Produkte und ganzer Kategorien gelehrt werden soll. Im nächsten Jahr plant das Unternehmen, den Umsatz in Kategorien um das Zehnfache und in Erfüllungsbereichen um das 2,5fache zu steigern. Und wir müssen den Modellen mitteilen, dass diese alten Daten relevant sind, aber für einen anderen, früheren Speicher. Und während wir darüber nachdenken, wie es geht.

    Die zweite von Natur aus irrationale Sache, die wir vorhersagen müssen, ist Mode. Wie könnte man vorhersagen, dass sich ein Spinner so verkaufen würde? Wie kann man den Verkauf neuer Bücher von Dan Brown vorhersagen, wenn eines seiner Bücher ausverkauft ist und das andere nicht? Während wir daran arbeiten.

    Wenn Sie wissen, wie Sie es besser machen können, oder wenn Sie in den Kommentaren Geschichten über die Verwendung von maschinellem Lernen im Kampf haben, werden wir darauf eingehen.

    Jetzt auch beliebt: