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, itemIden 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.txtuser-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, movieIDen userRating, timestampdie 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

  1. 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
    
  2. 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

  1. 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 ']' zijn movieId:recommendationScore.

  2. 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.

  3. 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.

  4. 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: