Aanbevelingen genereren met Apache Mahout in Azure HDInsight
Meer informatie over het gebruik van de Apache Mahout Machine Learning-bibliotheek met Azure HDInsight om filmaanbeveling te genereren.
Mahout is een machine learning-bibliotheek voor Apache Hadoop. Mahout bevat algoritmen voor het verwerken van gegevens, zoals filteren, classificatie en clustering. In dit artikel gebruikt u een aanbevelingsengine om filmaanbeveling te genereren die zijn gebaseerd op films die uw vrienden hebben gezien.
Vereisten
Een Apache Hadoop-cluster in HDInsight. Zie Aan de slag met HDInsight in Linux.
Meer informatie over aanbevelingen
Een van de functies die door Mahout worden geleverd, is een aanbevelingsengine. Deze engine accepteert gegevens in de indeling van userID
, itemId
en prefValue
(de voorkeur voor het item). Mahout kan vervolgens een co-exemplaaranalyse uitvoeren om te bepalen: gebruikers met een voorkeur voor een item hebben ook een voorkeur voor deze andere items. Mahout bepaalt vervolgens gebruikers met voorkeuren voor like-item, die kunnen worden gebruikt om aanbevelingen te doen.
De volgende werkstroom is een vereenvoudigd voorbeeld waarin filmgegevens worden gebruikt:
Samen optreden: Joe, Alice en Bob hielden allemaal van Star Wars, The Empire Strikes Back en Return van de
Jedi
. Mahout bepaalt dat gebruikers die een van deze films leuk vinden ook als de andere twee.Co-exemplaar: Bob en Alice hielden ook van The Phantom Menace, Attack of the Clones en Revenge of the Sith. Mahout bepaalt dat gebruikers die de vorige drie films leuk vonden ook als deze drie films.
Aanbeveling voor overeenkomsten: Omdat Joe de eerste drie films leuk vond, kijkt Mahout naar films die anderen met vergelijkbare voorkeuren leuk vinden, maar Joe heeft niet gekeken (leuk/beoordeeld). In dit geval raadt Mahout the Phantom Menace, Attack of the Clones en Revenge of the Sith aan.
Inzicht in de gegevens
GroupLens Research biedt gemakkelijk beoordelingsgegevens voor films in een indeling die compatibel is met Mahout. Deze gegevens zijn beschikbaar in de standaardopslag van uw cluster op /HdiSamples/HdiSamples/MahoutMovieData
.
Er zijn twee bestanden en moviedb.txt
user-ratings.txt
. Het user-ratings.txt
bestand wordt gebruikt tijdens de analyse. Het moviedb.txt
wordt gebruikt om gebruiksvriendelijke tekstinformatie te bieden bij het weergeven van de resultaten.
De gegevens in user-ratings.txt
de gegevens hebben een structuur van userID
, movieID
en userRating
, timestamp
die aangeeft hoe hoog elke gebruiker een film heeft beoordeeld. Hier volgt een voorbeeld van de gegevens:
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
De analyse uitvoeren
Gebruik de ssh-opdracht om verbinding te maken met uw cluster. Bewerk de volgende opdracht door CLUSTERNAME te vervangen door de naam van uw cluster en voer vervolgens de opdracht in:
ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Gebruik de volgende opdracht om de aanbevelingstaak uit te voeren:
mahout recommenditembased -s SIMILARITY_COOCCURRENCE -i /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt -o /example/data/mahoutout --tempDir /temp/mahouttemp
Notitie
Het kan enkele minuten duren voordat de taak is voltooid en er kunnen meerdere MapReduce-taken worden uitgevoerd.
De uitvoer weergeven
Zodra de taak is voltooid, gebruikt u de volgende opdracht om de gegenereerde uitvoer weer te geven:
hdfs dfs -text /example/data/mahoutout/part-r-00000
De uitvoer wordt als volgt weergegeven:
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]
De eerste kolom is de
userID
. De waarden in '[' en ']' zijnmovieId
:recommendationScore
.U kunt de uitvoer, samen met moviedb.txt, gebruiken om meer informatie te geven over de aanbevelingen. Kopieer eerst de bestanden lokaal met behulp van de volgende opdrachten:
hdfs dfs -get /example/data/mahoutout/part-r-00000 recommendations.txt hdfs dfs -get /HdiSamples/HdiSamples/MahoutMovieData/* .
Met deze opdracht worden de uitvoergegevens gekopieerd naar een bestand met de naam recommendations.txt in de huidige map, samen met de filmgegevensbestanden.
Gebruik de volgende opdracht om een Python-script te maken waarmee filmnamen voor de gegevens worden opgezoekd in de uitvoer van de aanbevelingen:
nano show_recommendations.py
Wanneer de editor wordt geopend, gebruikt u de volgende tekst als de inhoud van het bestand:
#!/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 "------------------------"
Druk op Ctrl-X, Y en ten slotte op Enter om de gegevens op te slaan.
Voer het Python-script uit. Bij de volgende opdracht wordt ervan uitgegaan dat u zich in de map bevindt waarin alle bestanden zijn gedownload:
python show_recommendations.py 4 user-ratings.txt moviedb.txt recommendations.txt
Met deze opdracht wordt gekeken naar de aanbevelingen die zijn gegenereerd voor gebruikers-id 4.
Het bestand user-ratings.txt wordt gebruikt om films op te halen die zijn beoordeeld.
Het bestand moviedb.txt wordt gebruikt om de namen van de films op te halen.
De recommendations.txt wordt gebruikt om de filmaanbeveling voor deze gebruiker op te halen.
De uitvoer van deze opdracht is vergelijkbaar met de volgende tekst:
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
Tijdelijke gegevens verwijderen
Mahout-taken verwijderen geen tijdelijke gegevens die worden gemaakt tijdens het verwerken van de taak. De --tempDir
parameter wordt opgegeven in de voorbeeldtaak om de tijdelijke bestanden te isoleren in een specifiek pad voor eenvoudige verwijdering. Gebruik de volgende opdracht om de tijdelijke bestanden te verwijderen:
hdfs dfs -rm -f -r /temp/mahouttemp
Waarschuwing
Als u de opdracht opnieuw wilt uitvoeren, moet u ook de uitvoermap verwijderen. Gebruik het volgende om deze map te verwijderen:
hdfs dfs -rm -f -r /example/data/mahoutout
Volgende stappen
Nu u hebt geleerd hoe u Mahout gebruikt, kunt u andere manieren ontdekken om met gegevens in HDInsight te werken: