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
, itemId
a 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/MahoutMovieData
adrese .
Existují dva soubory a moviedb.txt
user-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
, , movieID
userRating
a 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
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
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
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 ]' jsoumovieId
:recommendationScore
.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.
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.
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: