
Unsere Geschäftskunden wollen cooles Marketing betreiben. Um die Leute dazu zu bringen, mehr zu kaufen, senden sie ihnen regelmäßig E-Mails. Und jedes Mal denken sie: "Was soll man in den Brief schreiben?".
Sie können einfach schreiben: "Kaufen Sie öfter bei uns!", Aber es funktioniert nicht sehr gut. Eine bessere Idee ist es, Produktanzeigen in einen Brief einzufügen. Es ist ratsam, Produkte zu bewerben, die Käufer interessieren.
Als nächstes werde ich darüber sprechen, wie wir echte persönliche Empfehlungen von Grund auf abgegeben haben.
Wählen Sie aus, was Sie empfehlen möchten
Sie können alles empfehlen.
Sie können die am häufigsten gekauften Produkte empfehlen. In einem Elektronikgeschäft sind dies beispielsweise Festplatten und Mobiltelefone. Aber was ist mit denen, die sie bereits haben? Es stellt sich heraus, dass jedem das Gleiche empfohlen wird - nicht sehr cool.
Sie können etwas Ähnliches empfehlen, wie es die Person auf der Website gesehen hat - zum Beispiel die Schuhe, wir empfehlen ... andere Schuhe! Egal wie seltsam es klingt, es wird in der Praxis verwendet und funktioniert sogar.
Aber wir wollten immer noch etwas Besonderes tun, damit jeder in dem Brief etwas Persönliches sah, das er wirklich brauchte, damit er den Wunsch hatte, immer wieder in den Laden zurückzukehren. Die Aufgabe wurde durch die Tatsache erschwert, dass wir fast 300 Kundengeschäfte in verschiedenen Bereichen haben. Und die Empfehlungen sollten für jeden von ihnen gut funktionieren und sich automatisch an die Besonderheiten eines bestimmten Geschäfts anpassen. Also begannen wir, universelle persönliche Empfehlungen abzugeben.
Erstellen des Basismodells
Nachdem wir Artikel von Amazon gelesen hatten, entschieden wir uns, das grundlegendste Modell persönlicher Empfehlungen zu erstellen und zu sehen, wie es sich zeigt.
Laden Sie zunächst die Einkaufstabelle herunter und erweitern Sie sie zu einer spärlichen Client-Produkt-Matrix.

Konvertieren einer Einkaufsliste in eine Kunden-Produkt-Matrix
Als nächstes verwenden wir die kollaborative Filterung . Die Intuition hier ist einfach: Kunde Nummer 1 kaufte Produkt Nummer 1 und zwei Produkte Nummer 3; Kunde Nummer 2 hat auch Produkt Nummer 1 gekauft - er möchte wahrscheinlich Produkt Nummer 3 kaufen.
Kollaboratives Filtern beinhaltet die Zerlegung einer großen, dünn besetzten Matrix in zwei dichte, längliche, latente Merkmalsmatrizen von wesentlich kleinerer Größe. Für die Zerlegung haben wir die vorgefertigte Implementierung von AlternatingLeastSquares aus der impliziten Bibliothek verwendet.
Nach dem Training des Modells erhalten wir latente Symptome für alle Kunden und alle Produkte. Sie werden in Form von Matrizen (Anzahl der Kunden x Anzahl der Zeichen) bzw. (Anzahl der Produkte x Anzahl der Zeichen) dargestellt.
Latente Zeichen sind Zeichen, die nirgendwo explizit festgelegt sind, z. B. die Größe einer Person oder der Bereich einer Wohnung. Normalerweise werden sie als Ergebnis einiger mathematischer Transformationen über die Originaldaten erhalten.
Die latenten Merkmalsmatrizen sind so angeordnet, dass Sie beim Multiplizieren eine Matrix erhalten, die dieselbe Größe wie das Original hat. Mit einem hohen Grad an Konventionalität können wir sagen, dass es dort, wo es größere Zahlen gab, größere Zahlen geben wird - ungefähr eine. Wo weniger weniger ist. Wo es Nullen gab, gibt es kleine Zahlen nahe Null, möglicherweise negativ. Wichtig ist jedoch, dass an einigen Stellen, an denen es Nullen gab, ziemlich große Zahlen erscheinen - unsere zukünftigen Empfehlungen.

