Tutorial: Erstellen einer Apache Spark-Machine Learning-Anwendung in Azure HDInsightTutorial: Build an Apache Spark machine learning application in Azure HDInsight

In diesem Tutorial lernen Sie, wie Sie mit Jupyter Notebook eine Apache Spark-Machine Learning-Anwendung für Azure HDInsight erstellen.In this tutorial, you learn how to use the Jupyter Notebook to build an Apache Spark machine learning application for Azure HDInsight.

MLib ist die skalierbare Machine Learning-Bibliothek von Spark mit gängigen Lernalgorithmen und Hilfsprogrammen – einschließlich Klassifizierung, Regression, Clustering, kombinierten Filtern und Reduktion der Anzahl von Dimensionen sowie zugrunde liegenden Optimierungsprimitiven.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.

In diesem Tutorial lernen Sie Folgendes:In this tutorial, you learn how to:

  • Entwickeln einer Apache Spark-Machine Learning-AnwendungDevelop an Apache Spark machine learning application

VoraussetzungenPrerequisites

Grundlegendes zum DatasetUnderstand the data set

Für die Anwendung werden die HVAC.csv-Beispieldaten genutzt, die standardmäßig auf allen Clustern verfügbar sind.The application uses the sample HVAC.csv data that is available on all clusters by default. Die Datei befindet sich unter \HdiSamples\HdiSamples\SensorSampleData\hvac.The file is located at \HdiSamples\HdiSamples\SensorSampleData\hvac. Die Daten zeigen die Zieltemperatur und die Ist-Temperatur von Gebäuden an, in denen HVAC-Systeme installiert sind.The data shows the target temperature and the actual temperature of some buildings that have HVAC systems installed. Die Spalte System enthält die System-ID und die Spalte SystemAge eine Angabe in Jahren, wie lange das HVAC-System im Gebäude bereits verwendet wird.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. Mit diesen Daten können Sie vorhersagen, ob es in einem Gebäude basierend auf der Zieltemperatur zu warm oder zu kalt ist. Hierfür werden die System-ID und das Alter des Systems verwendet.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.

Momentaufnahme der für das Spark-Machine Learning-Beispiel verwendeten DatenSnapshot of data used for Spark machine learning example

Entwickeln einer Spark-Machine Learning-Anwendung mit Spark MLlibDevelop a Spark machine learning application using Spark MLlib

In dieser Anwendung verwenden Sie eine Spark ML-Pipeline, um eine Dokumentklassifizierung durchzuführen.In this application, you use a Spark ML pipeline to perform a document classification. ML-Pipelines bieten eine einheitliche Gruppe von auf Dataframes aufgesetzten High-Level-APIs, mit deren Hilfe Benutzer praktische Machine Learning-Pipelines erstellen und optimieren können.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. In der Pipeline teilen Sie das Dokument in Wörter auf, konvertieren die Wörter in einen numerischen Featurevektor und erstellen dann mit den Featurevektoren und Beschriftungen ein Vorhersagemodell.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. Führen Sie die folgenden Schritte aus, um die Anwendung zu erstellen:Perform the following steps to create the application.

  1. Erstellen Sie ein Jupyter Notebook mit dem PySpark-Kernel.Create a Jupyter notebook using the PySpark kernel. Informationen dazu finden Sie unter Erstellen eines Jupyter Notebooks.For the instructions, see Create a Jupyter notebook.

  2. Importieren Sie die Typen, die für dieses Szenario benötigt werden.Import the types required for this scenario. Fügen Sie den folgenden Codeausschnitt in eine leere Zelle ein, und drücken Sie UMSCHALT+EINGABETASTE.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. Lasen Sie die Daten (hvac.csv), analysieren Sie sie, und verwenden Sie sie zum Trainieren des Modells.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()
    

    Im Codeausschnitt definieren Sie eine Funktion, die die Ist-Temperatur mit der Zieltemperatur vergleicht.In the code snippet, you define a function that compares the actual temperature with the target temperature. Wenn die Ist-Temperatur höher ist, wird angegeben, dass es in dem Gebäude zu warm ist (Wert 1,0).If the actual temperature is greater, the building is hot, denoted by the value 1.0. Andernfalls wird angegeben, dass es im Gebäude zu kalt ist (Wert 0.0).Otherwise the building is cold, denoted by the value 0.0.

  4. Konfigurieren Sie die Spark Machine Learning-Pipeline, die drei Phasen umfasst: Tokenizer, hashingTF und 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])
    

    Weitere Informationen zur Pipeline und ihrer Funktionsweise finden Sie unter Apache Spark machine learning pipeline (Apache Spark-Machine Learning-Pipeline).For more information about pipeline and how it works, see Apache Spark machine learning pipeline.

  5. Passen Sie die Pipeline an das Schulungsdokument an.Fit the pipeline to the training document.

    model = pipeline.fit(training)
    
  6. Überprüfen Sie das Schulungsdokument, um Ihre Fortschritte in Bezug auf die Anwendung zu ermitteln.Verify the training document to checkpoint your progress with the application.

    training.show()
    

    Die Ausgabe sieht in etwa wie folgt aus: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|
    +----------+----------+-----+
    

    Vergleichen Sie die Ausgabe mit der CSV-Rohdatei.Comparing the output against the raw CSV file. Die erste Zeile der CSV-Datei enthält beispielsweise folgende Daten:For example, the first row the CSV file has this data:

    Momentaufnahme der Ausgabedaten für das Spark-Machine Learning-BeispielOutput data snapshot for Spark machine learning example

    Beachten Sie, dass die Ist-Temperatur unterhalb der Zieltemperatur liegt. Im Gebäude ist es also zu kalt.Notice how the actual temperature is less than the target temperature suggesting the building is cold. In der Schulungsausgabe lautet der Wert label in der ersten Zeile daher 0,0. Dies bedeutet, dass es im Gebäude nicht zu warm ist.Hence in the training output, the value for label in the first row is 0.0, which means the building is not hot.

  7. Bereiten Sie ein Dataset vor, für das das Schulungsmodell ausgeführt werden kann.Prepare a data set to run the trained model against. Hierzu übergeben Sie eine System-ID und ein Systemalter (in der Schulungsausgabe als SystemInfo bezeichnet). Mit dem Modell wird dann vorhergesagt, ob es im Gebäude mit der jeweiligen System-ID und dem Systemalter wärmer (1,0) oder kälter (0,0) ist.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. Treffen Sie als Letztes die Vorhersagen für die Testdaten.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
    

    Die Ausgabe sieht in etwa wie folgt aus: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]))
    

    In der ersten Zeile der Vorhersage können Sie sehen, dass das Gebäude für ein HVAC-System mit ID 20 und einem Systemalter von 25 Jahren sehr warm ist (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). Der erste Wert für DenseVector (0,49999) entspricht der Vorhersage 0,0, und der zweite Wert (0,5001) entspricht der Vorhersage 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. Obwohl der zweite Wert in der Ausgabe nur unwesentlich höher ist, zeigt das Modell prediction=1.0an.In the output, even though the second value is only marginally higher, the model shows prediction=1.0.

  9. Fahren Sie das Notebook herunter, um die Ressourcen freizugeben.Shut down the notebook to release the resources. Wählen Sie hierzu im Menü Datei des Notebooks die Option Schließen und Anhalten aus.To do so, from the File menu on the notebook, select Close and Halt. Mit dieser Aktion wird das Notebook heruntergefahren und geschlossen.This action shuts down and closes the notebook.

