Generación de recomendaciones mediante Apache Mahout en Azure HDInsightGenerate recommendations using Apache Mahout in Azure HDInsight

Aprenda a usar la biblioteca de aprendizaje automático de Apache Mahout con HDInsight de Azure para generar recomendaciones de películas con HDInsight.Learn how to use the Apache Mahout machine learning library with Azure HDInsight to generate movie recommendations.

Mahout es una biblioteca de aprendizaje automático para Apache Hadoop.Mahout is a machine learning library for Apache Hadoop. Mahout contiene algoritmos para el procesamiento de datos, como filtrado, clasificación y agrupación en clústeres.Mahout contains algorithms for processing data, such as filtering, classification, and clustering. En este artículo, se usa un motor de recomendaciones para generar recomendaciones de películas que se basan en películas que sus amigos han visto.In this article, you use a recommendation engine to generate movie recommendations that are based on movies your friends have seen.

Para obtener más información sobre la versión de Mahout en HDInsight, vea Versiones de HDInsight y componentes de Apache Hadoop.For more information about the version of Mahout in HDInsight, see HDInsight versions and Apache Hadoop components.

PrerrequisitosPrerequisites

Un clúster de Apache Hadoop en HDInsight.An Apache Hadoop cluster on HDInsight. Consulte Introducción a HDInsight en Linux.See Get Started with HDInsight on Linux.

Descripción de recomendacionesUnderstanding recommendations

Una de las funciones que proporciona Mahout es un motor de recomendaciones.One of the functions that is provided by Mahout is a recommendation engine. Este motor acepta datos en formato de userID, itemId y prefValue (la preferencia por el elemento).This engine accepts data in the format of userID, itemId, and prefValue (the preference for the item). Mahout puede realizar entonces análisis de ocurrencias conjuntas para determinar: los usuarios que tienen predilección por un elemento también la tienen por estos otros elementos.Mahout can then perform co-occurrence analysis to determine: users who have a preference for an item also have a preference for these other items. Mahout determinará los usuarios con preferencias de elementos similares, lo que se puede usar para realizar recomendaciones.Mahout then determines users with like-item preferences, which can be used to make recommendations.

El siguiente flujo de trabajo es un ejemplo simplificado que usa datos de películas:The following workflow is a simplified example that uses movie data:

  • Concurrencia: a José, Alicia y Roberto les gusta La Guerra de las galaxias, El imperio contraataca y El retorno del Jedi.Co-occurrence: Joe, Alice, and Bob all liked Star Wars, The Empire Strikes Back, and Return of the Jedi. Mahout determina que a los usuarios que les gusta alguna de estas películas también les gustan las otras dos.Mahout determines that users who like any one of these movies also like the other two.

  • Concurrencia: a Roberto y Alicia también les gusta La amenaza fantasma, El ataque de los clones y La venganza de los Sith.Co-occurrence: Bob and Alice also liked The Phantom Menace, Attack of the Clones, and Revenge of the Sith. Mahout determina que los usuarios a los que les gustan las tres películas anteriores también les gustan estas tres.Mahout determines that users who liked the previous three movies also like these three movies.

  • Recomendación de similitud: como a José le gustan las tres primeras películas, Mahout examina películas que a otros usuarios con preferencias similares les han gustado, pero que José no ha visto (gustado/valorado).Similarity recommendation: Because Joe liked the first three movies, Mahout looks at movies that others with similar preferences liked, but Joe hasn't watched (liked/rated). En este caso, Mahout recomendaría La amenaza fantasma, El ataque de los clones y La venganza de los Sith.In this case, Mahout recommends The Phantom Menace, Attack of the Clones, and Revenge of the Sith.

Descripción de los datosUnderstanding the data

Para su comodidad, GroupLens Research proporciona calificaciones de películas en un formato compatible con Mahout.Conveniently, GroupLens Research provides rating data for movies in a format that is compatible with Mahout. Estos datos están disponibles en el almacenamiento predeterminado del clúster en /HdiSamples/HdiSamples/MahoutMovieData.This data is available on your cluster's default storage at /HdiSamples/HdiSamples/MahoutMovieData.

Hay dos archivos, moviedb.txt y user-ratings.txt.There are two files, moviedb.txt and user-ratings.txt. El archivo user-ratings.txt se utiliza durante el análisis.The user-ratings.txt file is used during analysis. moviedb.txt se utiliza para proporcionar información de texto descriptivo al ver los resultados.The moviedb.txt is used to provide user-friendly text information when viewing the results.

