6
votes

Spark - Comment utiliser le modèle de recommandation formé en production?

J'utilise une étincelle pour créer un prototype de système de recommandation. Après avoir traversé certains tutoriels, j'ai pu former un MatrixFactorizationModel de mes données.

Cependant, le modèle formé par Spark Mllib n'est qu'un sérialisable . Comment puis-je utiliser ce modèle pour recommander pour les utilisateurs réels? Je veux dire, comment puis-je persister le modèle dans une sorte de base de données ou la mettre à jour si les données utilisateur ont été incrémentées?

Par exemple, le modèle formé par la bibliothèque de recommandation Mahout peut être stocké dans des bases de données telles que REDIS, puis nous pouvons interroger la liste des éléments recommandés ultérieurement. Mais comment pouvons-nous faire des choses similaires dans l'étincelle? Toute suggestion?


0 commentaires

4 Réponses :


9
votes

Premièrement, le "modèle" que vous parlez de Mahout n'est pas un modèle, mais une liste pré-calculée des recommandations. Vous pouvez également faire cela avec Spark et calculer des recommandations par lots pour les utilisateurs et les perserveiller partout où vous le souhaitez. Cela n'a rien à voir avec la sérialisation d'un modèle. Si vous ne voulez pas faire des mises à jour ou une notation en temps réel, vous pouvez vous arrêter là-bas et utiliser simplement une étincelle pour le lot, comme vous le faites.

Mais je conviens que dans beaucoup de cas, vous voulez expédier le modèle ailleurs et le servir. Comme vous pouvez le constater, d'autres modèles d'étincelle sont sérialisable , mais pas MatrixFactorizationModel . (Oui, même s'il est marqué comme tel, il ne sera pas sérialisé.) De même, il existe une série de sérialisation standard pour les modèles prédictifs appelés PMML mais il ne contient aucun vocabulaire pour un modèle de matrice factorisé.

La raison est en fait la même chose. Alors que de nombreux modèles prédictifs, comme un modèle de régression SVM ou logistique, ne sont qu'un petit ensemble de coefficients, un modèle matricielle factorisé est énorme, contenant deux matrices avec potentiellement des milliards d'éléments. C'est pourquoi je pense que PMML n'a pas de codage raisonnable pour cela.

De même, dans l'étincelle, cela signifie que les matrices réelles sont RDD S qui ne peut pas être sérialisé directement. Vous pouvez persister ces RDD au stockage, les lire ailleurs à l'aide de Spark et recréer un MatrixFactorizationModel à la main de cette façon.

Vous ne pouvez pas servir ou mettre à jour le modèle à l'aide de Spark cependant. Pour cela, vous envisagez vraiment de rédiger un code pour effectuer des mises à jour et calculez les recommandations à la volée.

Cela ne me dérange pas de suggérer ici le Projet ORYX , car son point est de gérer exactement cet aspect , en particulier pour la recommandation de la SLA. En fait, le projet Le projet ORYX 2 est basé sur Spark et, bien qu'en alpha, contient déjà le pipeline complet pour sérialiser. et servir la sortie de MatrixFactorizationModel . Je ne sais pas si cela répond à vos besoins, mais peut au moins être un point de référence intéressant.


1 commentaires

Merci pour votre excellente explication détaillée! Je vais essayer Oryx :)



2
votes

Une autre méthode de création de CV avec Spark est la méthode du moteur de recherche. C'est essentiellement une recommandation de cooccurrence desservie par Solr ou ElasticseSearch. La comparaison des facteurs factorisés à la cooccurrence est au-delà de cette question, donc je vais simplement décrire ce dernier.

Vous utilisez des interactions alimentaires (identifiant-ID, élément-ID) dans le Spark-itemImilarity de Mahout . Cela produit une liste d'éléments similaires pour chaque élément observé dans les données d'interaction. Il sorta par défaut comme un CSV et peut donc être stocké n'importe où. Mais il doit être indexé par un moteur de recherche.

Dans tous les cas lorsque vous souhaitez extraire des REC, vous utilisez l'historique de l'utilisateur comme requête, vous récupérez une liste ordonnée d'éléments en tant que CER.

Un avantage de cette méthode est que les indicateurs peuvent être calculés pour autant d'actions utilisateur que vous le souhaitez. Toute action que l'utilisateur prend ce corrélation à ce que vous voulez recommander peut être utilisé. Par exemple, si vous souhaitez recommander un achat, mais vous enregistrez également des vues de produit. Si vous avez traité des vues de produit de la même manière que les achats, vous risquez probablement d'empirer des CER (je l'ai essayé). Toutefois, si vous calculez un indicateur pour les achats et un autre indicateur (en réalité sur la cookécurance) pour les vues de produit, ils sont également prédictifs des achats. Cela a pour effet d'augmenter les données utilisées pour les CER. Le même type de chose peut être fait avec des emplacements utilisateur pour mélanger les informations de localisation dans les centres d'achat.

Vous pouvez également biaiser vos CER en fonction du contexte. Si vous êtes dans la section "Electronique" d'un catalogue, vous pouvez vouloir que les CER soient biaisées vers l'électronique. Ajoutez des composants électroniques à la requête contre le champ de métadonnées "catégorie" de l'élément et donnez-lui un coup de pouce dans la requête et vous avez des REC biaisés.

Étant donné que tout le biaisage et le mélange des indicateurs se produisent dans la requête, il rend le moteur CER facilement réglé sur plusieurs contextes tout en maintenant une seule requête multi-champs réalisée via un moteur de recherche. Nous obtenons une évolutivité de Solr ou d'ElasseCeSearch.

Un autre bénéfice de la factorisation ou de la méthode de recherche est que des utilisateurs entièrement nouveaux et une nouvelle historique peuvent être utilisés pour créer des CER où les recommandateurs plus âgés de Mahout ne pouvaient recommander que les utilisateurs et les interactions connues lorsque le travail a été exécuté.

Descriptions ici:


0 commentaires

0
votes

Vous devriez exécuter Model.Predicttall () sur un jeu de RDD réduit de paires (utilisateurs, produits) tels que dans le travail Hadoop Mahout et stockez les résultats pour une utilisation en ligne ...

https://github.com/apache/mahout/blob/master/mrlegacy/src/main/java/org/tache/mahout/cf/tate/hadoop/item/recommenderjob.java


0 commentaires

0
votes

Vous pouvez utiliser la fonction .Save ( sparkcontext, sortiefeuder ) pour enregistrer le modèle dans un dossier de votre choix. Tout en donnant les recommandations en temps réel, il vous suffit d'utiliser MatrixFactorizationModel.load ( SparkContext, Modelfolder ) fonction pour le charger en tant qu'objet MatrixFactorizationModel.

Une question à @sean Owen : ne contient pas la matriceFactorizationObject contenant les matrices de factorisation: Caractéristique utilisateur et matrices d'élément-fonctionnalité au lieu de recommandations / notations prédictives. < / p>


0 commentaires