Tutorial: Compilación de aplicaciones de aprendizaje automático de Apache Spark en Azure HDInsightTutorial: Build an Apache Spark machine learning application in Azure HDInsight

En este tutorial, aprenderá a usar Jupyter Notebook para compilar una aplicación de aprendizaje de automático de Azure Spark para Apache HDInsight.In this tutorial, you learn how to use the Jupyter Notebook to build an Apache Spark machine learning application for Azure HDInsight.

MLlib: es una biblioteca de aprendizaje automático escalable de Spark que consta de algoritmos y utilidades de aprendizaje comunes, como la clasificación, la regresión, la agrupación en clústeres, el filtrado colaborativo, la reducción de dimensionalidad, y las primitivas de optimización subyacentes.MLlib is Spark’s scalable machine learning library consisting of common learning algorithms and utilities, including classification, regression, clustering, collaborative filtering, dimensionality reduction, as well as underlying optimization primitives.

En este tutorial, aprenderá a:In this tutorial, you learn how to:

  • Desarrollar una aplicación de aprendizaje automático de Apache SparkDevelop an Apache Spark machine learning application

Requisitos previosPrerequisites

Información acerca del conjunto de datosUnderstand the data set

La aplicación usa los datos de ejemplo de HVAC.csv, que están disponibles en todos los clústeres de manera predeterminada.The application uses the sample HVAC.csv data that is available on all clusters by default. El archivo se encuentra en \HdiSamples\HdiSamples\SensorSampleData\hvac.The file is located at \HdiSamples\HdiSamples\SensorSampleData\hvac. Los datos muestran la temperatura objetivo y la temperatura real de algunos edificios que tienen sistemas de calefacción, ventilación y aire acondicionado instalados.The data shows the target temperature and the actual temperature of some buildings that have HVAC systems installed. La columna System representa el identificador del sistema y la columna SystemAge, el número de años que lleva el sistema HVAC instalado en el edificio.The System column represents the system ID and the SystemAge column represents the number of years the HVAC system has been in place at the building. Mediante los datos se puede predecir si un edificio será más cálido o frío en función de la temperatura objetivo, dados un identificador del sistema y la antigüedad del sistema.Using the data, you can predict whether a building will be hotter or colder based on the target temperature, given a system ID, and system age.

Instantánea de datos usados para el ejemplo de aprendizaje automático de SparkSnapshot of data used for Spark machine learning example

Desarrollo de una aplicación de aprendizaje automático de Spark mediante Spark MLlibDevelop a Spark machine learning application using Spark MLlib