Verwenden der Anaconda-scikit-learn-Bibliothek für Spark-Machine LearningUse Anaconda scikit-learn library for Spark machine learning

Apache Spark-Cluster in HDInsight enthalten Anaconda-Bibliotheken.Apache Spark clusters in HDInsight include Anaconda libraries. Dazu gehört auch die scikit-learn-Bibliothek für Machine Learning.It also includes the scikit-learn library for machine learning. Außerdem enthält die Bibliothek verschiedene Datasets, mit denen Sie Beispielanwendungen direkt über ein Jupyter Notebook erstellen können.The library also includes various data sets that you can use to build sample applications directly from a Jupyter notebook. Beispiele zur Verwendung der scikit-learn-Bibliothek finden Sie unter 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.

Bereinigen von RessourcenClean up resources

Wenn Sie diese Anwendung nicht mehr benötigen, gehen Sie wie folgt vor, um den erstellten Cluster zu löschen:If you're not going to continue to use this application, delete the cluster that you created with the following steps:

  1. Melden Sie sich beim Azure-Portal an.Sign in to the Azure portal.

  2. Geben Sie oben im Suchfeld den Suchbegriff HDInsight ein.In the Search box at the top, type HDInsight.

  3. Wählen Sie unter Dienste die Option HDInsight-Cluster aus.Select HDInsight clusters under Services.

  4. Klicken Sie in der daraufhin angezeigten Liste mit den HDInsight-Clustern neben dem Cluster, den Sie für dieses Tutorial erstellt haben, auf die Auslassungspunkte ( ... ).In the list of HDInsight clusters that appears, select the ... next to the cluster that you created for this tutorial.

  5. Klicken Sie auf Löschen.Select Delete. Wählen Sie Ja aus.Select Yes.

Löschen eines HDInsight-ClustersDelete an HDInsight cluster

Nächste SchritteNext steps

In diesem Tutorial haben Sie gelernt, wie Sie mit Jupyter Notebook eine Apache Spark-Machine Learning-Anwendung für Azure HDInsight erstellen.In this tutorial, you learned how to use the Jupyter Notebook to build an Apache Spark machine learning application for Azure HDInsight. Im nächsten Tutorial erfahren Sie, wie Sie IntelliJ IDEA für Spark-Aufträge verwenden.Advance to the next tutorial to learn how to use IntelliJ IDEA for Spark jobs.