3

J'écris un programme spark pour faire des recommandations. Ensuite, j'ai utilisé la bibliothèque ALS.recommendation. Et j'ai fait un petit test avec l'ensemble de données suivant appelé trainData:Se tromper de recommandation avec ALS.recommendation

(u1, m1, 1) 
(u1, m4, 1) 
(u2, m2, 1) 
(u2, m3, 1) 
(u3, m1, 1) 
(u3, m3, 1) 
(u3, m4, 1) 
(u4, m3, 1) 
(u4, m4, 1) 
(u5, m2, 1) 
(u5, m4, 1) 

La première colonne contient l'utilisateur, le second contient les éléments notés par les utilisateurs et le troisième contient les évaluations.

Dans mon code écrit en scala j'ai formé le modèle en utilisant:

myModel = ALS.trainImplicit(trainData, 3, 5, 0.01, 1.0) 

Je tente de récupérer quelques recommandations pour u1 utilisant cette instruction:

recommendations = myModel.recommendProducts(idUser, 2) 

où idUser contient l'ID affecté à l'utilisateur u1 À titre de recommandation, j'obtiens:

(u1, m1, 1.0536233346170754) 
(u1, m4, 0.8540954252858661) 
(u1, m3, 0.09069877419040584) 
(u1, m2, -0.1345521479521654) 

Comme vous pouvez le voir, les deux premières lignes montrent que les éléments recommandés sont ceux que u1 avait déjà notés (m1 et m4). Quel que soit l'utilisateur que je sélectionne pour obtenir les recommandations, j'ai toujours le même comportement (les premiers items recommandés sont ceux que l'utilisateur a déjà notés).

Je trouve ça bizarre! Y a-t-il un problème quelconque?

Répondre

2

Je pense que c'est le comportement attendu de l'utilisation recommendProducts, lorsque vous entraînez un algorithme de factorisation matricielle comme ALS vous essayez de trouver une note qui relie chaque utilisateur à chaque élément. ALS le fait en fonction des éléments que l'utilisateur a déjà évalués, donc quand vous trouvez des recommandations pour un utilisateur donné, le modèle sera très sûr des évaluations qu'il a déjà vues, donc il recommandera la plupart du temps des produits déjà évalué.

Ce que vous devez faire est de garder une liste de produits chaque utilisateur comme évalué et les filtrer au moment de faire les recommandations.

EDIT:

Je creusé un peu dans le code source et les documentations pour être sûr de ce que je disais.

ALS.recommendProducts est implémenté dans la classe MatrixFactorizationModel (source code). Vous pouvez voir là-bas que le modèle en faisant des recommandations ne se soucie pas si l'utilisateur a déjà noté cet élément.

Et vous devriez noter que si vous utilisez des évaluations implicites, alors vous voulez certainement recommander des produits déjà implicitement évalués par l'utilisateur: Imaginez le cas où vos notes implicites sont des pages vues de votre produit dans un magasin en ligne et que vous voulez, c'est que l'utilisateur achète le produit.

Je n'ai pas accès à ce livre Analyse avancée avec Spark donc je ne peux pas commenter les explications et les exemples ici.

Docs:

+0

Je ne sont pas d'accord avec votre réponse. car le comportement attendu que vous décrivez ne correspond pas aux explications et exemples proposés dans le livre "Advanced analytics with Spark". – semteu

+0

mis à jour ma réponse avec des informations de la source et les docs –