Los datos del archivo user-ratings.txt tienen una estructura de userID, movieID, userRating y timestamp, que indica qué valoración dio cada usuario a una película.The data contained in user-ratings.txt has a structure of userID, movieID, userRating, and timestamp, which indicates how highly each user rated a movie. A continuación se muestra un ejemplo de los datos:Here is an example of the data:

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

Ejecutar el análisisRun the analysis

  1. Use el comando SSH para conectarse al clúster.Use ssh command to connect to your cluster. Modifique el comando siguiente: reemplace CLUSTERNAME por el nombre del clúster y, luego, escriba el comando:Edit the command below by replacing CLUSTERNAME with the name of your cluster, and then enter the command:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. Use el siguiente comando para ejecutar el trabajo de recomendación:Use the following command to run the recommendation job:

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

Nota

El trabajo puede tardar varios minutos en completarse y puede ejecutar varios trabajos de MapReduce.The job may take several minutes to complete, and may run multiple MapReduce jobs.

Visualización de la salidaView the output

  1. Cuando finalice el trabajo, use el siguiente comando para ver la salida generada.Once the job completes, use the following command to view the generated output:

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

    La salida tiene el siguiente aspecto:The output appears as follows:

    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 primera columna es userID.The first column is the userID. Los valores contenidos en '[' y ']' son movieId:recommendationScore.The values contained in '[' and ']' are movieId:recommendationScore.

  2. Puede usar el resultado, junto con el archivo moviedb.txt, para ofrecer más información sobre recomendaciones.You can use the output, along with the moviedb.txt, to provide more information on the recommendations. En primer lugar, copie los archivos de manera local con los siguientes comandos:First, copy the files locally using the following commands:

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

    Este comando copia los datos de salida a un archivo llamado recommendations.txt en el directorio actual, junto con los archivos de datos de la película.This command copies the output data to a file named recommendations.txt in the current directory, along with the movie data files.

  3. Use el siguiente comando para crear un script de Python que busca nombres de película para los datos en la salida de recomendaciones:Use the following command to create a Python script that looks up movie names for the data in the recommendations output:

    nano show_recommendations.py
    

    Cuando se abra el editor, use el siguiente texto como contenido del archivo:When the editor opens, use the following text as the contents of the 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 "------------------------"
    

    Presione Ctrl-X, Y y, finalmente, Entrar para guardar los datos.Press Ctrl-X, Y, and finally Enter to save the data.

  4. Ejecute el script de Python.Run the Python script. El siguiente comando da por hecho que está en el directorio donde se descargaron todos los archivos:The following command assumes you are in the directory where all the files were downloaded:

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

    Este comando busca las recomendaciones generadas para el usuario con el identificador 4.This command looks at the recommendations generated for user ID 4.

    • El archivo user-ratings.txt se usa para recuperar películas han recibido valoraciones.The user-ratings.txt file is used to retrieve movies that have been rated.

    • El archivo moviedb.txt se usa para recuperar los nombres de las películas.The moviedb.txt file is used to retrieve the names of the movies.

    • El archivo recommendations.txt se usa para recuperar las recomendaciones de películas para este usuario.The recommendations.txt is used to retrieve the movie recommendations for this user.

      La salida de este comando será similar al siguiente texto:The output from this command is similar to the following 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
      

Eliminar datos temporalesDelete temporary data

Los trabajos de Mahout no eliminan los datos temporales creados durante el procesamiento del trabajo.Mahout jobs don't remove temporary data that is created while processing the job. El parámetro --tempDir se especifica en el trabajo de ejemplo para aislar los archivos temporales en una ruta de acceso específica de forma que sea fácil eliminarlos.The --tempDir parameter is specified in the example job to isolate the temporary files into a specific path for easy deletion. Para quitar los archivos temporales, use el siguiente comando:To remove the temp files, use the following command:

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

Advertencia

Si desea volver a ejecutar el comando, también debe eliminar el directorio de salida.If you want to run the command again, you must also delete the output directory. Use lo siguiente para eliminar este directorio:Use the following to delete this directory:

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

Pasos siguientesNext steps

Ahora que ha aprendido a usar a Mahout, descubra otras formas de trabajar con datos en HDInsight:Now that you've learned how to use Mahout, discover other ways of working with data on HDInsight: