Generieren von Empfehlungen mit Apache Mahout in Azure HDInsight
Erfahren Sie, wie Sie Filmempfehlungen mit der Apache Mahout -Bibliothek für maschinelles Lernen und Azure HDInsight erstellen können.
Mahout ist eine Bibliothek für maschinelles Lernen für Apache Hadoop. Mahout enthält Algorithmen zur Verarbeitung von Daten wie etwa Filterung, Klassifizierung und Clustering. In diesem Artikel verwenden Sie eine Empfehlungs-Engine zum Generieren von Filmempfehlungen auf der Grundlage von Filmen, die Ihre Freunde gesehen haben.
Voraussetzungen
Ein Apache Hadoop-Cluster in HDInsight. Weitere Informationen finden Sie unter Erste Schritte mit HDInsight unter Linux.
Grundlegendes zu Empfehlungen
Eine der von Mahout bereitgestellten Funktionen ist eine Empfehlungs-Engine. Diese Engine akzeptiert Daten im Format userID
, itemId
und prefValue
(Einstellung für das Element). Mahout kann dann eine Analyse des gemeinsamen Vorkommens durchführen: Benutzer, die eine Vorliebe für ein bestimmtes Element haben, haben auch eine Vorliebe für andere Elemente. Mahout bestimmt dann Benutzer mit ähnlichen Vorlieben für Elemente, aus denen sich Empfehlungen erstellen lassen.
Im folgenden Workflow sehen Sie ein vereinfachtes Beispiel mit Spielfilmdaten:
Gemeinsames Vorkommen: Joe, Alice und Bob gefallen Krieg der Sterne, Das Imperium schlägt zurück und Die Rückkehr der
Jedi
. Mahout stellt fest, dass Benutzer, denen einer dieser Filme gefällt, auch die beiden anderen mögen.Gemeinsames Vorkommen: Bob und Alice haben auch Die dunkle Bedrohung, Angriff der Klonkrieger und Die Rache der Sith mit „Gefällt mir“ markiert. Mahout stellt fest, dass Benutzer, denen die vorherigen drei Filme gefallen, auch diese drei mögen.
Vergleichbare Empfehlung: Da Joe die ersten drei Filme mit „Gefällt mir“ markiert hat, sucht Mahout nach Filmen, die andere Personen mit ähnlichen Vorlieben mit „Gefällt mir“ markiert haben, die Joe aber noch nicht gesehen (mit „Gefällt mir“ markiert oder bewertet) hat. In diesem Fall empfiehlt Mahout Die dunkle Bedrohung, Angriff der Klonkrieger und Die Rache der Sith.
Grundlegendes zu den Daten
Praktischerweise stellt GroupLens Research Bewertungsdaten für Filme in einem Mahout-kompatiblen Format zur Verfügung. Diese Daten sind im Standardspeicher Ihres Clusters unter /HdiSamples/HdiSamples/MahoutMovieData
verfügbar.
Zwei Dateien sind vorhanden: moviedb.txt
und user-ratings.txt
. Die Datei user-ratings.txt
wird während der Analyse verwendet. moviedb.txt
gibt beim Anzeigen der Ergebnisse benutzerfreundliche Textinformationen an.
Die Daten in der Datei user-ratings.txt
haben die Struktur userID
, movieID
, userRating
und timestamp
, anhand der die Bewertung eines Films durch die einzelnen Benutzer ersichtlich wird. Hier sehen Sie ein Beispiel für die Daten:
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
Ausführen der Analyse
Verwenden Sie einen ssh-Befehl zum Herstellen der Verbindung mit dem Cluster. Bearbeiten Sie den folgenden Befehl, indem Sie CLUSTERNAME durch den Namen Ihres Clusters ersetzen, und geben Sie den Befehl dann ein:
ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Führen Sie den folgenden Befehl aus, um den Auftrag für die Filmempfehlungen auszuführen:
mahout recommenditembased -s SIMILARITY_COOCCURRENCE -i /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt -o /example/data/mahoutout --tempDir /temp/mahouttemp
Hinweis
Der Auftrag kann mehrere Minuten dauern und mehrere MapReduce-Jobs einschließen.
Anzeigen der Ausgabe
Sobald der Auftrag abgeschlossen ist, verwenden Sie den folgenden Befehl zum Anzeigen der Ausgabe.
hdfs dfs -text /example/data/mahoutout/part-r-00000
Die Ausgabe sieht nun wie folgt aus:
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]
Die erste Spalte ist die
userID
. Die in „[“ und „]“ enthaltenen Werte sindmovieId
:recommendationScore
.Die Ausgabedaten können zusammen mit „moviedb.txt“ verwendet werden, um weitere Informationen zu den Empfehlungen anzuzeigen. Kopieren Sie zunächst mithilfe folgender Befehle die Dateien lokal:
hdfs dfs -get /example/data/mahoutout/part-r-00000 recommendations.txt hdfs dfs -get /HdiSamples/HdiSamples/MahoutMovieData/* .
Mit diesem Befehl werden die Ausgabedaten zusammen mit den Filmdatendateien in eine Datei namens recommendations.txt im aktuellen Verzeichnis kopiert.
Verwenden Sie den folgenden Befehl, um ein Python-Skript zu erstellen, mit dem Filmnamen für die Daten in der Empfehlungsausgabe gesucht werden:
nano show_recommendations.py
Verwenden Sie, sobald der Editor geöffnet wird, den folgenden Text als Inhalt für die Datei:
#!/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 "------------------------"
Drücken Sie STRG + X, STRG + Y und schließlich die EINGABETASTE, um die Daten zu speichern.
Führen Sie das Python-Skript aus. Im folgenden Befehl wird davon ausgegangen, dass Sie sich im Verzeichnis befinden, in das alle Dateien heruntergeladen wurden:
python show_recommendations.py 4 user-ratings.txt moviedb.txt recommendations.txt
Dieser Befehl sucht nach den für die Benutzer-ID 4 generierten Empfehlungen.
Mit der Datei user-ratings.txt werden Filme abgerufen, die bewertet wurden.
Mit der Datei moviedb.txt werden die Namen der Filme abgerufen.
Mit der Datei recommendations.txt werden die Filmempfehlungen für diesen Benutzer abgerufen.
Die Ausgabe dieses Befehls ähnelt dem folgenden Text:
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
Löschen temporärer Daten
Mahout-Aufträge entfernen keine temporären Daten, die bei der Verarbeitung des Auftrags erstellt wurden. Der --tempDir
-Parameter wird im Beispielauftrag festgelegt, sodass die temporären Dateien zum einfachen Löschen in einem spezifischen Pfad isoliert abgelegt werden. Verwenden Sie zum Entfernen temporärer Dateien den folgenden Befehl:
hdfs dfs -rm -f -r /temp/mahouttemp
Warnung
Wenn Sie den Befehl erneut ausführen möchten, müssen Sie auch das Ausgabeverzeichnis löschen. Verwenden Sie zum Löschen des Verzeichnisses Folgendes:
hdfs dfs -rm -f -r /example/data/mahoutout
Nächste Schritte
Nachdem Sie sich mit Mahout vertraut gemacht haben, können Sie sich anderen Methoden der Datenverarbeitung in HDInsight zuwenden: