Vytvoření kanálu strojového učení Apache Sparku

Škálovatelná knihovna strojového učení (MLlib) Apache Sparku přináší možnosti modelování do distribuovaného prostředí. Balíček spark.ml Spark je sada rozhraní API vysoké úrovně založená na datových rámcích. Tato rozhraní API vám pomůžou vytvářet a ladit praktické kanály strojového učení. Strojové učení Sparku odkazuje na toto rozhraní API založené na datovém rámci MLlib, nikoli na starší rozhraní API kanálu založeného na RDD.

Kanál strojového učení (ML) je kompletní pracovní postup, který kombinuje více algoritmů strojového učení dohromady. Zpracování dat a učení se z dat může vyžadovat mnoho kroků, které vyžadují posloupnost algoritmů. Kanály definují fáze a pořadí procesu strojového učení. V MLlib jsou fáze kanálu reprezentovány určitou sekvencí PipelineStages, kde transformátor a estimátor provádějí úlohy.

Transformátor je algoritmus, který pomocí metody transformuje jeden datový rámec do jiného transform() . Například transformátor funkcí může číst jeden sloupec datového rámce, mapovat ho na jiný sloupec a vypíše nový datový rámec s připojeným namapovaným sloupcem.

Estimátor je abstrakce algoritmů učení a zodpovídá za přizpůsobení nebo trénování datové sady za účelem vytvoření transformátoru. Estimátor implementuje metodu s názvem fit(), která přijímá datový rámec a vytváří datový rámec, což je Transformátor.

Každá bezstavová instance transformátoru nebo nástroje Estimator má svůj vlastní jedinečný identifikátor, který se používá při zadávání parametrů. Obě používají k určení těchto parametrů jednotné rozhraní API.

Příklad kanálu

K předvedení praktického použití kanálu ML tento příklad používá ukázkový HVAC.csv datový soubor, který je předem načtený do výchozího úložiště pro váš cluster HDInsight, buď Azure Storage, nebo Data Lake Storage. Pokud chcete zobrazit obsah souboru, přejděte do /HdiSamples/HdiSamples/SensorSampleData/hvac adresáře. HVAC.csv obsahuje sadu časů s cílovými i skutečnými teplotami pro systémy topení, ventilace a klimatizace v různých budovách. Cílem je vytrénovat model na základě dat a vytvořit předpověď teploty pro danou budovu.

Následující kód:

  1. Definuje LabeledDocumentobjekt , který ukládá BuildingID, SystemInfo (identifikátor a stáří systému) a label (1.0, pokud je budova příliš horká, 0,0 v opačném případě).
  2. Vytvoří vlastní funkci parseDocument analyzátoru, která přebírá řádek (řádek) dat a určuje, jestli je budova "horká", porovnáním cílové teploty se skutečnou teplotou.
  3. Použije analyzátor při extrahování zdrojových dat.
  4. Vytvoří trénovací data.
from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import HashingTF, Tokenizer
from pyspark.sql import Row

# The data structure (column meanings) of the data array:
# 0 Date
# 1 Time
# 2 TargetTemp
# 3 ActualTemp
# 4 System
# 5 SystemAge
# 6 BuildingID

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(
    "wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")

documents = data.filter(lambda s: "Date" not in s).map(parseDocument)
training = documents.toDF()

Tento ukázkový kanál má tři fáze: Tokenizer a HashingTF (oba Transformátory) a Logistic Regression (odhadce). Extrahovaná a parsovaná data v datovém training rámci procházejí kanálem při pipeline.fit(training) volání.

  1. První fáze Tokenizerrozdělí SystemInfo vstupní sloupec (sestávající z identifikátoru systému a hodnoty stáří) do výstupního words sloupce. Tento nový words sloupec se přidá do datového rámce.
  2. Druhá fáze převede HashingTFnový words sloupec na vektory funkcí. Tento nový features sloupec se přidá do datového rámce. Tyto první dvě fáze jsou transformátory.
  3. Třetí fáze, LogisticRegression, je estimátor, a proto kanál volá metodu LogisticRegression.fit() k vytvoření LogisticRegressionModel.
