Це потрібно спробувати відповісти на питання "як це зробити" для тих, хто хоче практично реалізувати рекомендації з обмеженим SVD або перевірити вихідний код на предмет деталей. Для моделювання sparse-SVD можна використовувати програмне забезпечення FOSS, що не використовується на постійній основі. Так , наприклад, 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 МАЕ (середня абсолютна помилка) після тренування на 1 мільйон рейтингів користувачів / фільмів ml-1m.ratings.train.vw
з 14 латентними факторами (мається на увазі, що середня матриця SVD є матрицею 14x14 рядків x стовпчиками) та тестування на незалежній тестовий набір ml-1m.ratings.test.vw
. Наскільки добре 0,69 МАЕ? Для повного діапазону можливих прогнозів, включаючи неоцінений (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) є мозком дитини Джона Лангфорда