Die Einkäufe, die sich stark beeinflussen, werden in derselben Farbe hervorgehoben. In einer Box werden einige zukünftige Empfehlungen hervorgehoben.
Wenn wir nun den Merkmalsvektor für einen bestimmten Kunden nehmen und ihn mit der Produktmerkmalsmatrix multiplizieren, erhalten wir den Bewertungsvektor aller Produkte für diesen Kunden. Es bleiben nur mehrere Produkte mit maximaler Geschwindigkeit zur Auswahl.
Eine kleine Nuance - unter den empfohlenen Produkten mit hoher Wahrscheinlichkeit gibt es solche, die bereits vom Kunden gekauft wurden - müssen sie ausgeschlossen werden.
Seltsamerweise hat sich herausgestellt, dass ein so einfaches Schema funktioniert, und die Kunden haben unsere Empfehlungen gerne getestet. Wir haben AB-Tests durchgeführt, bei denen wir persönliche Empfehlungen mit Bestsellern verglichen haben. In einigen Fällen gab es keinen Unterschied, in einigen Fällen war jedoch ein statistisch signifikanter Anstieg der Conversions in der Größenordnung von bis zu 10% zu verzeichnen. Dies waren hauptsächlich Geschäfte mit einer hohen Häufigkeit von Einkäufen und dementsprechend einer großen Datenmenge.
Wir verwenden mehr Daten.
Es war klar, dass Informationen über Einkäufe allein nicht ausreichten, um gute Empfehlungen abzugeben. Wenn auch nur, weil viele Kunden überhaupt keine Einkäufe haben. Aus diesem Grund haben wir beschlossen, unsere Empfehlungen zu verbessern.
Zusätzlich zu den Einkäufen haben wir begonnen, Produktansichten zu berücksichtigen und sie verschiedenen Listen hinzuzufügen: im Warenkorb, in „Favoriten“ usw.
Für jede Art von Aktion haben wir ein Gewicht ausgewählt und es mit diesem Gewicht zu unserer spärlichen Matrix hinzugefügt.
Wir berücksichtigen den Zeitpunkt des Handelns
Wir waren der Meinung, dass der gestrige Kauf und der Kauf vor einem Jahr nicht die gleichen Auswirkungen auf die Empfehlungen haben sollten. Daher haben wir für alle Aktionen einen exponentiellen Vergessenskoeffizienten eingeführt.
Darüber hinaus ist für einige Geschäfte, zum Beispiel Kleidung, die Saisonalität wichtig: Wenn es Sommer ist, müssen Sie mehr darauf achten, was eine Person im Sommer vor einem Jahr gekauft hat als vor sechs Monaten im Winter.
Wir berücksichtigen die offensichtlichen Anzeichen
Unsere Datenbank enthält eine Vielzahl von Informationen. Wir haben beschlossen, dass alles verwendet werden sollte.
Für Produkte haben wir begonnen, den Preis, den Hersteller, die Produktkategorie und verschiedene zusätzliche Felder zu verwenden, die das Geschäft angibt (Konfektionsgröße, Farbe der Möbel, Vorhandensein von GVO in Hundefutter usw.).
Für Kunden haben sie in der letzten Sitzung Geschlecht, Alter, Postfachdomäne, Betriebssystem und den Kanal, über den er in die Datenbank gelangt ist (Online, Offline, soziales Netzwerk usw.), ermittelt.
Um all dies mit dem Modell zu verbinden, haben wir:
- Wir erstellen Feature-Matrizen (getrennt für Kunden und Produkte), nachdem wir sie zuvor mit Standardmethoden verarbeitet haben: Skalierung, One-Hot-Codierung.
- Basierend auf den Funktionen der Produkte und der vorhandenen Kunden-Produkt-Matrix stellen wir gepaarte zusätzliche Funktionen für Kunden wieder her. Die Wiederherstellung erfolgt so, dass das Produkt der Produktattribute mit den Kundenattributen gepaart wird, um die Quellmatrix so nah wie möglich zu bringen. Kleben Sie diese zusätzlichen Zeichen auf vorhandene latente.
- Ebenso machen wir mit den Zeichen der Kunden.

