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, libFMalbo redsvd.
vowpal wabbitma 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 wabbitjego --lrqopcją „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 wabbitnadal 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 wabbito znalezienie zestawu Nukrytych 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ą --lrqopcją używana jest tylko pierwsza litera w każdej przestrzeni nazw .
<N>: N=14poniż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.modelpliku 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/movielensz vowpalwabbitdrzewa ź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.vwz 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 wabbitdrzewie źródeł na github:
Uwagi:
movielensDemo wykorzystuje kilka opcji pominąłem (dla uproszczenia) z moim przykładzie: w szczególności --loss_function quantile, --adaptiveoraz--invariant
--lrqRealizacja w vwto dużo szybciej niż --rankw 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