Это попытка ответить на вопрос «как» для тех, кто хочет практически реализовать рекомендации с разреженным SVD или проверить исходный код на предмет деталей. Вы можете использовать готовое программное обеспечение FOSS для моделирования SVD. Так , например, vowpal wabbit
, libFM
, или redsvd
.
vowpal wabbit
имеет 3 реализации "SVD-подобных" алгоритмов (каждый выбирается одним из 3 параметров командной строки). Строго говоря, их следует называть «приближенной, итеративной, факторизацией матрицы», а не чистой «классической» SVD, но они тесно связаны с SVD. Вы можете думать о них как об очень эффективной в вычислительном отношении приближенной SVD-факторизации разреженного (в основном нули) матрица.
Вот полный, рабочий рецепт для выполнения рекомендаций по фильму в стиле Netflix с vowpal wabbit
его --lrq
опцией «квадратичного ранга низкого ранга» ( ), которая, кажется, работает лучше всего для меня:
Файл формата набора данных ratings.vw
(каждая оценка в одной строке по пользователю и фильму):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Где 1-е число - это рейтинг (от 1 до 5 звезд), за которым следует идентификатор пользователя, который оценил, и идентификатор фильма, который был оценен.
Тестовые данные в том же формате, но могут (необязательно) опустить столбец оценок:
|user 1 |movie 234
|user 12 |movie 1019
...
необязательно, потому что для оценки / проверки прогнозов нам нужны рейтинги для сравнения прогнозов. Если мы опускаем рейтинги, vowpal wabbit
все равно будем прогнозировать рейтинги, но не сможем оценить ошибку прогноза (прогнозные значения против фактических значений в данных).
Для обучения мы просим vowpal wabbit
найти набор N
скрытых факторов взаимодействия между пользователями и фильмами, которые им нравятся (или не нравятся). Вы можете думать об этом, как о поиске общих тем, где похожие пользователи оценивают подмножество фильмов подобным образом, и об использовании этих общих тем, чтобы предсказать, как пользователь оценит фильм, который он еще не оценил.
vw
Параметры и аргументы, которые мы должны использовать:
--lrq <x><y><N>
находит «квадратичные» ранговые факторы низкого ранга.
<x><y>
: "um" означает пересечение пространств имен u [sers] и m [ovie] в наборе данных. Обратите внимание, что только 1-я буква в каждом пространстве имен используется с --lrq
опцией.
<N>
: N=14
ниже приведено количество скрытых факторов, которые мы хотим найти
-f model_filename
: напишите окончательную модель в model_filename
Таким образом, простая команда полного обучения будет:
vw --lrq um14 -d ratings.vw -f ratings.model
Получив ratings.model
файл модели, мы можем использовать его для прогнозирования дополнительных рейтингов для нового набора данных more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Прогнозы будут записаны в файл more_ratings.predicted
.
Используя demo/movielens
в vowpalwabbit
исходном дереве, я получаю ~ 0,693 MAE (средняя абсолютная ошибка) после обучения 1 миллиону пользователей / рейтингов фильмов ml-1m.ratings.train.vw
с 14 скрытыми факторами (это означает, что средняя матрица SVD представляет собой матрицу 14х14 строк x столбцов) и тестирование на независимой тест-набор ml-1m.ratings.test.vw
. Насколько хорошо 0,69 MAE? Для полного диапазона возможных прогнозов, включая случай без оценки (0) [от 0 до 5], ошибка 0,69 составляет ~ 13,8% (0,69 / 5,0) от полного диапазона, то есть точность около 86,2% (1 - 0,138).
Вы можете найти примеры и полную демонстрацию для подобного набора данных (movielens) с документацией в vowpal wabbit
дереве исходников на github:
Заметки:
movielens
Демо использует несколько вариантов я опущенные (для простоты) из моего примера: в частности --loss_function quantile
, --adaptive
и--invariant
--lrq
Реализация в vw
гораздо быстрее , чем --rank
, в частности , при хранении и загрузке моделей.
Кредиты:
--rank
опция vw была реализована Джейком Хофманом
--lrq
Опция vw (с необязательным выпадением) была реализована Полом Минеро
- vowpal wabbit (он же vw) - детище мозга Джона Лэнгфорда