En esta aplicación se usa una canalización ML de Spark para realizar una clasificación de documentos.In this application, you use a Spark ML pipeline to perform a document classification. Las canalizaciones ML proporcionan un conjunto uniforme de API de alto nivel creadas a partir de tramas de datos que ayudan a los usuarios a crear y ajustar las canalizaciones prácticas de aprendizaje automático.ML Pipelines provide a uniform set of high-level APIs built on top of DataFrames that help users create and tune practical machine learning pipelines. En la canalización, se divide el documento en palabras, se convierten las palabras en un vector numérico de característica y finalmente se genera un modelo de predicción que use los vectores de característica y las etiquetas.In the pipeline, you split the document into words, convert the words into a numerical feature vector, and finally build a prediction model using the feature vectors and labels. Realice los siguientes pasos para crear la aplicación:Perform the following steps to create the application.

  1. Cree un cuaderno de Jupyter Notebook con el kernel de PySpark.Create a Jupyter notebook using the PySpark kernel. Para las instrucciones, consulte Creación de un cuaderno de Jupyter Notebook.For the instructions, see Create a Jupyter notebook.

  2. Importe los tipos necesarios para este escenario.Import the types required for this scenario. Pegue el siguiente fragmento de código en una celda vacía y presione MAYÚS + ENTRAR.Paste the following snippet in an empty cell, and then press SHIFT + ENTER.

    from pyspark.ml import Pipeline
    from pyspark.ml.classification import LogisticRegression
    from pyspark.ml.feature import HashingTF, Tokenizer
    from pyspark.sql import Row
    
    import os
    import sys
    from pyspark.sql.types import *
    
    from pyspark.mllib.classification import LogisticRegressionWithSGD
    from pyspark.mllib.regression import LabeledPoint
    from numpy import array
    
  3. Cargue los datos (hvac.csv), analícelos y úselos para entrenar el modelo.Load the data (hvac.csv), parse it, and use it to train the model.

    # Define a type called LabelDocument
    LabeledDocument = Row("BuildingID", "SystemInfo", "label")
    
    # Define a function that parses the raw CSV file and returns an object of type LabeledDocument
    def parseDocument(line):
        values = [str(x) for x in line.split(',')]
        if (values[3] > values[2]):
            hot = 1.0
        else:
            hot = 0.0        
    
        textValue = str(values[4]) + " " + str(values[5])
    
        return LabeledDocument((values[6]), textValue, hot)
    
    # Load the raw HVAC.csv file, parse it using the function
    data = sc.textFile("/HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
    documents = data.filter(lambda s: "Date" not in s).map(parseDocument)
    training = documents.toDF()
    

    En el fragmento de código, se define una función que compara la temperatura real con la temperatura de destino.In the code snippet, you define a function that compares the actual temperature with the target temperature. Si la temperatura real es mayor, el edificio está cálido, lo que viene indicado por el valor 1.0.If the actual temperature is greater, the building is hot, denoted by the value 1.0. De lo contrario, el edificio está frío, lo que se indica con el valor 0.0.Otherwise the building is cold, denoted by the value 0.0.

  4. Configure la canalización de aprendizaje automático de Spark, que consta de tres fases: tokenizer, hashingTF e lr.Configure the Spark machine learning pipeline that consists of three stages: tokenizer, hashingTF, and lr.

    tokenizer = Tokenizer(inputCol="SystemInfo", outputCol="words")
    hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
    lr = LogisticRegression(maxIter=10, regParam=0.01)
    pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])
    

    Para más información acerca de las canalizaciones y cómo funcionan, consulte Canalización de aprendizaje automático de Apache Spark.For more information about pipeline and how it works, see Apache Spark machine learning pipeline.

  5. Ajuste la canalización al documento de formación.Fit the pipeline to the training document.

    model = pipeline.fit(training)
    
  6. Compruebe el documento de aprendizaje para controlar el progreso con la aplicación.Verify the training document to checkpoint your progress with the application.

    training.show()
    

    La salida es parecida a esta:The output is similar to:

    +----------+----------+-----+
    |BuildingID|SystemInfo|label|
    +----------+----------+-----+
    |         4|     13 20|  0.0|
    |        17|      3 20|  0.0|
    |        18|     17 20|  1.0|
    |        15|      2 23|  0.0|
    |         3|      16 9|  1.0|
    |         4|     13 28|  0.0|
    |         2|     12 24|  0.0|
    |        16|     20 26|  1.0|
    |         9|      16 9|  1.0|
    |        12|       6 5|  0.0|
    |        15|     10 17|  1.0|
    |         7|      2 11|  0.0|
    |        15|      14 2|  1.0|
    |         6|       3 2|  0.0|
    |        20|     19 22|  0.0|
    |         8|     19 11|  0.0|
    |         6|      15 7|  0.0|
    |        13|      12 5|  0.0|
    |         4|      8 22|  0.0|
    |         7|      17 5|  0.0|
    +----------+----------+-----+
    

    La comparación de la salida con el archivo CSV sin procesar.Comparing the output against the raw CSV file. Por ejemplo, la primera fila del archivo CSV tiene estos datos:For example, the first row the CSV file has this data:

    Instantánea de datos de salida para el ejemplo de aprendizaje automático de SparkOutput data snapshot for Spark machine learning example

    Observe que la temperatura real es menor que la temperatura objetivo, lo que indica que el edificio está frío.Notice how the actual temperature is less than the target temperature suggesting the building is cold. Por lo tanto, en la salida de aprendizaje, el valor de label en la primera fila es 0.0, lo que significa que la temperatura del edificio no es cálida.Hence in the training output, the value for label in the first row is 0.0, which means the building is not hot.

  7. Prepare un conjunto de datos con el que ejecutar el modelo entrenado.Prepare a data set to run the trained model against. Para ello, deberá pasar un identificador del sistema y la antigüedad del sistema (representados como SystemInfo en la salida de entrenamiento), y el modelo predecirá si el edificio con ese identificador y esa antigüedad del sistema es más cálido (indicado por 1.0) o frío (indicado por 0.0).To do so, you pass on a system ID and system age (denoted as SystemInfo in the training output), and the model predicts whether the building with that system ID and system age will be hotter (denoted by 1.0) or cooler (denoted by 0.0).

    # SystemInfo here is a combination of system ID followed by system age
    Document = Row("id", "SystemInfo")
    test = sc.parallelize([(1L, "20 25"),
                    (2L, "4 15"),
                    (3L, "16 9"),
                    (4L, "9 22"),
                    (5L, "17 10"),
                    (6L, "7 22")]) \
        .map(lambda x: Document(*x)).toDF()
    
  8. Por último, realice predicciones basadas en los datos de prueba.Finally, make predictions on the test data.

    # Make predictions on test documents and print columns of interest
    prediction = model.transform(test)
    selected = prediction.select("SystemInfo", "prediction", "probability")
    for row in selected.collect():
        print row
    

    La salida es parecida a esta:The output is similar to:

    Row(SystemInfo=u'20 25', prediction=1.0, probability=DenseVector([0.4999, 0.5001]))
    Row(SystemInfo=u'4 15', prediction=0.0, probability=DenseVector([0.5016, 0.4984]))
    Row(SystemInfo=u'16 9', prediction=1.0, probability=DenseVector([0.4785, 0.5215]))
    Row(SystemInfo=u'9 22', prediction=1.0, probability=DenseVector([0.4549, 0.5451]))
    Row(SystemInfo=u'17 10', prediction=1.0, probability=DenseVector([0.4925, 0.5075]))
    Row(SystemInfo=u'7 22', prediction=0.0, probability=DenseVector([0.5015, 0.4985]))
    

    En la primera fila de la predicción, puede ver que, en un sistema HVAC con el identificador 20 y una antigüedad de 25 años, el edificio tiene una temperatura cálida (prediction=1.0).From the first row in the prediction, you can see that for an HVAC system with ID 20 and system age of 25 years, the building is hot (prediction=1.0). El primer valor de DenseVector (0.49999) corresponde a la predicción 0.0 y el segundo, (0.5001), corresponde a la predicción 1.0.The first value for DenseVector (0.49999) corresponds to the prediction 0.0 and the second value (0.5001) corresponds to the prediction 1.0. En la salida, aunque el segundo valor solo es levemente superior, el modelo muestra prediction=1.0.In the output, even though the second value is only marginally higher, the model shows prediction=1.0.

  9. Cierre el cuaderno para liberar los recursos.Shut down the notebook to release the resources. Para ello, en el menú File (Archivo) del cuaderno y seleccione Close and Halt (Cerrar y detener).To do so, from the File menu on the notebook, select Close and Halt. Con esta acción se cerrará el cuaderno.This action shuts down and closes the notebook.

