Kurz: Sestavení Apache Spark machine learningu aplikace v HDInsightTutorial: Build an Apache Spark machine learning application in HDInsight

V tomto kurzu se dozvíte, jak používat Poznámkový blok Jupyter k sestavení Apache Spark služby machine learning aplikací pro Azure HDInsight.In this tutorial, you learn how to use the Jupyter Notebook to build an Apache Spark machine learning application for Azure HDInsight.

MLlib je knihovna škálovatelného strojového učení Sparku, která se skládá z běžných algoritmů a nástrojů strojového učení, včetně klasifikace, regrese, clusteringu, filtrování založeného na spolupráci, snížení počtu dimenzí a také základních primitiv optimalizace.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.

V tomto kurzu se naučíte:In this tutorial, you learn how to:

  • Vývoj Apache Spark machine learningu aplikaceDevelop an Apache Spark machine learning application

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.If you don't have an Azure subscription, create a free account before you begin.

Požadavky:Prerequisites:

Potřebujete následující položku:You must have the following item:

Vysvětlení datové sadyUnderstand the data set

Aplikace používá ukázková data ze souboru HVAC.csv, který je standardně k dispozici ve všech clusterech.The application uses the sample HVAC.csv data that is available on all clusters by default. Soubor se nachází v umístění \HdiSamples\HdiSamples\SensorSampleData\hvac.The file is located at \HdiSamples\HdiSamples\SensorSampleData\hvac. Data ukazují cílovou teplotu a skutečnou teplotu několika budov s nainstalovanými systémy HVAC.The data shows the target temperature and the actual temperature of some buildings that have HVAC systems installed. Sloupec System představuje ID systému a sloupec SystemAge představuje počet let, kolik je systém HVAC v budově umístěný.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. Pomocí těchto dat můžete odhadnout, jestli budova bude teplejší nebo studenější na základě cílové teploty, daného ID systému a stáří systému.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.

Snímek dat použitých v příkladu strojového učení SparkuSnapshot of data used for Spark machine learning example

Vývoj aplikace strojového učení Sparku pomocí knihovny Spark MLlibDevelop a Spark machine learning application using Spark MLlib

V této aplikaci použijete kanál ML Sparku k provedení klasifikace dokumentu.In this application, you use a Spark ML pipeline to perform a document classification. Kanály ML poskytují jednotnou sadu rozhraní API vysoké úrovně postavených nad datovými rámci, která uživatelům pomáhají vytvářet a ladit užitečné kanály strojového učení.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. V kanálu rozdělíte dokument na slova, převedete slova na vektory číselné funkce a nakonec pomocí vektorů číselné funkce a popisků sestavíte prediktivní model.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. Proveďte následující kroky a vytvořte aplikaci.Perform the following steps to create the application.

  1. Vytvořte poznámkový blok Jupyter pomocí jádra PySpark.Create a Jupyter notebook using the PySpark kernel. Pokyny najdete v tématu Vytvoření poznámkového bloku Jupyter.For the instructions, see Create a Jupyter notebook.

  2. Naimportujte typy potřebné pro tento scénář.Import the types required for this scenario. Do prázdné buňky vložte následující fragment kódu a pak stiskněte SHIFT + ENTER.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. Načtěte data (ze souboru hvac.csv), proveďte jejich parsování a použijte je k natrénování modelu.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()
    

    Ve fragmentu kódu definujete funkci, která porovnává skutečnou teplotu s cílovou teplotou.In the code snippet, you define a function that compares the actual temperature with the target temperature. Pokud je skutečná teplota vyšší, budova je teplá a označí se hodnotou 1.0.If the actual temperature is greater, the building is hot, denoted by the value 1.0. V opačném případě je budova studená a označí se hodnotou 0.0.Otherwise the building is cold, denoted by the value 0.0.

  4. Nakonfigurujte kanál strojového učení Sparku, který se skládá ze tří fází: tokenizer, hashingTF a 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])
    

    Další informace o kanálu a jak to funguje, najdete v části kanálu strojového učení Apache Sparku.For more information about pipeline and how it works, see Apache Spark machine learning pipeline.

  5. Přizpůsobte kanál pro trénovací dokument.Fit the pipeline to the training document.

    model = pipeline.fit(training)
    
  6. Ověřte trénovací dokument a zkontrolujte pokrok s aplikací.Verify the training document to checkpoint your progress with the application.

    training.show()
    

    Výstup je podobný tomuto: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|
    +----------+----------+-----+
    

    Porovnejte výstup s nezpracovaným souborem CSV.Comparing the output against the raw CSV file. Například první řádek souboru CSV obsahuje tato data:For example, the first row the CSV file has this data:

    Snímek výstupních dat pro příklad strojového učení SparkuOutput data snapshot for Spark machine learning example

    Všimněte si, že skutečná teplota je nižší než cílová teplota. To značí, že je budova studená.Notice how the actual temperature is less than the target temperature suggesting the building is cold. Proto je v trénovacím výstupu hodnota label na prvním řádku 0.0, což znamená, že budova není teplá.Hence in the training output, the value for label in the first row is 0.0, which means the building is not hot.

  7. Připravte datovou sadu, pro kterou chcete natrénovaný model spustit.Prepare a data set to run the trained model against. Provedete to tak, že předáte ID systému a stáří systému (v trénovacím výstupu označené jako SystemInfo) a model odhadne, jestli budova s tímto ID systému a stářím systému bude teplejší (označení 1.0) nebo studenější (označení 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. Nakonec na základě testovacích dat vytvořte předpovědi.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
    

    Výstup je podobný tomuto: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]))
    

    Na prvním řádku předpovědi vidíte, že v případě systému HVAC s ID 20 a stářím 25 let je budova teplá (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). První hodnota DenseVector (0.49999) odpovídá předpovědi 0.0 a druhá hodnota (0.5001) odpovídá předpovědi 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. Přestože je druhá hodnota pouze nepatrně vyšší, model ve výstupu zobrazí prediction=1.0.In the output, even though the second value is only marginally higher, the model shows prediction=1.0.

  9. Vypněte poznámkový blok a uvolněte tak prostředky.Shut down the notebook to release the resources. Provedete to tak, že v nabídce Soubor poznámkového bloku vyberete Zavřít a zastavit.To do so, from the File menu on the notebook, select Close and Halt. Tato akce poznámkový blok vypne a zavře.This action shuts down and closes the notebook.

Použití knihovny Anaconda scikit-learn pro strojové učení SparkuUse Anaconda scikit-learn library for Spark machine learning

Clustery Apache Spark ve službě HDInsight obsahují knihovny Anaconda.Apache Spark clusters in HDInsight include Anaconda libraries. Jejich součástí je také knihovna scikit-learn pro strojové učení.It also includes the scikit-learn library for machine learning. Knihovna obsahuje také různé datové sady, které můžete použít k vytváření ukázkových aplikací přímo z poznámkového bloku Jupyter.The library also includes various data sets that you can use to build sample applications directly from a Jupyter notebook. Příklady použití knihovny scikit-learn najdete tady: 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.

Další postupNext steps

V tomto kurzu jste se naučili:In this tutorial, you learned how to:

  • Vývoj Apache Spark machine learningu aplikaceDevelop an Apache Spark machine learning application

V dalším kurzu se dozvíte, jak používat IntelliJ IDEA pro úlohy Sparku.Advance to the next tutorial to learn how to use IntelliJ IDEA for Spark jobs.