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, libFMou redsvd.
vowpal wabbita 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 wabbitet son --lrqoption "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 wabbitpré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 wabbitde trouver un ensemble de Nfacteurs 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' --lrqoption.
<N>: N=14ci-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.modelfichier 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/movielensdans l' vowpalwabbitarborescence 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.vwavec 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 wabbitarborescence source sur github:
Remarques:
- La
movielensdémo utilise plusieurs options que j'OMISE (pour simplifier) de mon exemple: en particulier --loss_function quantile, --adaptiveet--invariant
- L'
--lrqimplémentation en vwest 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