Questo per cercare di rispondere alla parte "come" della domanda per coloro che vogliono implementare praticamente raccomandazioni sparse-SVD o ispezionare il codice sorgente per i dettagli. È possibile utilizzare un software FOSS standard per modellare SVD sparse. Ad esempio, vowpal wabbit
, libFM
, o redsvd
.
vowpal wabbit
ha 3 implementazioni di algoritmi "simili a SVD" (ciascuno selezionabile da una delle 3 opzioni della riga di comando). A rigor di termini, questi dovrebbero essere chiamati "fattorizzazione approssimativa, iterativa, matriciale" piuttosto che pura "classica" SVD ", ma sono strettamente correlati alla SVD. Potresti considerarli come una fattorizzazione SVD approssimativa molto efficiente dal punto di vista computazionale di uno scarso (principalmente zero) matrice.
Ecco una ricetta completa e funzionante per fare consigli sui film in stile Netflix con vowpal wabbit
e la sua --lrq
opzione "quadratica di basso livello" ( ) che sembra funzionare meglio per me:
File di formato del set di dati ratings.vw
(ogni valutazione su una riga per utente e film):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Dove il 1 ° numero è la valutazione (da 1 a 5 stelle) seguita dall'ID dell'utente che ha valutato e dall'ID del film che è stato valutato.
I dati di test sono nello stesso formato ma possono (facoltativamente) omettere la colonna delle classifiche:
|user 1 |movie 234
|user 12 |movie 1019
...
facoltativamente perché per valutare / testare le previsioni abbiamo bisogno di valutazioni per confrontare le previsioni. Se omettiamo le valutazioni, vowpal wabbit
continueremo a prevedere le valutazioni ma non saremo in grado di stimare l'errore di previsione (valori previsti rispetto ai valori effettivi nei dati).
Per allenarci chiediamo vowpal wabbit
di trovare una serie di N
fattori di interazione latenti tra utenti e film che gli piacciono (o che non amano). Potresti pensare a questo come trovare temi comuni in cui utenti simili valutano un sottoinsieme di film in modo simile e utilizzare questi temi comuni per prevedere come un utente classificherebbe un film che non ha ancora valutato.
vw
opzioni e argomenti che dobbiamo usare:
--lrq <x><y><N>
trova fattori latenti "quadratici di basso rango".
<x><y>
: "um" significa attraversare gli spazi dei nomi u [sers] e m [ovie] nel set di dati. Si noti che solo l' --lrq
opzione 1a in ogni spazio dei nomi viene utilizzata con l' opzione.
<N>
: N=14
sotto è il numero di fattori latenti che vogliamo trovare
-f model_filename
: scrivi il modello finale in model_filename
Quindi un semplice comando di allenamento completo sarebbe:
vw --lrq um14 -d ratings.vw -f ratings.model
Una volta che abbiamo il ratings.model
file modello, possiamo usarlo per prevedere valutazioni aggiuntive su un nuovo set di dati more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Le previsioni verranno scritte nel file more_ratings.predicted
.
Usando demo/movielens
nella struttura dei vowpalwabbit
sorgenti, ottengo ~ 0,693 MAE (Mean Absolute Error) dopo l'allenamento su 1 milione di valutazioni utente / film ml-1m.ratings.train.vw
con 14 fattori latenti (il che significa che la matrice media SVD è una matrice 14x14 righe x colonne) e test sull'indipendente set di test ml-1m.ratings.test.vw
. Quanto è buono 0.69 MAE? Per l'intera gamma di possibili previsioni, incluso il caso non classificato (0) [da 0 a 5], un errore dello 0,69 è ~ 13,8% (0,69 / 5,0) dell'intero intervallo, ovvero circa l'86,2% di precisione (1 - 0,138).
Puoi trovare esempi e una demo completa per un set di dati simile (movielens) con documentazione nella struttura dei vowpal wabbit
sorgenti su github:
Gli appunti:
- La
movielens
demo utilizza diverse opzioni ho omesso (per semplicità) dal mio esempio: in particolare --loss_function quantile
, --adaptive
e--invariant
- L'
--lrq
implementazione vw
è molto più rapida di --rank
, in particolare durante l'archiviazione e il caricamento dei modelli.
Crediti:
--rank
l'opzione vw è stata implementata da Jake Hofman
--lrq
l'opzione vw (con dropout opzionale) è stata implementata da Paul Minero
- vowpal wabbit (aka vw) è il figlio del cervello di John Langford