Hiermit soll versucht werden, den Teil der Frage zu beantworten, der sich an diejenigen richtet, die Sparse-SVD-Empfehlungen praktisch umsetzen oder den Quellcode auf Details überprüfen möchten. Sie können eine handelsübliche FOSS-Software verwenden, um dünn besetzte SVDs zu modellieren. Zum Beispiel vowpal wabbit
, libFM
oder redsvd
.
vowpal wabbit
verfügt über 3 Implementierungen von "SVD-ähnlichen" Algorithmen (jeweils mit einer von 3 Befehlszeilenoptionen auswählbar). Streng genommen sollten diese als "ungefähre, iterative Matrixfaktorisierung" und nicht als reine "klassische" SVD bezeichnet werden, sie sind jedoch eng mit der SVD verwandt Nullen) Matrix.
Hier ist ein komplettes, funktionierendes Rezept für die Umsetzung von Filmempfehlungen im Netflix-Stil mit der für mich am besten geeigneten Option vowpal wabbit
"low-ranked quadratic" ( --lrq
):
Datei im Datensatzformat ratings.vw
(jede Bewertung in einer Zeile nach Benutzer und Film):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Dabei ist die erste Zahl die Bewertung (1 bis 5 Sterne), gefolgt von der ID des bewerteten Benutzers und der Film-ID, die bewertet wurde.
Die Testdaten haben dasselbe Format, können jedoch (optional) die Bewertungsspalte weglassen:
|user 1 |movie 234
|user 12 |movie 1019
...
Optional, weil wir zum Bewerten / Testen von Vorhersagen Bewertungen benötigen, mit denen die Vorhersagen verglichen werden können. Wenn wir die Bewertungen weglassen, werden die Bewertungen vowpal wabbit
weiterhin vorhergesagt, können aber den Vorhersagefehler nicht abschätzen (vorhergesagte Werte im Vergleich zu tatsächlichen Werten in den Daten).
Zum Trainieren fragen wir vowpal wabbit
nach einer Reihe N
latenter Interaktionsfaktoren zwischen Benutzern und Filmen, die sie mögen (oder nicht mögen). Sie können sich das so vorstellen, dass Sie allgemeine Themen suchen, bei denen ähnliche Benutzer eine Teilmenge von Filmen auf ähnliche Weise bewerten, und anhand dieser allgemeinen Themen vorhersagen, wie ein Benutzer einen Film bewerten würde, den er noch nicht bewertet hat.
vw
Optionen und Argumente, die wir verwenden müssen:
--lrq <x><y><N>
findet "niedrigrangige quadratische" latente Faktoren.
<x><y>
: "um" bedeutet, dass die Namensräume "users" und "m" im Datensatz gekreuzt werden. Beachten Sie, dass bei der --lrq
Option nur der erste Buchstabe in jedem Namensraum verwendet wird .
<N>
: N=14
unten ist die Anzahl der latenten Faktoren, die wir finden möchten
-f model_filename
: Schreiben Sie das endgültige Modell in model_filename
Ein einfacher vollständiger Trainingsbefehl wäre also:
vw --lrq um14 -d ratings.vw -f ratings.model
Sobald wir die ratings.model
Modelldatei haben, können wir sie verwenden, um zusätzliche Bewertungen für einen neuen Datensatz vorherzusagen more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Die Vorhersagen werden in die Datei geschrieben more_ratings.predicted
.
Unter Verwendung demo/movielens
des vowpalwabbit
Quellbaums erhalte ich nach dem Training mit 1 Million Benutzer- / Filmbewertungen ml-1m.ratings.train.vw
mit 14 Latentfaktoren (was bedeutet, dass die mittlere SVD-Matrix eine Matrix mit 14 × 14 Zeilen × Spalten ist) und dem Testen auf der unabhängigen Basis ~ 0,693 MAE (mittlerer absoluter Fehler) Test-Set ml-1m.ratings.test.vw
. Wie gut ist 0,69 MAE? Für den gesamten Bereich möglicher Vorhersagen, einschließlich des Falls ohne Bewertung (0) [0 bis 5], beträgt ein Fehler von 0,69 ~ 13,8% (0,69 / 5,0) des gesamten Bereichs, dh ungefähr 86,2% Genauigkeit (1 - 0,138).
Beispiele und eine vollständige Demo für einen ähnlichen Datensatz (movielens) mit Dokumentation finden Sie im vowpal wabbit
Quellbaum von github:
Anmerkungen:
- Die
movielens
Demo verwendet mehrere Optionen I ( der Einfachheit halber) weggelassen aus meinem Beispiel: insbesondere --loss_function quantile
, --adaptive
und--invariant
- Die
--lrq
Implementierung vw
ist wesentlich schneller als --rank
insbesondere beim Speichern und Laden der Modelle.
Credits:
--rank
Die vw-Option wurde von Jake Hofman implementiert
--lrq
Die Option vw (mit optionalem Dropout) wurde von Paul Minero implementiert
- vowpal wabbit (alias vw) ist das Gehirnkind von John Langford