Generování doporučení s využitím Apache Mahoutu ve službě Azure HDInsight

Naučte se používat knihovnu strojového učení Apache Mahout se službou Azure HDInsight ke generování doporučení filmů.

Mahout je knihovna strojového učení pro Apache Hadoop. Mahout obsahuje algoritmy pro zpracování dat, jako je filtrování, klasifikace a clustering. V tomto článku použijete modul doporučení k vygenerování doporučení, která jsou založená na filmech, které viděli vaši přátelé.

Požadavky

Cluster Apache Hadoop ve službě HDInsight. Viz Začínáme se službou HDInsight v Linuxu.

Principy doporučení

Jednou z funkcí, které poskytuje Mahout, je modul doporučení. Tento modul přijímá data ve formátu userID, itemIda prefValue (předvolba položky). Mahout pak může provést analýzu spoluvykazování a určit: uživatelé, kteří mají předvolbu pro položku, mají také předvolbu pro tyto další položky. Mahout pak určí uživatele s předvolbami podobných položek, které se dají použít k vytváření doporučení.

Následující pracovní postup je zjednodušený příklad, který používá data filmů:

  • Co-výskyt: Joe, Alice a Bob se líbí Star Wars, The Empire Strikes Back, a Return of the Jedi. Mahout určuje, že uživatelé, kteří mají rádi některý z těchto filmů, stejně jako ostatní dva.

  • Ko-výskyt: Bob a Alice se také líbila Fantomová menace, útok klonů a pomsta Sithu. Mahout určuje, že uživatelé, kteří se líbili předchozím třem filmům, se líbí také těmto třem filmům.

  • Doporučení podobnosti: Protože Joe lajkoval první tři filmy, Mahout sleduje filmy, které se ostatním s podobnými preferencemi líbí, ale Joe se nehlídal (lajkoval/hodnocený). V tomto případě Mahout doporučuje Fantomovou menace, útok klonů a pomstu Sithu.

Principy dat

GroupLens Research poskytuje data hodnocení filmů ve formátu, který je kompatibilní s Mahoutem. Tato data jsou k dispozici ve výchozím úložišti vašeho clusteru na /HdiSamples/HdiSamples/MahoutMovieDataadrese .

Existují dva soubory a moviedb.txtuser-ratings.txt. Tento user-ratings.txt soubor se používá během analýzy. Slouží moviedb.txt k poskytování uživatelsky přívětivých textových informací při prohlížení výsledků.

Data obsažená v user-ratings.txt souboru mají strukturu userID, , movieIDuserRatinga timestamp, což označuje, jak vysoce každý uživatel hodnotil film. Tady je příklad dat:

    196    242    3    881250949
    186    302    3    891717742
    22     377    1    878887116
    244    51     2    880606923
    166    346    1    886397596

Spuštění analýzy

  1. Pomocí příkazu ssh se připojte ke clusteru. Upravte následující příkaz nahrazením clusteru názvem clusteru a zadáním příkazu:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Pomocí následujícího příkazu spusťte úlohu doporučení:

    mahout recommenditembased -s SIMILARITY_COOCCURRENCE -i /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt -o /example/data/mahoutout --tempDir /temp/mahouttemp
    

Poznámka:

Dokončení úlohy může trvat několik minut a může spustit několik úloh MapReduce.

Zobrazení výstupu

  1. Po dokončení úlohy pomocí následujícího příkazu zobrazte vygenerovaný výstup:

    hdfs dfs -text /example/data/mahoutout/part-r-00000
    

    Výstup se zobrazí takto:

    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]
    

    První sloupec je userID. Hodnoty obsažené v [a ]' jsou movieId:recommendationScore.

  2. K poskytnutí dalších informací o doporučeních můžete použít výstup spolu s filmdb.txt. Nejprve zkopírujte soubory místně pomocí následujících příkazů:

    hdfs dfs -get /example/data/mahoutout/part-r-00000 recommendations.txt
    hdfs dfs -get /HdiSamples/HdiSamples/MahoutMovieData/* .
    

    Tento příkaz zkopíruje výstupní data do souboru s názvem recommendations.txt v aktuálním adresáři spolu s datovými soubory videa.

  3. Pomocí následujícího příkazu vytvořte skript Pythonu, který vyhledá názvy filmů pro data ve výstupu doporučení:

    nano show_recommendations.py
    

    Po otevření editoru použijte jako obsah souboru následující text:

    #!/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 "------------------------"
    

    Stisknutím kláves Ctrl+X, Y a nakonec Enter uložte data.

  4. Spusťte skript Pythonu. Následující příkaz předpokládá, že jste v adresáři, kde byly staženy všechny soubory:

    python show_recommendations.py 4 user-ratings.txt moviedb.txt recommendations.txt
    

    Tento příkaz se podívá na doporučení vygenerovaná pro ID uživatele 4.

    • Soubor user-ratings.txt slouží k načtení filmů, které byly hodnoceny.

    • Soubor moviedb.txt slouží k načtení názvů filmů.

    • Soubor recommendations.txt slouží k načtení doporučení filmů pro tohoto uživatele.

      Výstup z tohoto příkazu je podobný následujícímu textu:

      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
      

Odstranění dočasných dat

Úlohy Mahout neodeberou dočasná data vytvořená při zpracování úlohy. Parametr --tempDir je zadán v ukázkové úloze, aby se dočasné soubory izolovaly do konkrétní cesty pro snadné odstranění. Pokud chcete dočasné soubory odebrat, použijte následující příkaz:

hdfs dfs -rm -f -r /temp/mahouttemp

Upozorňující

Pokud chcete příkaz spustit znovu, musíte také odstranit výstupní adresář. Pomocí následujícího příkazu odstraňte tento adresář:

hdfs dfs -rm -f -r /example/data/mahoutout

Další kroky

Teď, když jste se naučili používat Mahout, objevte další způsoby práce s daty ve službě HDInsight: