Ma to na celu odpowiedzieć na pytanie „jak to zrobić” dla tych, którzy chcą praktycznie wdrożyć rzadkie zalecenia SVD lub sprawdzić kod źródłowy w celu uzyskania szczegółowych informacji. Do modelowania sparse-SVD można użyć gotowego oprogramowania FOSS. Na przykład vowpal wabbit
, libFM
albo redsvd
.
vowpal wabbit
ma 3 implementacje algorytmów „podobnych do SVD” (każdy do wyboru za pomocą jednej z 3 opcji wiersza poleceń). Ściśle mówiąc, należy je nazwać „przybliżonym, iteracyjnym rozkładem macierzy”, a nie czystym „klasycznym” SVD ", ale są one ściśle powiązane z SVD. Można je traktować jako bardzo wydajne obliczeniowo przybliżone rozkładanie SVD rzadkiego (głównie zera) macierz.
Oto pełny, działający przepis na robienie rekomendacji filmowych w stylu Netflix z vowpal wabbit
jego --lrq
opcją „niskiej pozycji kwadratowej” ( ), która wydaje mi się najlepsza dla mnie:
Plik formatu zestawu danych ratings.vw
(każda ocena w jednym wierszu według użytkownika i filmu):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Gdzie 1. liczba to ocena (od 1 do 5 gwiazdek), po której następuje identyfikator użytkownika, który ocenił oraz identyfikator filmu, który został oceniony.
Dane testowe mają ten sam format, ale mogą (opcjonalnie) pominąć kolumnę ocen:
|user 1 |movie 234
|user 12 |movie 1019
...
opcjonalnie, ponieważ do oceny / testowania prognoz potrzebujemy ocen, aby porównać prognozy. Jeśli pominiemy oceny, vowpal wabbit
nadal będziemy przewidywać oceny, ale nie będziemy w stanie oszacować błędu prognozowania (wartości prognozowane vs. wartości rzeczywiste w danych).
Aby trenować, prosimy vowpal wabbit
o znalezienie zestawu N
ukrytych czynników interakcji między użytkownikami a filmami, które lubią (lub nie lubią). Możesz myśleć o tym jako o znajdowaniu wspólnych tematów, w których podobni użytkownicy oceniają podzbiór filmów w podobny sposób i używaniu tych wspólnych motywów, aby przewidzieć, jak użytkownik oceni film, którego jeszcze nie ocenił.
vw
opcje i argumenty, których musimy użyć:
--lrq <x><y><N>
znajduje „ukryte kwadratowe” czynniki utajone.
<x><y>
: „um” oznacza krzyżyk u [ser] i m [ovie] przestrzeni nazw w zbiorze danych. Zauważ, że z pierwszą --lrq
opcją używana jest tylko pierwsza litera w każdej przestrzeni nazw .
<N>
: N=14
poniżej znajduje się liczba ukrytych czynników, które chcemy znaleźć
-f model_filename
: napisz ostateczny model do model_filename
Tak więc proste polecenie pełnego szkolenia byłoby:
vw --lrq um14 -d ratings.vw -f ratings.model
Po uzyskaniu ratings.model
pliku modelu możemy go wykorzystać do przewidywania dodatkowych ocen dla nowego zestawu danych more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Prognozy zostaną zapisane do pliku more_ratings.predicted
.
Korzystając demo/movielens
z vowpalwabbit
drzewa źródłowego, otrzymuję ~ 0,693 MAE (średni błąd bezwzględny) po przeszkoleniu 1 miliona ocen użytkowników / filmów ml-1m.ratings.train.vw
z 14 ukrytymi czynnikami (co oznacza, że macierz środkowa SVD ma matrycę 14 x 14 wierszy x kolumny) i testuje na niezależnym zestaw testowy ml-1m.ratings.test.vw
. Jak dobra jest 0.69 MAE? Dla pełnego zakresu możliwych prognoz, w tym przypadku bez oceny (0) [0 do 5], błąd 0,69 wynosi ~ 13,8% (0,69 / 5,0) pełnego zakresu, tj. Około 86,2% dokładności (1 - 0,138).
Przykłady i pełną wersję demonstracyjną podobnego zestawu danych (movielens) z dokumentacją można znaleźć w vowpal wabbit
drzewie źródeł na github:
Uwagi:
movielens
Demo wykorzystuje kilka opcji pominąłem (dla uproszczenia) z moim przykładzie: w szczególności --loss_function quantile
, --adaptive
oraz--invariant
--lrq
Realizacja w vw
to dużo szybciej niż --rank
w szczególności podczas zapisywania i wczytywania modeli.
Kredyty:
--rank
Opcja vw została wdrożona przez Jake'a Hofmana
--lrq
Opcja vw (z opcjonalnym rezygnacją) została zaimplementowana przez Paula Minero
- wedpal wabbit (alias vw) jest dzieckiem mózgu Johna Langforda