Generare raccomandazioni con Apache Mahout in Azure HDInsight
Informazioni su come usare la libreria di Machine Learning Apache Mahout con Azure HDInsight per generare raccomandazioni di film.
Mahout è una libreria di Machine Learning per Apache Hadoop. Mahout contiene gli algoritmi per l'elaborazione dei dati, ad esempio applicazione di filtri, classificazione e clustering. In questo articolo si userà un motore di raccomandazione per generare consigli cinematografici in base ai film visti dai propri amici.
Prerequisiti
Un cluster Apache Hadoop in HDInsight. Vedere Guida introduttiva: Introduzione ad Apache Hadoop e Apache Hive in Azure HDInsight usando il modello di Resource Manager.
Informazioni sulle raccomandazioni
Una delle funzioni fornite da Mahout è un motore di raccomandazione. Questo motore accetta i dati nei formati userID
, itemId
e prefValue
(la preferenza per l'elemento). Mahout può quindi eseguire l'analisi delle co-occorrenze per determinare che gli utenti con una preferenza per un elemento hanno anche una preferenza per altri elementi. Mahout determina quindi gli utenti con preferenze di elementi simili, che possono essere usate per le raccomandazioni.
Il flusso di lavoro seguente costituisce un esempio semplificato che usa dati relativi ai film:
Co-occorrenza: Joe, Alice e Bob piacevano a Star Wars, The Empire Strike Back e Return of the
Jedi
. Mahout determina che agli utenti a cui piace uno di questi film piacciono anche gli altri due.Co-occorrenza: a Bob e Alice piacciono anche La minaccia fantasma, L'attacco dei cloni e La vendetta dei Sith. Mahout determina che agli utenti a cui piacciono i tre film precedenti piacciono anche questi tre.
Raccomandazione di somiglianza: Perché Joe amava i primi tre film, Mahout guarda i film che altri con preferenze simili piacevano, ma Joe non ha visto (apprezzato/valutato). In questo caso, Mahout raccomanda La minaccia fantasma, L'attacco dei cloni e La vendetta dei Sith.
Informazioni sui dati
GroupLens Research fornisce i dati di classificazione dei film in un formato compatibile con Mahout. Questi dati sono disponibili nello spazio di archiviazione predefinito del cluster in /HdiSamples/HdiSamples/MahoutMovieData
.
Sono disponibili due file: moviedb.txt
e user-ratings.txt
. Il file user-ratings.txt
viene usato durante l'analisi. moviedb.txt
viene usato per presentare informazioni in testo descrittivo quando si visualizzano i risultati.
I dati contenuti in user-ratings.txt
presentano una struttura di userID
, movieID
, userRating
e timestamp
che indica la valutazione di un film effettuata da ogni utente. Di seguito è riportato un esempio dei dati:
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
Eseguire l'analisi
Usare il comando ssh per connettersi al cluster. Modificare il comando seguente sostituendo CLUSTERNAME con il nome del cluster e quindi immettere il comando :
ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
Per eseguire il processo di raccomandazione, usare il comando seguente:
mahout recommenditembased -s SIMILARITY_COOCCURRENCE -i /HdiSamples/HdiSamples/MahoutMovieData/user-ratings.txt -o /example/data/mahoutout --tempDir /temp/mahouttemp
Nota
Il completamento del processo potrebbe richiedere alcuni minuti ed è possibile eseguire più processi MapReduce.
Visualizzare l'output
Una volta completato il processo, usare il seguente comando per visualizzare l'output generato:
hdfs dfs -text /example/data/mahoutout/part-r-00000
L'output viene visualizzato come segue:
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]
La prima colonna rappresenta il valore
userID
. I valori racchiusi tra "[" e "]" sonomovieId
:recommendationScore
.È possibile usare l'output, insieme a moviedb.txt, per fornire altre informazioni sulle raccomandazioni. È prima necessario copiare i file in locale con i comandi seguenti:
hdfs dfs -get /example/data/mahoutout/part-r-00000 recommendations.txt hdfs dfs -get /HdiSamples/HdiSamples/MahoutMovieData/* .
I dati di output vengono copiati da questo comando in un file denominato recommendations.txt nella directory corrente insieme ai file dei dati relativi ai film.
Usare il comando seguente per creare uno script Python che cerca i nomi dei film per i dati presenti nell'output delle raccomandazioni:
nano show_recommendations.py
All'apertura dell'editor usare il testo seguente come contenuto del file:
#!/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 "------------------------"
Premere CTRL-X, Y e infine INVIO per salvare i dati.
Eseguire lo script Python. Il comando seguente presuppone che l'utente si trovi nella directory in cui sono stati scaricati tutti i file:
python show_recommendations.py 4 user-ratings.txt moviedb.txt recommendations.txt
Questo comando esamina le raccomandazioni generate per l'ID utente 4.
Il file user-ratings.txt viene usato per recuperare i film che sono stati classificati.
Il file moviedb.txt viene usato per recuperare i nomi dei film.
Il file recommendations.txt viene usato per recuperare le raccomandazioni di film per questo utente.
L'output di questo comando è simile al testo seguente:
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
Eliminare i dati temporanei
I processi Mahout non rimuovono i dati temporanei creati durante l'elaborazione del processo. Nel processo di esempio è specificato il parametro --tempDir
per isolare i file temporanei in un percorso specifico per semplificarne l'eliminazione. Per rimuovere i file temporanei, usare il comando seguente:
hdfs dfs -rm -f -r /temp/mahouttemp
Avviso
Se si vuole eseguire nuovamente il comando, è inoltre necessario eliminare la directory di output. Per eliminare la directory, usare il codice seguente:
hdfs dfs -rm -f -r /example/data/mahoutout
Passaggi successivi
A questo punto, dopo aver appreso come usare Mahout, è possibile trovare altri modi per usare i dati in HDInsight: