Tutorial: Criar um aplicativo de aprendizado de máquina Apache Spark no Azure HDInsight
Neste tutorial, você aprenderá a usar o Jupyter Notebook para criar um aplicativo de aprendizado de máquina Apache Spark para o Azure HDInsight.
MLlib é a biblioteca de aprendizado de máquina adaptável do Spark que consiste em algoritmos e utilitários de aprendizado comuns. (Classificação, regressão, agrupamento, filtragem colaborativa e redução de dimensionalidade. Além disso, primitivos de otimização subjacentes.)
Neste tutorial, irá aprender a:
- Desenvolver um aplicativo de aprendizado de máquina Apache Spark
Pré-requisitos
Um cluster do Apache Spark no HDInsight. Consulte Criar um cluster do Apache Spark.
Familiaridade com a utilização de Jupyter Notebooks com o Spark no HDInsight. Para obter mais informações, consulte Carregar dados e executar consultas com o Apache Spark no HDInsight.
Compreender o conjunto de dados
O aplicativo usa os dados de HVAC.csv de exemplo que estão disponíveis em todos os clusters por padrão. O arquivo está localizado em \HdiSamples\HdiSamples\SensorSampleData\hvac
. Os dados mostram a temperatura pretendida e a temperatura real de alguns edifícios que têm sistemas HVAC instalados. A coluna System (Sistema) representa o ID do sistema e a coluna SystemAge (Idade do sistema) representa há quanto anos o sistema HVAC foi implementado nesse edifício. Você pode prever se um edifício será mais quente ou mais frio com base na temperatura alvo, no ID do sistema e na idade do sistema.
Desenvolver uma aplicação de machine learning do Spark com a MLlib do Spark
Este aplicativo usa um pipeline do Spark ML para fazer uma classificação de documento. Os Pipelines de ML fornecem um conjunto uniforme de APIs de alto nível criadas sobre DataFrames. Os DataFrames ajudam os usuários a criar e ajustar pipelines práticos de aprendizado de máquina. No pipeline, o documento é dividido em palavras, estas são convertidas num vetor de numérico de características e, por fim, é criado um modelo de previsão que utiliza os vetores de características e as etiquetas. Execute as etapas a seguir para criar o aplicativo.
Crie um Jupyter Notebook usando o kernel PySpark. Para obter instruções, consulte Criar um arquivo do Jupyter Notebook.
Importe os tipos necessários para este cenário. Cole o seguinte fragmento numa célula vazia e prima 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 LogisticRegressionWithLBFGS from pyspark.mllib.regression import LabeledPoint from numpy import array
Carregue os dados (hvac.csv), analise-os e utilize-os para preparar o modelo.
# 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()
No fragmento de código, vai definir uma função que compara a temperatura real com a temperatura pretendida. Se a temperatura real for superior, o edifício está quente, o que é mostrado pelo valor 1.0. Caso contrário, o edifício está frio, o que é mostrado pelo valor 0.0.
Configure o pipeline de aprendizado de máquina do Spark que consiste em três estágios:
tokenizer
,hashingTF
elr
.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 obter mais informações sobre pipeline e como ele funciona, consulte Apache Spark machine learning pipeline.
Ajuste o pipeline ao documento de preparação.
model = pipeline.fit(training)
Verifique o documento de preparação para registar o progresso com a aplicação.
training.show()
O resultado é semelhante a:
+----------+----------+-----+ |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| +----------+----------+-----+
Compare o resultado com o ficheiro CSV não processado. Por exemplo, a primeira linha do ficheiro CSV tem estes dados:
Repare como a temperatura real é inferior à pretendida, o que sugere que o edifício está frio. O valor para rótulo na primeira linha é 0,0, o que significa que o edifício não está quente.
Prepare um conjunto de dados no qual executar o modelo preparado. Para fazer isso, você passa um ID do sistema e idade do sistema (indicado como SystemInfo na saída do treinamento). O modelo prevê se o edifício com esse ID de sistema e idade do sistema será mais quente (indicado por 1,0) ou mais frio (indicado por 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()
Por fim, faça predições nos dados de teste.
# 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)
O resultado é semelhante a:
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]))
Observe a primeira linha da previsão. Para um sistema AVAC com ID 20 e idade do sistema de 25 anos, o edifício está quente (previsão=1,0). O primeiro valor para DenseVector (0.49999) corresponde à predição 0.0 e o segundo valor (0.5001) corresponde à predição 1.0. Na saída, apesar de o segundo valor ser apenas marginalmente superior, o modelo mostra prediction=1.0.
Encerre o bloco de notas para libertar os recursos. Para tal, no menu File (Ficheiro) do bloco de notas, selecione Close and Halt (Fechar e Parar). Esta ação encerra e fecha o bloco de notas.
Utilizar a biblioteca scikit-learn de Anaconda para machine learning do Spark
Os clusters do Apache Spark no HDInsight incluem bibliotecas de Anaconda. Também inclui a biblioteca scikit-learn para machine learning. A biblioteca também inclui vários conjuntos de dados que você pode usar para criar aplicativos de exemplo diretamente de um Jupyter Notebook. Para obter exemplos de como utilizar a biblioteca scikit-learn, veja https://scikit-learn.org/stable/auto_examples/index.html.
Clean up resources (Limpar recursos)
Se não pretender continuar a utilizar esta aplicação, elimine o cluster que criou com os seguintes passos:
Inicie sessão no portal do Azure.
Na caixa Pesquisar na parte superior, digite HDInsight.
Selecione Clusters HDInsight em Serviços.
Na lista de clusters HDInsight exibida, selecione o botão ... ao lado do cluster que você criou para este tutorial.
Selecione Eliminar. Selecione Yes (Sim).
Próximos passos
Neste tutorial, você aprendeu como usar o Jupyter Notebook para criar um aplicativo de aprendizado de máquina Apache Spark para o Azure HDInsight. Avance para o próximo tutorial para saber como utilizar o IntelliJ IDEA para trabalhos do Spark.