Il s'agit d'essayer de répondre à la partie «comment faire» de la question pour ceux qui souhaitent mettre en œuvre pratiquement des recommandations SVD clairsemées ou inspecter le code source pour plus de détails. Vous pouvez utiliser un logiciel FOSS standard pour modéliser un SVD clairsemé. Par exemple, vowpal wabbit
, libFM
ou redsvd
.
vowpal wabbit
a 3 implémentations d'algorithmes "de type SVD" (chacun sélectionnable par l'une des 3 options de ligne de commande). Strictement parlant, ceux-ci devraient être appelés "factorisation matricielle approximative et itérative" plutôt que pure "SVD" classique, mais ils sont étroitement liés à la SVD. Vous pouvez les considérer comme une factorisation SVD approximative très efficace d'un zéros) matrice.
Voici une recette complète et pratique pour faire des recommandations de films de style Netflix avec vowpal wabbit
et son --lrq
option "quadratique de bas rang" ( ) qui semble fonctionner le mieux pour moi:
Fichier de format de jeu de données ratings.vw
(chaque note sur une ligne par utilisateur et film):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Où le 1er numéro est la note (1 à 5 étoiles) suivie de l'ID de l'utilisateur qui a évalué et et l'ID du film qui a été évalué.
Les données de test sont dans le même format mais peuvent (facultativement) omettre la colonne des évaluations:
|user 1 |movie 234
|user 12 |movie 1019
...
éventuellement parce que pour évaluer / tester les prédictions, nous avons besoin de notes pour comparer les prédictions. Si nous omettons les notes, vowpal wabbit
prédira toujours les notes mais ne sera pas en mesure d'estimer l'erreur de prédiction (valeurs prédites par rapport aux valeurs réelles dans les données).
Pour nous entraîner, nous demandons vowpal wabbit
de trouver un ensemble de N
facteurs d'interaction latents entre les utilisateurs et les films qu'ils aiment (ou n'aiment pas). Vous pouvez penser à cela comme trouver des thèmes communs où des utilisateurs similaires évaluent un sous-ensemble de films de la même manière et utiliser ces thèmes communs pour prédire comment un utilisateur évaluera un film qu'il n'a pas encore évalué.
vw
options et arguments que nous devons utiliser:
--lrq <x><y><N>
trouve des facteurs latents "quadratiques de bas rang".
<x><y>
: "um" signifie traverser les espaces de noms u [sers] et m [ovie] dans l'ensemble de données. Notez que seule la 1ère lettre de chaque espace de nom est utilisée avec l' --lrq
option.
<N>
: N=14
ci-dessous le nombre de facteurs latents que nous voulons trouver
-f model_filename
: écrire le modèle final dans model_filename
Ainsi, une simple commande de formation complète serait:
vw --lrq um14 -d ratings.vw -f ratings.model
Une fois que nous avons le ratings.model
fichier modèle, nous pouvons l'utiliser pour prédire des évaluations supplémentaires sur un nouvel ensemble de données more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Les prédictions seront écrites dans le fichier more_ratings.predicted
.
En utilisant demo/movielens
dans l' vowpalwabbit
arborescence source, j'obtiens ~ 0,693 MAE (Mean Absolute Error) après une formation sur 1 million de classements d'utilisateurs / films ml-1m.ratings.train.vw
avec 14 facteurs latents (ce qui signifie que la matrice centrale SVD est une matrice de 14 x 14 lignes x colonnes) et des tests sur le indépendant test-set ml-1m.ratings.test.vw
. Quelle est la qualité de 0,69 MAE? Pour la gamme complète des prédictions possibles, y compris le cas non évalué (0) [0 à 5], une erreur de 0,69 est d'environ 13,8% (0,69 / 5,0) de la gamme complète, soit environ 86,2% de précision (1 - 0,138).
Vous pouvez trouver des exemples et une démo complète pour un ensemble de données similaire (movielens) avec de la documentation dans l' vowpal wabbit
arborescence source sur github:
Remarques:
- La
movielens
démo utilise plusieurs options que j'OMISE (pour simplifier) de mon exemple: en particulier --loss_function quantile
, --adaptive
et--invariant
- L'
--lrq
implémentation en vw
est beaucoup plus rapide que --rank
, notamment lors du stockage et du chargement des modèles.
Crédits:
--rank
l'option vw a été implémentée par Jake Hofman
--lrq
L'option vw (avec suppression facultative) a été implémentée par Paul Minero
- vowpal wabbit (aka vw) est l'enfant du cerveau de John Langford