Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Apprenez à utiliser la bibliothèque à apprentissage automatique Apache Mahout avec Azure HDInsight pour générer des recommandations de films
Mahout est une bibliothèque d’apprentissage automatique pour Apache Hadoop. Mahout contient des algorithmes pour le traitement des données, tel que le filtrage, la classification et le clustering. Dans cet article, vous utilisez un moteur de recommandation pour générer des recommandations en fonction des films vus par vos amis.
Prérequis
Un cluster Apache Hadoop sur HDInsight. Consultez Bien démarrer avec HDInsight sur Linux.
Présentation des recommandations
L’une des fonctions fournies par Mahout est un moteur de recommandation. Ce moteur accepte les données au format userID, itemId et prefValue (les préférences pour l’élément). Mahout peut alors effectuer une analyse des co-occurrences afin de déterminer que les utilisateurs ayant une préférence pour un élément ont également une préférence pour ces autres éléments. Mahout détermine ensuite des utilisateurs avec des préférences similaires, qui peuvent alors être utilisées pour faire des recommandations.
Voici un exemple simplifié de cette méthode pour les données de films :
Co-occurrence : Jean, Alice et Robert ont tous aimé La Guerre des étoiles, L’Empire contre-attaque et Le Retour du
Jedi. Mahout détermine que les utilisateurs qui aiment l’un de ces films aiment également les deux autres.Co-occurrence : Robert et Alice ont aussi aimé La Menace fantôme, L’attaque des clones et La revanche des Sith. Mahout détermine que les utilisateurs qui ont aimé les trois films précédents aiment également ces trois films.
Recommandation par similarité : Puisque Jean a aimé les trois premiers films, Mahout regarde les films que d’autres personnes ayant les mêmes goûts que lui ont aimés aussi, mais que Jean n’a pas encore vus (aimés/notés). Dans ce cas, Mahout recommande La Menace fantôme, L’attaque des clones et La revanche des Sith.
Vue d’ensemble des données
De façon pratique, GroupLens Research fournit des données d’évaluation de films dans un format compatible avec Mahout. Ces données sont disponibles sur le stockage par défaut de votre cluster à /HdiSamples/HdiSamples/MahoutMovieData.
Il existe deux fichiers, moviedb.txt et user-ratings.txt. Le fichier user-ratings.txt est utilisé pendant l’analyse. Le fichier moviedb.txt est utilisé pour fournir des informations de texte conviviales au moment de l’affichage des résultats.
Les données contenues dans user-ratings.txt respectent la structure suivante : userID, movieID, userRating et timestamp, ce qui indique la note attribuée par chaque utilisateur à un film. Voici un exemple de ces données :
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
Exécution de l'analyse
Utilisez la commande ssh pour vous connecter à votre cluster. Modifiez la commande suivante en remplaçant CLUSTERNAME par le nom de votre cluster, puis entrez la commande :
ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.netUtilisez la commande suivante pour exécuter la tâche de recommandation :
mahout recommenditembased -s SIMILARITY_COOCCURRENCE -i /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt -o /example/data/mahoutout --tempDir /temp/mahouttemp
Notes
L’exécution de la tâche peut durer quelques minutes et entraîner l’exécution de plusieurs tâches MapReduce.
Affichage du résultat
Une fois la tâche terminée, utilisez la commande suivante pour afficher le résultat généré :
hdfs dfs -text /example/data/mahoutout/part-r-00000La sortie se présente comme suit :
1 [234:5.0,347:5.0,237:5.0,47:5.0,282:5.0,275:5.0,88:5.0,515:5.0,514:5.0,121:5.0] 2 [282:5.0,210:5.0,237:5.0,234:5.0,347:5.0,121:5.0,258:5.0,515:5.0,462:5.0,79:5.0] 3 [284:5.0,285:4.828125,508:4.7543354,845:4.75,319:4.705128,124:4.7045455,150:4.6938777,311:4.6769233,248:4.65625,272:4.649266] 4 [690:5.0,12:5.0,234:5.0,275:5.0,121:5.0,255:5.0,237:5.0,895:5.0,282:5.0,117:5.0]La première colonne est
userID. Les valeurs contenues entre « [ » et « ] » sontmovieId:recommendationScore.Vous pouvez utiliser la sortie ainsi que le fichier moviedb.txt pour fournir plus d’informations sur les recommandations. Tout d’abord, copiez les fichiers localement en utilisant les commandes suivantes :
hdfs dfs -get /example/data/mahoutout/part-r-00000 recommendations.txt hdfs dfs -get /HdiSamples/HdiSamples/MahoutMovieData/* .Cette commande copie les données de sortie dans un fichier nommé recommendations.txt dans le répertoire actif, avec les fichiers de données de film.
Utilisez la commande suivante pour créer un script Python afin de rechercher les noms de film présents dans les données de sortie des recommandations :
nano show_recommendations.pyLorsque l’éditeur s’ouvre, utilisez le texte suivant comme contenu du fichier :
#!/usr/bin/env python import sys if len(sys.argv) != 5: print "Arguments: userId userDataFilename movieFilename recommendationFilename" sys.exit(1) userId, userDataFilename, movieFilename, recommendationFilename = sys.argv[1:] print "Reading Movies Descriptions" movieFile = open(movieFilename) movieById = {} for line in movieFile: tokens = line.split("|") movieById[tokens[0]] = tokens[1:] movieFile.close() print "Reading Rated Movies" userDataFile = open(userDataFilename) ratedMovieIds = [] for line in userDataFile: tokens = line.split("\t") if tokens[0] == userId: ratedMovieIds.append((tokens[1],tokens[2])) userDataFile.close() print "Reading Recommendations" recommendationFile = open(recommendationFilename) recommendations = [] for line in recommendationFile: tokens = line.split("\t") if tokens[0] == userId: movieIdAndScores = tokens[1].strip("[]\n").split(",") recommendations = [ movieIdAndScore.split(":") for movieIdAndScore in movieIdAndScores ] break recommendationFile.close() print "Rated Movies" print "------------------------" for movieId, rating in ratedMovieIds: print "%s, rating=%s" % (movieById[movieId][0], rating) print "------------------------" print "Recommended Movies" print "------------------------" for movieId, score in recommendations: print "%s, score=%s" % (movieById[movieId][0], score) print "------------------------"Appuyez sur Ctrl-X, O, et enfin Entrée pour enregistrer les données.
Exécutez le script Python. La commande suivante suppose que vous avez ouvert le répertoire dans lequel tous les fichiers ont été téléchargés :
python show_recommendations.py 4 user-ratings.txt moviedb.txt recommendations.txtLa commande examinera les recommandations générées pour l’utilisateur ID 4.
Le fichier user-ratings.txt est utilisé pour récupérer les films évalués.
Le fichier moviedb.txt est utilisé pour récupérer les noms des films.
Le fichier recommendations.txt est utilisé pour récupérer les recommandations de films pour cet utilisateur.
Le résultat de cette commande doit ressembler au texte suivant :
Seven Years in Tibet (1997), score=5.0 Indiana Jones and the Last Crusade (1989), score=5.0 Jaws (1975), score=5.0 Sense and Sensibility (1995), score=5.0 Independence Day (ID4) (1996), score=5.0 My Best Friend's Wedding (1997), score=5.0 Jerry Maguire (1996), score=5.0 Scream 2 (1997), score=5.0 Time to Kill, A (1996), score=5.0
Suppression des données temporaires
Les tâches Mahout ne suppriment pas les données temporaires créées lors du traitement de la tâche. C’est la raison pour laquelle le paramètre --tempDir est spécifié dans la tâche donnée en exemple : il isole les fichiers temporaires dans un chemin spécifique afin de pouvoir les effacer facilement. Pour supprimer les fichiers temporaires, utilisez la commande suivante :
hdfs dfs -rm -f -r /temp/mahouttemp
Avertissement
Si vous souhaitez réexécuter la commande, vous devez également supprimer le répertoire de sortie. Utilisez la commande suivante pour supprimer ce répertoire :
hdfs dfs -rm -f -r /example/data/mahoutout
Étapes suivantes
Maintenant que vous avez appris à utiliser Mahout, découvrez d’autres façons d’utiliser les données dans HDInsight :