tokenizer = Tokenizer(inputCol="SystemInfo", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lr = LogisticRegression(maxIter=10, regParam=0.01)

# Build the pipeline with our tokenizer, hashingTF, and logistic regression stages
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])

model = pipeline.fit(training)

Pokud chcete zobrazit nové words sloupce a features přidané Tokenizer transformátory a HashingTF a vzorek LogisticRegression odhadce, spusťte metodu v původním datovém PipelineModel.transform() rámci. V produkčním kódu by dalším krokem bylo předání testovacího datového rámce k ověření trénování.

peek = model.transform(training)
peek.show()

# Outputs the following:
+----------+----------+-----+--------+--------------------+--------------------+--------------------+----------+
|BuildingID|SystemInfo|label|   words|            features|       rawPrediction|         probability|prediction|
+----------+----------+-----+--------+--------------------+--------------------+--------------------+----------+
|         4|     13 20|  0.0|[13, 20]|(262144,[250802,2...|[0.11943986671420...|[0.52982451901740...|       0.0|
|        17|      3 20|  0.0| [3, 20]|(262144,[89074,25...|[0.17511205617446...|[0.54366648775222...|       0.0|
|        18|     17 20|  1.0|[17, 20]|(262144,[64358,25...|[0.14620993833623...|[0.53648750722548...|       0.0|
|        15|      2 23|  0.0| [2, 23]|(262144,[31351,21...|[-0.0361327091023...|[0.49096780538523...|       1.0|
|         3|      16 9|  1.0| [16, 9]|(262144,[153779,1...|[-0.0853679939336...|[0.47867095324139...|       1.0|
|         4|     13 28|  0.0|[13, 28]|(262144,[69821,25...|[0.14630166986618...|[0.53651031790592...|       0.0|
|         2|     12 24|  0.0|[12, 24]|(262144,[187043,2...|[-0.0509556393066...|[0.48726384581522...|       1.0|
|        16|     20 26|  1.0|[20, 26]|(262144,[128319,2...|[0.33829638728900...|[0.58377663577684...|       0.0|
|         9|      16 9|  1.0| [16, 9]|(262144,[153779,1...|[-0.0853679939336...|[0.47867095324139...|       1.0|
|        12|       6 5|  0.0|  [6, 5]|(262144,[18659,89...|[0.07513008136562...|[0.51877369045183...|       0.0|
|        15|     10 17|  1.0|[10, 17]|(262144,[64358,25...|[-0.0291988646553...|[0.49270080242078...|       1.0|
|         7|      2 11|  0.0| [2, 11]|(262144,[212053,2...|[0.03678030020834...|[0.50919403860812...|       0.0|
|        15|      14 2|  1.0| [14, 2]|(262144,[109681,2...|[0.06216423725633...|[0.51553605651806...|       0.0|
|         6|       3 2|  0.0|  [3, 2]|(262144,[89074,21...|[0.00565582077537...|[0.50141395142468...|       0.0|
|        20|     19 22|  0.0|[19, 22]|(262144,[139093,2...|[-0.0769288695989...|[0.48077726176073...|       1.0|
|         8|     19 11|  0.0|[19, 11]|(262144,[139093,2...|[0.04988910033929...|[0.51246968885151...|       0.0|
|         6|      15 7|  0.0| [15, 7]|(262144,[77099,20...|[0.14854929135994...|[0.53706918109610...|       0.0|
|        13|      12 5|  0.0| [12, 5]|(262144,[89689,25...|[-0.0519932532562...|[0.48700461408785...|       1.0|
|         4|      8 22|  0.0| [8, 22]|(262144,[98962,21...|[-0.0120753606650...|[0.49698119651572...|       1.0|
|         7|      17 5|  0.0| [17, 5]|(262144,[64358,89...|[-0.0721054054871...|[0.48198145477106...|       1.0|
+----------+----------+-----+--------+--------------------+--------------------+--------------------+----------+

only showing top 20 rows

Objekt model se teď dá použít k předpovědím. Úplnou ukázku této aplikace strojového učení a podrobné pokyny k jejímu spuštění najdete v tématu Vytváření aplikací strojového učení Apache Spark ve službě Azure HDInsight.

Viz také