Spark ALS: raccomandare per i nuovi utenti


10

La domanda

Come posso prevedere la valutazione per un nuovo utente in un modello ALS addestrato in Spark? (Nuovo = non visto durante il tempo di allenamento)

Il problema

Sto seguendo il tutorial ufficiale di Spark ALS qui:

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

Sono in grado di creare un buon consulente con un MSE decente ma sto lottando su come inserire nuovi dati nel modello. Il tutorial modifica le valutazioni del primo utente prima dell'allenamento, ma questo è davvero un trucco. Danno il seguente suggerimento:

9.2. Fattori di matrice in aumento:

In questo tutorial, aggiungiamo le tue valutazioni al set di formazione. Un modo migliore per ottenere i consigli per te consiste nell'addestrare prima un modello di fattorizzazione a matrice e poi aumentare il modello usando le tue valutazioni. Se questo ti sembra interessante, puoi dare un'occhiata all'implementazione di MatrixFactorizationModel e vedere come aggiornare il modello per i nuovi utenti e i nuovi film.

L'implementazione non mi aiuta affatto. Idealmente, sto cercando qualcosa come:

predictions = model.predictAllNew(newinput)

Ma non esiste tale metodo. Potrei andare a modificare il RDD originale, ma penso che mi richiederebbe di riqualificare il modello, quindi non sarebbe nemmeno una soluzione ideale. Sicuramente ci deve essere un modo più elegante?

Dove sono adesso:

Penso di aver bisogno di trovare la rappresentazione latente del nuovo vettore. Secondo il documento originale possiamo calcolarlo in questo modo:

Xu=(YTCuY+λio)-1YTCup(u)

Ma quando calcolo usando i valori nel documento, non corrisponde ai valori del modello. Correggo l'alfa e il parametro di regolarizzazione, ma penso che l'implementazione MLLIB abbia un'implementazione diversa . Qui è definito (vedi riga 1304), ma non essendo esperto in Scala, è molto difficile decodificare per me ...Cu

Il mio tentativo attuale:

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

Ma questo non corrisponde.

Risposte:


9

Molte domande qui. Innanzitutto, per un utente veramente nuovo senza dati, non è possibile utilizzare un modello di raccomandazione. Se non hai letteralmente informazioni sull'utente, l'unica cosa che puoi fare è fornire alcuni consigli predefiniti.

Naturalmente, una volta che si dispone di dati e è possibile ricostruire il modello per incorporare l'utente, è possibile formulare raccomandazioni. Puoi farlo in Spark ma lo sai già. Questo richiederà troppo tempo se è necessario aggiungere informazioni sui nuovi utenti in fase di esecuzione. La tecnica che desideri si chiama "fold-in", usata per capire quale sia il nuovo vettore utente (approssimativamente) dati gli elementi con cui l'utente interagisce. È solo un'algebra lineare e segue l'equazione che dai.

Ho estratto una vecchia diapositiva che potrebbe aiutare:

ALS Fold-In

Il "Cu" non è molto diverso. Ho aggiunto un 'estensione' per gestire il caso di input negativo, ma è lo stesso per input positivo.

Ecco un'implementazione di fold-in, anche se penso che sarà troppo denso per essere di grande valore:

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

Il calcolo del nuovo vettore utente implicato da un'interazione utente-elemento è un'algebra lineare abbastanza semplice. La parte difficile che ho trovato è decidere quanto pesare.

Spero che sia una spinta nella giusta direzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.