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, itemIdoch 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, userRatingoch 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

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

  1. 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 "]" är movieId:recommendationScore.

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

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

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