13

Costruisco un semplice sistema di suggerimenti per il DB MovieLens ispirato allo https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html.Come aggiornare Spark MatrixFactorizationModel per ALS

Ho anche problemi con l'allenamento esplicito come qui: Apache Spark ALS collaborative filtering results. They don't make sense L'utilizzo del training implicito (su dati espliciti e impliciti) mi dà risultati ragionevoli, ma l'addestramento esplicito no.

Mentre questo è ok per me ormai, sono curioso su come aggiornare un modello. Mentre la mia soluzione attuale funziona come

  1. avere tutte le valutazioni degli utenti
  2. generare modello
  3. ottenere suggerimenti per l'utente

voglio avere un flusso simile a questo:

  1. avere una base di valutazioni
  2. genera il modello una volta (opzionale salva & carico IT)
  3. ottenere qualche feedback da un utente su 10 film casuali (non nel modello!)
  4. ottenere raccomandazioni utilizzando il modello e le nuove valutazioni degli utenti

Perciò devo aggiornare il mio modello, senza completamente ricalcarlo. C'è qualche possibilità di farlo?

Mentre il primo modo è buono per l'elaborazione in batch (come la generazione di raccomandazioni nei lotti notturni) il secondo modo sarebbe positivo per la generazione di raccomandazioni quasi live.

+0

Vedi anche questa domanda simile http://stackoverflow.com/questions/28724639/how-to-augment-matrix-factors-in-spark- als-recommender –

+0

Inoltre, http://stackoverflow.com/questions/40809876/apache-spark-als-how-to-perform-live-recommendations-fold-in-anonym-user?rq=1 –

risposta

0

Sembra che tu voglia fare una specie di online learning. Questa è l'idea che stai effettivamente aggiornando il modello mentre ricevi i dati. Spark MLLib ha opzioni limitate per l'apprendimento della macchina in streaming. C'è uno streaming linear regression e uno streaming K-Means.

Molti problemi di apprendimento automatico funzionano perfettamente con soluzioni batch, forse la riqualificazione del modello ogni poche ore o giorni. Probabilmente ci sono strategie per risolvere questo.

Un'opzione potrebbe essere un modello di insieme in cui si combinano i risultati della SLA con un altro modello che aiuta a fare previsioni su film non visti.

Se si prevede di vedere molti film inediti, il filtro collaborativo probabilmente non fa ciò che si desidera. Se quei nuovi film non sono affatto nel modello, non c'è modo per il modello di sapere quali altre persone che hanno guardato quelli che hanno gradito.

Un'opzione migliore potrebbe essere quella di adottare una strategia diversa e provare qualche tipo di analisi semantica latente sui film e sui concetti di modello di cosa sia un film (come genere, temi, ecc ...), in questo modo i nuovi film con varie proprietà e adattarsi a un modello esistente, e le valutazioni influenzano la forza con cui queste proprietà interagiscono tra loro.

5

Modifica: il seguente ha funzionato per me perché avevo valutazioni di feedback implicite ed era interessante solo nel classificare i prodotti per un nuovo utente. Maggiori dettagli here


Si può effettivamente ottenere le previsioni per i nuovi utenti che utilizzano il modello di formazione (senza aggiornarlo):

Per ottenere le previsioni per un utente nel modello, si utilizza la sua rappresentazione latente (vettore di dimensione f (numero di fattori)), che viene moltiplicato per la matrice del fattore latente del prodotto (matrice costituita dalle rappresentazioni latenti di tutti i prodotti, un gruppo di vettori di dimensione f) e fornisce un punteggio per ciascun prodotto. Per i nuovi utenti, il problema è che non si ha accesso alla loro rappresentazione latente (si ha solo la rappresentazione completa della dimensione M (numero di prodotti diversi), ma ciò che si può fare è usare una funzione di similarità per calcolare una latente simile rappresentazione per questo nuovo utente moltiplicandola per la trasposizione della matrice del prodotto

cioè se l'utente è la matrice latente è u e la matrice del prodotto è latente v, per l'utente i nel modello, ottieni punteggi facendo: u_i * v per un nuovo utente, non hai una rappresentazione latente, quindi prendi la rappresentazione completa full_u e fai: full_u * v^t * v Questo approssimerà i fattori latenti per i nuovi utenti e dovrebbe fornire raccomandazioni ragionevoli (se il modello fornisce già raccomandazioni ragionevoli per gli utenti esistenti)

Per rispondere alla domanda di formazione, questo consente di calcolare le previsioni per i nuovi utenti senza dover eseguire il calcolo pesante del modello che ora è possibile eseguire solo una volta ogni tanto. Quindi hai l'elaborazione in batch di notte e puoi ancora fare previsioni per il nuovo utente durante il giorno.

Nota: MLLIB permette di accedere alla matrice uev

+0

ho aggiunto un nuovo post basato su questo: http://stackoverflow.com/questions/41537470/als-model-how-to-generate-full-u-vt-v –