4

J'essaie de créer un algorithme de filtrage collaboratif pour suggérer des produits à certains utilisateurs.Système de recommandation (SVD) avec TensorFlow

J'ai commencé sous peu et j'ai commencé à travailler avec TensorFlow (je pensais que c'était suffisamment efficace et flexible). J'ai trouvé ce code qui fait ce qui m'intéresse, crée le modèle et forme les ID utilisateur, les produits et les évaluations: https://github.com/songgc/TF-recomm

J'ai lancé le code et entraîné le modèle. Après l'apprentissage du modèle, je devrais faire les prédictions, c'est-à-dire obtenir des suggestions pour chaque utilisateur afin qu'elles puissent être sauvegardées dans un DB auquel j'accède avec une application NODE.js.

Comment puis-je récupérer cette liste de suggestions pour chaque utilisateur lorsque la formation est terminée?

if __name__ == '__main__': 
    df_train, df_test=get_data() 
    svd(df_train, df_test) 
    print("Done!") 

Répondre

1

Vous devez modifier la partie de prédiction de votre code pour afficher les produits recommandés top K. Le code actuel où la prédiction est faite est:

embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user") 
embd_item = tf.nn.embedding_lookup(w_item, item_batch, name="embedding_item") 
infer = tf.reduce_sum(tf.multiply(embd_user, embd_item), 1) 

Ici, le embed_user est le plongement utilisateur d'un utilisateur particulier et embd_item est pour l'élément particulier. Donc, au lieu de comparer un particular user avec un particular item, vous devez le changer pour le comparer à tous les articles. La matrice w_item correspond aux intégrations de tous les éléments. Cela peut se faire par:

embd_user = tf.nn.embedding_lookup(w_user, user_batch, name="embedding_user") 
# Multiply user embedding of shape: [1 x dim] 
# with every item embeddings of shape: [item_num, dim], 
# to produce rank of all items of shape: [item_num] 
predict = tf.matmul(embd_user, w_item, transpose_b=True) 

Vous pouvez ensuite sélectionner l'indice top k du maximum de la sortie prédite.

+0

Ok parfait. J'ai une erreur sur embedding_lookup quand j'utilise mes données de DB ayant un id alphanumérique au lieu d'un int32, l'erreur est: "TypeError: La valeur passée au paramètre 'indices' a la chaîne de DataType pas dans la liste des valeurs autorisées: int32, int64". Comment puis-je le réparer? –

+0

Pouvez-vous me dire quelle ligne est l'erreur? Et qu'est-ce que les 'données DB'? Dans embedding_lookup, quelle est l'entrée que vous modifiez en provoquant cette erreur? –

+0

L'une des lignes qui provoque l'erreur: "embd_user = tf.nn.embedding_lookup (w_user, user_batch, name =" embedding_user ")". Cela est dû au fait que les ID qui se chargent à partir de ma base de données sont alphanumériques et non int32: https://www.dropbox.com/s/9s4vxsciue3mu38/Schermata%202017-07-08%20alle%2010.32.48.png?dl=0 . Ensuite, le lot utilisateur a le type tf.string: "user_batch = tf.placeholder (tf.string, shape = [Aucun], name =" id_user ")" –

1

Vous pouvez exécuter

predict_result = sess.run(inter_op, feed_dict={user_batch:users, item_batch:items}) 

les utilisateurs signifie tous les identifiants des utilisateurs et des articles pour tous les IDs d'articles et predict_result est les scores de chaque utilisateur pour tous les éléments, vous pouvez stocker le predict_result dans DB;

+0

Donc, si je dois trouver les 10 produits recommandés pour chaque utilisateur, dois-je combiner manuellement tous les produits avec chaque utilisateur et ensuite trouver le top 10? N'y a-t-il pas un moyen plus efficace? predict_result = sess.run (infer, feed_dict = {user_batch: [utilisateurs [0], utilisateurs [0], utilisateurs [0] .........], item_batch: [items [0], items [1], items [2] ................]}) –