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:
- Definuje
LabeledDocument
objekt , který ukládáBuildingID
,SystemInfo
(identifikátor a stáří systému) alabel
(1.0, pokud je budova příliš horká, 0,0 v opačném případě). - 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. - Použije analyzátor při extrahování zdrojových dat.
- 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í.
- První fáze
Tokenizer
rozdělíSystemInfo
vstupní sloupec (sestávající z identifikátoru systému a hodnoty stáří) do výstupníhowords
sloupce. Tento novýwords
sloupec se přidá do datového rámce. - Druhá fáze převede
HashingTF
nový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. - Třetí fáze,
LogisticRegression
, je estimátor, a proto kanál volá metoduLogisticRegression.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.