Spark ALS: Empfehlung für neue Benutzer

10

Die Frage

Wie kann ich die Bewertung für einen neuen Benutzer in einem in Spark geschulten ALS-Modell vorhersagen? (Neu = während der Trainingszeit nicht gesehen)

Das Problem

Ich folge hier dem offiziellen Spark ALS-Tutorial:

http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html

Ich bin in der Lage, eine gute Empfehlung mit einer anständigen MSE zu erstellen, aber ich habe Probleme damit, neue Daten in das Modell einzugeben. Das Tutorial ändert die Bewertungen des ersten Benutzers vor dem Training, aber das ist wirklich ein Hack. Sie geben folgenden Hinweis:

9.2. Matrixfaktoren erweitern:

In diesem Tutorial fügen wir Ihre Bewertungen dem Trainingssatz hinzu. Eine bessere Möglichkeit, die Empfehlungen für Sie zu erhalten, besteht darin, zuerst ein Matrixfaktorisierungsmodell zu trainieren und das Modell dann anhand Ihrer Bewertungen zu erweitern. Wenn dies für Sie interessant klingt, können Sie sich die Implementierung von MatrixFactorizationModel ansehen und sehen, wie Sie das Modell für neue Benutzer und neue Filme aktualisieren.

Die Implementierung hilft mir allerdings überhaupt nicht. Idealerweise suche ich etwas wie:

predictions = model.predictAllNew(newinput)

Eine solche Methode gibt es jedoch nicht. Ich könnte das ursprüngliche RDD modifizieren, aber ich denke, dafür müsste ich das Modell neu trainieren, sodass dies auch keine ideale Lösung wäre. Sicherlich muss es einen eleganteren Weg geben?

Wo ich gerade bin:

Ich denke, ich muss die latente Darstellung des neuen Vektors finden. Nach dem Originalpapier können wir dies folgendermaßen berechnen:

Xu=(YTCuY+λI)1YTCup(u)

Cu

Mein aktueller Versuch:

V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y

Cui =  alpha * np.abs(newinput)
Cui =  (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)

lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term   = np.dot(np.dot(Vt,Cui),V)+lambdaI
term   = np.dot(np.linalg.inv(term),Vt)
term   = np.dot(term,Cui)
term   = np.dot(term,newinput)
latentinput = term

Das passt aber nicht zusammen.

ciri
quelle

Antworten:

9

Viele Fragen hier. Erstens gibt es für einen wirklich neuen Benutzer ohne Daten keine Möglichkeit, ein Empfehlungsmodell zu verwenden. Wenn Sie buchstäblich keine Informationen über den Benutzer haben, können Sie nur einige Standardempfehlungen geben.

Sobald Sie Daten haben und das Modell neu erstellen können, um den Benutzer einzubeziehen, können Sie natürlich Empfehlungen aussprechen. Sie können das in Spark tun, aber das wissen Sie bereits. Dies dauert zu lange, wenn Sie zur Laufzeit Informationen zu neuen Benutzern hinzufügen müssen. Die gewünschte Technik heißt "Fold-In" und wird verwendet, um herauszufinden, wie der neue Benutzervektor (ungefähr) bei den Elementen aussieht, mit denen der Benutzer interagiert. Es ist nur eine lineare Algebra und folgt aus der von Ihnen angegebenen Gleichung.

Ich habe eine alte Folie ausgegraben, die helfen könnte:

ALS Fold-In

Das "Cu" ist nicht wirklich anders. Ich habe eine 'Erweiterung' hinzugefügt, um den Fall einer negativen Eingabe zu behandeln, aber dies gilt auch für eine positive Eingabe.

Hier ist eine Implementierung von Fold-In, obwohl ich denke, dass es zu dicht sein wird, um von großem Wert zu sein:

https://github.com/OryxProject/oryx/blob/2c01d496f93f2825a076eb7fe492aa39a5290aa6/app/oryx-app-common/src/main/java/com/cloudera/oryx/app/als/ALSUtils.java#L

Das Berechnen des neuen Benutzervektors, der durch eine Benutzer-Element-Interaktion impliziert wird, ist eine ziemlich einfache lineare Algebra. Der schwierige Teil, den ich gefunden habe, ist zu entscheiden, wie viel es gewichtet werden soll.

Hoffe das ist ein Schub in die richtige Richtung.

Sean Owen
quelle