5

Sto utilizzando Spark per creare un prototipo di sistema di raccomandazione. Dopo aver esaminato alcuni tutorial, sono stato in grado di addestrare uno MatrixFactorizationModel dai miei dati.Spark - Come utilizzare il modello raccomandato del recommender in produzione?

Tuttavia, il modello addestrato da Spark mllib è solo uno Serializable. Come posso usare questo modello per fare raccomandazioni per utenti reali? Voglio dire, come posso mantenere il modello in una sorta di database o aggiornarlo se i dati dell'utente sono stati incrementati?

Ad esempio, il modello addestrato dalla libreria dei consigli di Mahout può essere archiviato in database come Redis, quindi è possibile richiedere l'elenco di articoli consigliato in seguito. Ma come possiamo fare cose simili in Spark? Qualche suggerimento?

risposta

8

In primo luogo, il "modello" a cui ti riferisci da Mahout non è un modello, ma un elenco precompilato di raccomandazioni. Puoi farlo anche con Spark e calcolare in batch i consigli per gli utenti e mantenerli ovunque desideri. Questo non ha nulla a che fare con la serializzazione di un modello. Se non vuoi fare aggiornamenti o segnare in tempo reale, puoi fermarti lì e usare Spark per batch proprio come fai con Mahout.

Ma concordo sul fatto che in molti casi si desidera spedire il modello da qualche altra parte e servirlo. Come puoi vedere, altri modelli di Spark sono Serializable, ma non MatrixFactorizationModel. (Sì, anche se è contrassegnato come tale, non verrà serializzato.) Allo stesso modo, esiste una serializzazione standard per i modelli predittivi denominata PMML ma non contiene alcun vocabolario per un modello di matrice fattorizzato.

Il motivo è in realtà lo stesso. Mentre molti modelli predittivi, come un modello SVM o di regressione logistica, sono solo un piccolo insieme di coefficienti, un modello a matrice fattoriale è enorme, contenente due matrici con potenzialmente miliardi di elementi. Questo è il motivo per cui penso che PMML non abbia alcuna codifica ragionevole per questo.

Allo stesso modo, in Spark, ciò significa che le matrici effettive sono RDD s che non possono essere serializzate direttamente. È possibile mantenere questi RDD in memoria, rileggerli altrove con Spark e ricreare a mano uno MatrixFactorizationModel in questo modo.

Non è possibile servire o aggiornare il modello utilizzando Spark. Per questo stai veramente cercando di scrivere del codice per eseguire aggiornamenti e calcolare i consigli al volo.

Non mi interessa suggerire qui il progetto Oryx, poiché il suo punto è gestire esattamente questo aspetto, in particolare per la raccomandazione ALS. In effetti, il progetto Oryx 2 è basato su Spark e, sebbene in alpha, contiene già la pipeline completa per serializzare e servire l'output di MatrixFactorizationModel. Non so se soddisfi le tue esigenze, ma potrebbe essere almeno un punto di riferimento interessante.

+0

Grazie per la tua eccellente e dettagliata spiegazione! Proverò Oryx :) – shihpeng

2

Un altro metodo per la creazione di recs con Spark è il metodo del motore di ricerca. Questo è fondamentalmente un consiglio di co-promozione servito da Solr o Elasticsearch. Il confronto tra fattori fattoriali e occorrenze è al di là di questa domanda, quindi descriverò semplicemente quest'ultimo.

Si alimentano le interazioni (user-id, item-id) in spark-itemsimilarity di Mahout. Questo produce un elenco di oggetti simili per ogni oggetto visto nei dati di interazione. Uscirà di default come csv e quindi può essere memorizzato ovunque. Ma ha bisogno di essere indicizzato da un motore di ricerca.

In ogni caso quando si desidera recuperare recs si utilizza la cronologia dell'utente come query, si ottiene un elenco ordinato di elementi come rec.

Un vantaggio di questo metodo è che gli indicatori possono essere calcolati per tutte le azioni utente che si desidera. Qualsiasi azione intrapresa dall'utente correlata a ciò che si desidera raccomandare può essere utilizzata. Ad esempio se si desidera consigliare un acquisto ma si registrano anche le visualizzazioni del prodotto. Se hai trattato le visualizzazioni del prodotto allo stesso modo degli acquisti probabilmente avresti recs peggiori (l'ho provato). Tuttavia, se si calcola un indicatore per gli acquisti e un altro indicatore (in realtà incrociato) per le visualizzazioni del prodotto, sono ugualmente predittivi degli acquisti. Questo ha l'effetto di aumentare i dati usati per i recs. Lo stesso tipo di cosa può essere fatto con le posizioni degli utenti per fondere le informazioni sulla posizione nei registri di acquisto.

È inoltre possibile distorcere i propri recs in base al contesto. Se ci si trova nella sezione "elettronica" di un catalogo, è possibile che i recs siano inclinati verso l'elettronica. Aggiungi l'elettronica alla query rispetto al campo di metadati della categoria "categoria" e dai una spinta alla query e hai recs di parte.

Poiché tutto il biasing e il mix di indicatori si verificano nella query, rende il motore di recs facilmente sintonizzato su più contesti pur mantenendo solo una query multi-campo effettuata tramite un motore di ricerca. Otteniamo la scalabilità da Solr o Elasticsearch.

Un altro vantaggio della fattorizzazione o del metodo di ricerca è che gli utenti completamente nuovi e la nuova cronologia possono essere utilizzati per creare registri in cui i più vecchi consiglieri di Mahout potevano solo consigliare agli utenti e alle interazioni note quando il lavoro è stato eseguito.

Descrizioni qui:

0

È possibile utilizzare la funzione di .save (sparkContext, outputFolder) per salvare il modello in una cartella a scelta. Mentre si forniscono le raccomandazioni in tempo reale, è sufficiente utilizzare la funzione MatrixFactorizationModel.load (sparkContext, modelFolder) per caricarla come oggetto MatrixFactorizationModel.

Una domanda a @Sean Owen: Non il MatrixFactorizationObject contengono le matrici di fattorizzazione: facilità d'uso funzionalità e la voce di funzionalità matrici invece di raccomandazioni/predetto rating.