Uso de la biblioteca scikit-learn de Anaconda para el aprendizaje automático de SparkUse Anaconda scikit-learn library for Spark machine learning

Los clústeres Apache Spark de HDInsight incluyen bibliotecas de Anaconda.Apache Spark clusters in HDInsight include Anaconda libraries. También incluyen la biblioteca scikit-learn para el aprendizaje automático.It also includes the scikit-learn library for machine learning. La biblioteca también contiene diversos conjuntos de datos que puede usar para crear aplicaciones de ejemplo directamente a partir de un cuaderno de Jupyter.The library also includes various data sets that you can use to build sample applications directly from a Jupyter notebook. Para obtener ejemplos sobre el uso de la biblioteca scikit-learn, consulte https://scikit-learn.org/stable/auto_examples/index.html.For examples on using the scikit-learn library, see https://scikit-learn.org/stable/auto_examples/index.html.

Limpieza de recursosClean up resources

Si no va a seguir usando esta aplicación, elimine el clúster que creó mediante los siguientes pasos:If you're not going to continue to use this application, delete the cluster that you created with the following steps:

  1. Inicie sesión en el Azure Portal.Sign in to the Azure portal.

  2. En el cuadro Búsqueda en la parte superior, escriba HDInsight.In the Search box at the top, type HDInsight.

  3. Seleccione Clústeres de HDInsight en Servicios.Select HDInsight clusters under Services.

  4. En la lista de clústeres de HDInsight que aparece, seleccione el signo ... situado junto al clúster que ha creado para este tutorial.In the list of HDInsight clusters that appears, select the ... next to the cluster that you created for this tutorial.

  5. Seleccione Eliminar.Select Delete. Seleccione .Select Yes.

Eliminación de un clúster de HDInsightDelete an HDInsight cluster

Pasos siguientesNext steps

En este tutorial, ha aprendido a usar Jupyter Notebook para compilar una aplicación de aprendizaje de automático de Azure Spark para Apache HDInsight.In this tutorial, you learned how to use the Jupyter Notebook to build an Apache Spark machine learning application for Azure HDInsight. Para aprender a usar IntelliJ IDEA para trabajos de Spark, pase al siguiente tutorial.Advance to the next tutorial to learn how to use IntelliJ IDEA for Spark jobs.