Erweitern Sie latente Zeichen
Jetzt haben wir mehr Anzeichen und können genauere Empfehlungen aussprechen. Von diesem Moment an begann die Anzahl der Tests, die ein statistisch signifikantes Ergebnis zugunsten persönlicher Empfehlungen zeigten, zu wachsen. Neben Tests hat sich auch die subjektive Beurteilung durch Experten verbessert.
Konfigurieren Sie Hyperparameter
Metriken zuerst
Natürlich haben wir unsere Empfehlungen ständig getestet. Wir haben sowohl Offline-Tests als auch Online-Tests durchgeführt.
Natürlich sind Online-AB-Tests eine zuverlässigere Methode, um zu überprüfen, wie gut Empfehlungen sind. Und diese Tests zeigten gute Ergebnisse.
Online-Tests sind jedoch furchtbar unpraktisch:
Sie müssen ein Geschäft finden, das mit seinen Kunden Risiken eingehen und die neue Version des Algorithmus testen möchte.
Dann müssen Sie einen Tag / eine Woche / zwei warten, um statistisch signifikante Ergebnisse zu erhalten.
Sie müssen dies 100 Mal wiederholen, um 100 verschiedene Optionen zu testen.
Offline-Tests sind daher unverzichtbar. Und hier wird es nicht schaden zu erwähnen, wie wir sie durchgeführt haben.
Als Offline-Metrik wählten sie das beliebte und einfache nDCG @ K (Normalized Discounted Cumulative Gain at K) oder vielmehr den Durchschnitt für mehrere tausend Kunden.
Diese Metrik ist die Rangfolgequalität . Es nimmt Werte von 0 bis 1 an und zeigt, wie gut die Empfehlungen sind.
Um den Wert der Metrik zu berechnen, benötigen Sie einen Standard - ideale Empfehlungen. Wir haben keinen solchen Standard. Aber wir haben einen Ausweg gefunden: Wir haben zu einem Zeitpunkt in der Vergangenheit - vor einem Monat - Empfehlungen berücksichtigt und uns angesehen, was eine Person für diesen Monat gekauft hat - dies war unser Standard.
Hier gibt es einen kleinen Trick: Wenn wir dem Kunden vor einem Monat etwas empfohlen hätten, hätte er es kaufen können, aber er hatte es nicht gekauft. Aber wir werden nie davon erfahren.
Ein weiterer Punkt: Wir könnten einen blauen Hut mit Pompon empfehlen, und ein Kunde kaufte einen blauen Hut ohne Pompon. Die Waren scheinen ähnlich, aber unterschiedlich zu sein - die Metrik sackt ab. Daher haben wir bei der Berechnung der Metrik begonnen, die Ähnlichkeit der Waren zu berücksichtigen.
Und jetzt zu Hyperparametern
Da wir eine Offline-Metrik haben, können wir eine Vielzahl von Optionen für unsere Empfehlungen sicher testen und müssen uns keine Sorgen machen, dass jemand darunter leiden könnte.
Eine Woche lang haben wir unsere Vorstellungskraft belastet und 2-3 Dutzend verschiedene Modifikationen unseres Algorithmus ausprobiert, darunter einfache, wie z. B. verschiedene Vergessensfaktoren, und komplexere, z. B. die Verwendung eines anderen Algorithmus zum Kleben offensichtlicher Anzeichen von Kunden und Produkten.
Einige Änderungen haben nirgendwo Auswirkungen. Einige zeigten Verbesserungen bei allen Projekten - wir haben sie behoben. Bei einigen Projekten wurde die Metrik verbessert, bei anderen verschlechterte sie sich. Also haben wir die Hyperparametereinstellung .
Wir haben jetzt 11 Hyperparameter. Es dauerte mehrere Tage, um die optimalen Werte für alle Projekte zu finden.
Nach der Optimierung stellte sich heraus, dass die Metrik für alle Projekte im Durchschnitt 6-mal und das stärkste Wachstum - 35-mal!
Verbesserung der Funktionalität
Wir können gute personalisierte Empfehlungen abgeben. Cool.
Aber wie funktionieren sie? So etwas in der Art: Jede Nacht in der Nacht, wenn die Last auf den Servern sinkt, beginnen wir, Empfehlungen für alle Projekte wiederzugeben. Der Verbrauch von RAM und CPU nimmt zu, mehrere Stunden vergehen und die Empfehlungen sind fertig. Sie gehen in ein spezielles Lager und warten, bis sie von dort genommen werden.
Warum es nehmen? Zum Beispiel, um einen Brief einzusenden. Das hört sich gut an.
Oder auf der Website zu zeigen. Stellen Sie sich vor, Sie gehen auf die Website, wählen ein Mobiltelefon aus, und im Fenster werden persönliche Empfehlungen angezeigt, und Sie erhalten ... einen Wasserkocher! Warum ein Wasserkocher? Ja, weil Sie vor einem Monat eine Mikrowelle gekauft haben und der Algorithmus berechnet hat, dass diejenigen, die eine Mikrowelle gekauft haben, häufig einen Wasserkocher benötigen.
Aber du brauchst ein Handy! Wie soll ich sein?
Es ist an der Zeit, Empfehlungen abzugeben, die in Echtzeit funktionieren.
Aus mathematischer Sicht nichts Neues: Wir haben einfach die Phase der Modellausbildung und die Phase der Abgabe von Empfehlungen unterteilt.
Wir trainieren das Modell immer noch einmal am Tag.
Und jetzt können wir online Empfehlungen abgeben. Sobald eine Person eine Aktion auf der Website ausführt, beispielsweise das Produkt anzeigt oder es dem Warenkorb hinzufügt, wird eine Anfrage generiert. Die Anfrage gibt an, wer was mit welchem Produkt gemacht hat. Der Empfehlungsalgorithmus verarbeitet diese Anforderung und generiert als Antwort eine Liste mit Empfehlungen für diesen Client.
Um dies zu ermöglichen, brauchten wir:
- Erstellen Sie ein Repository, in dem Modelle nach dem Training hinzugefügt werden.
- Organisieren Sie einen Schlüsselwertspeicher zum Speichern von Aktionen, die zuvor vom Client ausgeführt wurden, da das Laden aus der Datenbank sehr lange dauert.
- Beschleunigen Sie unsere Empfehlungen erheblich. Der Hauptbeschleunigungspunkt war die Verwendung der nmslib- Bibliothek, um die nächsten Nachbarn zu finden und die relevantesten Produkte für eine Person auszuwählen. Schlaue Leute von Microsoft haben sich ausgedacht, wie man das Problem der Matrixmultiplikation reduzieren und die Spitze der Elemente mit dem höchsten Wert auswählen kann, um die nächsten Nachbarn zu finden.
- Erstellen Sie einen Microservice, der die Aktionen einer Person auf der Site verfolgt, eine Anfrage nach Empfehlungen sendet, diese Empfehlungen entgegennimmt und der Person zeigt.
Und diese höllische Maschine hat verdient. Und schnell verdient. Sobald Sie sich Ihr Mobiltelefon ansehen, werden Empfehlungen in Sekundenbruchteilen wiedergegeben, und Mobiltelefone, Hüllen, Brillen und dergleichen werden Ihnen bereits empfohlen.
Um klarer zu machen, was schnell ist: Wir halten einer Last von 7000 U / min (Anforderungen pro Minute) mit nur 3 Kernen Intel Xeon 2,6 GHz-CPU stand. Diese Belastung wird in Spitzenaktivität der 2 größten unserer Kunden angegeben.
Was weiter
Es scheint, dass wir vom aktuellen Modell alles zusammengedrückt haben, was möglich ist.
Weitere Verbesserungen erfordern wesentliche Änderungen.
Eine der Verbesserungsmöglichkeiten ist die vorläufige Segmentierung der Kunden in Gruppen.
Menschen verhalten sich anders: Jemand kauft oft und nach und nach, jemand selten, aber in großen Mengen, jemand teure Waren, jemand billig. Tatsächlich muss das Modell selbst solche Gruppen finden und ihnen empfehlen, was sie benötigen.
Aber es kann zum Beispiel schwierig sein, wenn die Gruppen klein sind. Zum Beispiel eine kleine Gruppe von juristischen Personen. Oder eine Gruppe von Männern in einem Frauengeschäft. Sie können nicht immer durch das formale Attribut „Geschlecht“ bestimmt werden, da die Frau eine für ihren Ehemann ausgestellte Treuekarte verwenden kann und umgekehrt.
Sie können versuchen, dem Modell zu helfen, wenn Sie zuerst diese Gruppen auswählen und dann für jede einzelne ein Modell erstellen.
Ein anderer, ernsthafterer Ansatz zur Verbesserung könnte darin bestehen, die Handlungshistorie zu berücksichtigen.
Jetzt berücksichtigen wir nur die Vorschrift der Aktion, und dies erlaubt uns nicht, Verhaltensmuster zu identifizieren. Zum Beispiel kann das Modell nicht verstehen, dass es Zeit ist, Babynahrung zu empfehlen, wenn Sie zuerst Kleidung für schwangere Frauen und dann Windeln gekauft haben.
Im Allgemeinen kann die Arbeit an der Verbesserung der Empfehlungen unserer Meinung nach fast unbegrenzt dauern. Mit jedem neuen Kunden, der sie verwendet, erscheinen neue Fälle und neue Hypothesen zur Verbesserung.
Wir verbessern uns also weiter und werden versuchen, darüber zu schreiben, was wir tun. Verabschieden Sie sich nicht :)