5

Ich benutze Spark, um einen Empfehlungssystem-Prototyp zu bauen. Nach einigen Tutorials konnte ich aus meinen Daten ein MatrixFactorizationModel trainieren.Spark - Wie benutzt man das trainierte Empfehlungsmodell in der Produktion?

Allerdings ist das von Spark mllib trainierte Modell nur ein Serializable. Wie kann ich dieses Modell verwenden, um Empfehlungen für echte Benutzer zu geben? Ich meine, wie kann ich das Modell in irgendeiner Art von Datenbank persistieren oder aktualisieren, wenn die Benutzerdaten inkrementiert wurden?

Zum Beispiel kann das von der Mahout-Empfehlungsbibliothek trainierte Modell in Datenbanken wie Redis gespeichert werden, dann können wir später die empfohlene Elementliste abfragen. Aber wie können wir ähnliche Sachen in Spark machen? Irgendein Vorschlag?

Antwort

8

Erstens ist das "Modell", auf das Sie von Mahout beziehen, kein Modell, sondern eine vorberechnete Liste von Empfehlungen. Sie können dies auch mit Spark tun und in Stapelempfehlungen für Benutzer berechnen und sie dort beibehalten, wo Sie möchten. Dies hat nichts mit der Serialisierung eines Modells zu tun. Wenn Sie keine Echtzeit-Updates oder Scoring durchführen möchten, können Sie damit aufhören und einfach Spark für Batch verwenden, genau wie Sie Mahout tun.

Aber ich stimme zu, dass Sie in vielen Fällen das Modell an einen anderen Ort liefern und es bedienen möchten. Wie Sie sehen können, sind andere Modelle in Spark Serializable, aber nicht MatrixFactorizationModel. (Ja, obwohl es als solches gekennzeichnet ist, wird es nicht serialisiert.) Ebenso gibt es eine Standardserialisierung für Vorhersagemodelle, die PMML genannt wird, aber es enthält kein Vokabular für ein faktorisiertes Matrixmodell.

Der Grund ist eigentlich der gleiche. Während viele Vorhersagemodelle, wie ein SVM- oder logistisches Regressionsmodell, nur ein kleiner Satz von Koeffizienten sind, ist ein faktorisiertes Matrixmodell riesig und enthält zwei Matrizen mit möglicherweise Milliarden von Elementen. Deshalb denke ich, dass PMML keine vernünftige Codierung dafür hat.

Ebenso, in Spark, bedeutet dies, dass die tatsächlichen Matrizen s sind, die nicht direkt serialisiert werden können. Sie können diese RDDs im Speicher aufbewahren, sie mit Spark an anderer Stelle erneut lesen und eine MatrixFactorizationModel von Hand auf diese Weise neu erstellen.

Sie können das Modell jedoch nicht mit Spark bereitstellen oder aktualisieren. Dafür suchen Sie wirklich Code zu schreiben, um Aktualisierungen durchzuführen und Empfehlungen spontan zu berechnen.

Es macht mir nichts aus, hier das Oryx Projekt vorzuschlagen, da sein Punkt genau diesen Aspekt, besonders für die ALS-Empfehlung, verwalten soll. Tatsächlich basiert das Projekt Oryx 2 auf Spark und enthält, obwohl es in Alpha ist, bereits die vollständige Pipeline, um die Ausgabe von MatrixFactorizationModel zu serialisieren und zu bedienen. Ich weiß nicht, ob es Ihren Bedürfnissen entspricht, aber es könnte zumindest ein interessanter Bezugspunkt sein.

+0

Danke für Ihre die hervorragende und detaillierte Erklärung! Ich werde Oryx versuchen :) – shihpeng

2

Eine weitere Methode zum Erstellen von Recs mit Spark ist die Suchmaschinenmethode. Dies ist im Grunde ein Cooccurrence-Empfehler, der von Solr oder Elasticsearch bedient wird. Der Vergleich von Faktorisierung und Ko-Currentation geht über diese Frage hinaus, daher werde ich nur Letzteres beschreiben.

Sie füttern Interaktionen (Benutzer-ID, Artikel-ID) in Mahout spark-itemsimilarity. Dies erzeugt eine Liste ähnlicher Elemente für jedes Objekt, das in den Interaktionsdaten zu sehen ist. Es wird standardmäßig als csv herauskommen und kann so überall gespeichert werden. Aber es muss von einer Suchmaschine indiziert werden.

In jedem Fall, wenn Sie recs abrufen möchten, verwenden Sie die Benutzerhistorie als die Abfrage, erhalten Sie eine geordnete Liste von Elementen als recs zurück.

Ein Vorteil dieser Methode besteht darin, dass Indikatoren für beliebig viele Benutzeraktionen berechnet werden können. Jede Aktion des Benutzers, die mit dem übereinstimmt, was Sie empfehlen möchten, kann verwendet werden. Zum Beispiel, wenn Sie einen Kauf empfehlen möchten, aber Sie auch Produktansichten aufzeichnen. Wenn Sie Produktansichten genauso wie Käufe behandelt haben, würden Sie wahrscheinlich schlechtere Empfehlungen erhalten (ich habe es ausprobiert). Wenn Sie jedoch einen Indikator für Käufe und einen anderen Indikator für Produktansichten berechnen, sind diese ebenso für Käufe prädiktiv. Dies hat den Effekt, dass die Daten, die für Recs verwendet werden, erhöht werden. Dieselbe Art von Vorgang kann mit Benutzerstandorten durchgeführt werden, um Standortinformationen in Kaufempfehlungen einzufügen.

Sie können Ihre Empfehlungen auch kontextabhängig beeinflussen. Wenn Sie sich im Abschnitt "Elektronik" eines Katalogs befinden, möchten Sie vielleicht, dass die Records in Richtung Elektronik ausgerichtet sind. Fügen Sie der Abfrage eine Elektronik für das Metadatenfeld "Kategorie" des Elements hinzu und geben Sie dieser in der Abfrage einen Schub, und Sie haben eine verzerrte Anzeige.

Da die gesamte Verzerrung und Mischung von Indikatoren in der Abfrage auftritt, kann die recs-Engine leicht auf mehrere Kontexte abgestimmt werden, während nur eine Abfrage über mehrere Felder über eine Suchmaschine durchgeführt wird. Wir bekommen Skalierbarkeit von Solr oder Elasticsearch. Ein weiterer Vorteil der Faktorisierung oder der Suchmethode besteht darin, dass völlig neue Benutzer und ein neuer Verlauf verwendet werden können, um Empfehlungen zu erstellen, die die älteren Mahout-Empfehlungen nur den Benutzern und Interaktionen empfehlen, die beim Ausführen des Jobs bekannt waren. hier

Beschreibungen:

0

Sie die Funktion .save verwenden (sparkContext, outputFolder), um das Modell in einem Ordner Ihrer Wahl zu speichern. Während Sie die Empfehlungen in Echtzeit geben, müssen Sie nur MatrixFactorizationModel.load (sparkContext, Modellordner) Funktion verwenden, um es als MatrixFactorizationModel Objekt zu laden.

Eine Frage zu @Sean Owen: Hat nicht die MatrixFactorizationObject die Faktorisierung Matrizen enthalten: Benutzer-Funktion und item-Feature Matrizen anstelle von Empfehlungen/vorhergesagten Bewertungen.