Generera rekommendationer med Apache Mahout i Azure HDInsight
Lär dig hur du använder Apache Mahout-maskininlärningsbiblioteket med Azure HDInsight för att generera filmrekommendationer.
Mahout är ett maskininlärningsbibliotek för Apache Hadoop. Mahout innehåller algoritmer för bearbetning av data, till exempel filtrering, klassificering och klustring. I den här artikeln använder du en rekommendationsmotor för att generera filmrekommendationer som baseras på filmer som dina vänner har sett.
Förutsättningar
Ett Apache Hadoop-kluster i HDInsight. Se Komma igång med HDInsight i Linux.
Förstå rekommendationer
En av funktionerna som tillhandahålls av Mahout är en rekommendationsmotor. Den här motorn accepterar data i formatet userID
, itemId
och prefValue
(inställningen för objektet). Mahout kan sedan utföra samförekomstanalys för att avgöra: användare som har en inställning för ett objekt har också en inställning för dessa andra objekt. Mahout avgör sedan användare med inställningar för liknande objekt, som kan användas för att ge rekommendationer.
Följande arbetsflöde är ett förenklat exempel som använder filmdata:
Samförekomst: Joe, Alice och Bob gillade alla Star Wars, The Empire Strikes Back och Return of the
Jedi
. Mahout avgör att användare som gillar någon av dessa filmer också gillar de andra två.Samförekomst: Bob och Alice gillade också The Phantom Menace, Attack of the Clones och Revenge of the Sith. Mahout avgör att användare som gillade de tidigare tre filmerna också gillar dessa tre filmer.
Likhetsrekommendations: Eftersom Joe gillade de tre första filmerna tittar Mahout på filmer som andra med liknande preferenser gillade, men Joe har inte tittat (gillat/betygsatt). I det här fallet rekommenderar Mahout The Phantom Menace, Attack of the Clones och Revenge of the Sith.
Förstå data
GroupLens Research tillhandahåller enkelt klassificeringsdata för filmer i ett format som är kompatibelt med Mahout. Dessa data är tillgängliga på ditt klusters standardlagring på /HdiSamples/HdiSamples/MahoutMovieData
.
Det finns två filer moviedb.txt
och user-ratings.txt
. Filen user-ratings.txt
används under analysen. moviedb.txt
Används för att tillhandahålla användarvänlig textinformation när resultatet visas.
Data som finns i user-ratings.txt
har en struktur av userID
, movieID
, userRating
och timestamp
, som anger hur högt varje användare betygsatte en film. Här är ett exempel på data:
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
Kör analysen
Använd ssh-kommandot för att ansluta till klustret. Redigera följande kommando genom att ersätta CLUSTERNAME med namnet på klustret och ange sedan kommandot:
ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Använd följande kommando för att köra rekommendationsjobbet:
mahout recommenditembased -s SIMILARITY_COOCCURRENCE -i /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt -o /example/data/mahoutout --tempDir /temp/mahouttemp
Kommentar
Jobbet kan ta flera minuter att slutföra och kan köra flera MapReduce-jobb.
Visa utdata
När jobbet är klart använder du följande kommando för att visa de genererade utdata:
hdfs dfs -text /example/data/mahoutout/part-r-00000
Utdata visas på följande sätt:
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]
Den första kolumnen är
userID
. Värdena i "[" och "]" ärmovieId
:recommendationScore
.Du kan använda utdata, tillsammans med moviedb.txt, för att ge mer information om rekommendationerna. Kopiera först filerna lokalt med hjälp av följande kommandon:
hdfs dfs -get /example/data/mahoutout/part-r-00000 recommendations.txt hdfs dfs -get /HdiSamples/HdiSamples/MahoutMovieData/* .
Det här kommandot kopierar utdata till en fil med namnet recommendations.txt i den aktuella katalogen, tillsammans med filmdatafilerna.
Använd följande kommando för att skapa ett Python-skript som söker efter filmnamn för data i rekommendationernas utdata:
nano show_recommendations.py
När redigeraren öppnas använder du följande text som innehållet i filen:
#!/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 "------------------------"
Tryck på Ctrl-X, Y och slutligen Retur för att spara data.
Kör Python-skriptet. Följande kommando förutsätter att du är i katalogen där alla filer laddades ned:
python show_recommendations.py 4 user-ratings.txt moviedb.txt recommendations.txt
Det här kommandot tittar på rekommendationerna som genereras för användar-ID 4.
Filen user-ratings.txt används för att hämta filmer som har klassificerats .
Filen moviedb.txt används för att hämta namnen på filmerna.
Recommendations.txt används för att hämta filmrekommendationerna för den här användaren.
Utdata från det här kommandot liknar följande 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
Ta bort temporära data
Mahout-jobb tar inte bort tillfälliga data som skapas när jobbet bearbetas. Parametern --tempDir
anges i exempeljobbet för att isolera de temporära filerna till en specifik sökväg för enkel borttagning. Om du vill ta bort temporära filer använder du följande kommando:
hdfs dfs -rm -f -r /temp/mahouttemp
Varning
Om du vill köra kommandot igen måste du också ta bort utdatakatalogen. Använd följande för att ta bort den här katalogen:
hdfs dfs -rm -f -r /example/data/mahoutout
Nästa steg
Nu när du har lärt dig hur du använder Mahout kan du identifiera andra sätt att arbeta med data i HDInsight: