Pontos Principais
-
Aprenda sobre pipelines de machine learning;
-
Como o pacote Apache Spark ML pode ajudar na implementação de pipelines de ML;
-
Etapas no processo da cadeia de valor dos dados;
-
Componentes do pipeline de Spark ML e API;
-
Casos de uso para classificação de texto e detecção de spam.
Este é o quinto artigo da série "Big Data com Apache Spark". Também disponíveis: Parte 1: Introdução, Parte 2: Spark SQL, Parte 3: Spark Streaming e Parte 4: Spark Machine Learning.
Nos artigos anteriores da série "Big Data com Apache Spark", conhecemos o framework do Apache Spark e suas diferentes bibliotecas para processamento de Big Data com Introdução ao Spark (Parte 1), Spark SQL (Parte 2), Spark Streaming (Parte 3) e a biblioteca de Machine Learning Spark MLlib (Parte 4).
Nesse artigo, vamos focar em outra API para Machine Learning do Spark, chamada Spark ML, que é a solução recomendada para o desenvolvimento de aplicações de Big Data utilizando pipeline de dados.
O pacote spark.ml provê uma API de machine learning API construída a partir de DataFrames, que vem se consolidando com a parte principal da biblioteca Spark SQL. Esse pacote pode ser usado para desenvolvimento e manutenção de pipelines de machine learning (ML). Ele também provê extratores de features, transformers, selectors e tem suporte a técnicas de machine learning como classificação, regressão e agrupamento. Todas essas funcionalidades são críticas para o desenvolvimento de soluções de machine learning.
Vamos aprender como usar o Apache Spark para realização de análises exploratória dos dados (Exploratory Data Analysis, EDA), desenvolver pipelines de ML, e utilizar as APIs e algoritmos disponíveis no pacote spark.ml.
Com suporte para construir pipelines de dados para machine learning, o framework Apache Spark é uma ótima escolha para um uso unificado que combina Extract, Transform and Load (extrair, transformar e carregar, ETL), análise em batch ou stream de tempo real, machine learning, processamento de grafos e visualização.
Pipelines de dados com Machine Learning
Os pipelines de ML são utilizados para criação, tuning e inspeção de workflows de ML, também nos ajudam a focar mais nos requisitos de Big Data e nas tarefas de machine learning, em vez de desperdiçar tempo e esforço na infra-estrutura e áreas de computação distribuída. Também ajudam nos estágios exploratórios que envolvem problemas de machine learning, nos quais precisamos desenvolver iterações de features e combinação de modelos.
Workflows de ML muitas vezes envolvem uma sequência de estágios de processamento e aprendizado. Um pipeline de dados de ML é especificado como uma sequência de estágios, em que cada estágio é um componente do tipo Transformer (transformador) ou Estimator (estimador).
Frameworks para desenvolvimento de ML precisam ter suporte à computação distribuída, bem como possuir ferramentas para montagem dos componentes do pipeline. Outros requisitos necessários para a construção de pipelines de dados são: tolerância a falhas, gestão de recursos, escalabilidade e capacidade de manutenção.
As soluções para workflow de ML em projetos reais também incluem funcionalidades como: importar/exportar modelos, cross-validation para escolher os parâmetros e agregação de dados de múltiplas fontes. Essas soluções provém utilidades de dados como: extração, seleção e estatística de features. Esses frameworks suportam persistência do pipeline, para salvar e carregar modelos de ML e pipelines para uso futuro.
O conceito de workflows de ML e a composição de operadores de dataflow estão se tornando populares em diversas áreas. Frameworks de processamento de Big Data como scikit-learn e GraphLab usam o conceito de pipeline incorporado no sistema.
Um processo típico da cadeia de valor de dados (data value chain) inclui os seguintes passos:
- Descoberta
- Ingestão
- Processamento
- Persistência
- Integração
- Análise
- Exposição
Um pipeline de dados de ML segue uma abordagem semelhante. A Tabela 1 mostra os diferentes passos envolvidos num processo de pipeline de ML.
Passo # |
Nome |
Descrição |
ML1 |
Data Ingestion (Ingestão dos dados) |
Carregar dados de diferentes fontes. |
ML2
|
Data Cleaning (Limpeza dos dados) |
Os dados são pré-processados para se tornarem aptos para análises de dados de machine learning. |
ML3 |
Feature Extraction (Extração dos features) |
Também conhecido como Feature Engineering, esse passo refere-se a extração de features do dataset. |
ML4 |
Model Training (Treinamento do modelo) |
O modelo de machine learning é treinado utilizando datasets de treino. |
ML5 |
Model Validation (Validação do modelo) |
O modelo de machine learning é avaliado com base em diferentes parâmetros de predição, pela sua eficácia. Nesse passo também é feito o tuning do modelo. Esse passo serve para escolher o melhor modelo. |
ML6 |
Model Testing (Teste do modelo) |
Nesse passo o modelo é testado antes de ser implantado. |
ML7 |
Model deployment (Implantação do modelo) |
O passo final é fazer a implantação do modelo para ser executado em um ambiente de produção. |
Tabela 1. Passos do processo de pipeline para machine learning.
Esses passos são ilustrados na Figura 1.
Figura 1. Diagrama do processo do pipeline de dados de ML.
Vamos olhar para cada um desses passos mais detalhadamente.
Ingestão dos dados: os dados coletados para um pipeline de ML típico podem vir de múltiplas fontes, e podem variar entre algumas centenas de gigabytes a terabytes. Além disso, uma das características de aplicações de Big Data é a ingestão de dados em diferentes formatos.
Limpeza dos dados: a limpeza dos dados é o primeiro e mais crítico passo no pipeline de análise de dados em geral. Também conhecido pelos termos em inglês data cleansing, data scrubbing ou data wrangling, é empregado para estruturar e facilitar o processamento dos dados para a análise preditiva. Dependendo da qualidade dos dados recebidos no sistema, de 60% a 70% do tempo total é consumido na limpeza dos dados, para transformar os dados em um formato adequado para a aplicação de modelos de machine learning.
Os dados podem ter muitos problemas de qualidade, como dados faltantes, elementos com valores incorretos ou irrelevantes. A limpeza dos dados utiliza várias estratégias incluindo transformações customizadas, nos quais as ações de limpeza de dados são executadas com transformadores personalizados incluídos no pipeline.
Dados esparsos ou de granularidade grossa constituem um desafio na área de análise de dados. Vários problemas extrínsecos ao pipeline ocorrem devido a esse tipo de dados, que devem ser tratados com técnicas de limpeza para garantir a qualidade antes de alimentar o pipeline com esses dados.
A limpeza de dados é geralmente um processo iterativo, uma vez que entendemos melhor o problema nas sucessivas tentativas e atualizações iterativas de tratamento. Ferramentas para limpeza de dados como Trifacta, OpenRefine or ActiveClean são empregadas para esse propósito.
Extração dos Features: no passo de extração de features (também chamada de Feature Engineering), features (atributos) específicos são extraídos dos dados crus usando técnicas como Feature Hashing (Hashing Term Frequency) e Word2Vec. Os resultados dessa etapa são geralmente combinados usando um componente de montagem, e são passadas para o próximo passo no processo.
Treinamento do modelo: o treinamento do modelo envolve o uso de um algoritmo e dados de treino para que o modelo possa aprender a partir deles. O algoritmo de aprendizagem encontra padrões no conjunto de treino e gera um modelo como saída.
Validação do modelo: esse passo envolve avaliar e realizar o tuning do modelo de ML para medir a eficiência da sua predição. Para classificação binária, pode-se empregar como métrica de avaliação a área embaixo da curva ROC (Receiver Operating Characteristic). A curva ROC ilustra o desempenho de um sistema de classificador binário. Ela é criada a partir da plotagem da proporção entre os casos verdadeiros positivos (TPR) contra os falso negativos (FPR), com várias configurações de limiares.
Seleção do modelo: a seleção do modelo utiliza dados para a escolha de parâmetros para os Transformers e Estimators. Esse é um passo crítico no pipeline de ML. Classes como ParamGridBuilder
e CrossValidator
proveem APIs para selecionar o modelo de ML.
Implantação do modelo: uma vez que o modelo correto foi escolhido, podemos implantá-lo e começar a alimentá-lo com novos dados e receber os resultados da análise preditiva. Podemos também implantar modelos de machine learning como web services.
Spark ML
A API de ML foi introduzida na versão 1.2 do framework Apache Spark. É uma API para desenvolvedores criarem e executarem workflows complexos de ML. O objetivo da API é permitir aos usuários montarem e configurarem pipelines de ML distribuídos, de maneira rápida e fácil, com padronizações para diferentes conceitos de machine learning. A API está disponível no pacote org.apache.spark.ml
A biblioteca Spark ML também auxilia combinando múltiplos algoritmos de ML em um único pipeline.
A API de machine learning está dividida em dois pacotes: spark.mllib
e spark.ml
. O pacote spark.mllib
contém a API original construída usando RDDs. Por outro lado, o pacote spark.ml
provê uma API de mais alto nível construída usando DataFrames para a criação de pipelines de ML.
O Spark ML é uma biblioteca importante para Big Data analytics no ecossistema Apache Spark, conforme mostrado na Figura 2.
Figura 2. Ecossistema Spark com Spark ML.
Componentes do pipeline de machine learning
O pipeline de dados de ML possui vários componentes para realizar análise de dados. Os componentes chaves de um pipeline de dados são listados a seguir:
- Datasets
- Pipelines
- Estágios de Pipeline (transformers e estimators)
- Evaluators
- Parâmetros (e
ParamMaps
)
Vamos olhar brevemente onde cada um desses componentes se encaixam no processo geral.
Datasets: o DataFrame é utilizado para representar os datasets no pipeline de ML. Ele permite armazenamento de dados estruturados em colunas nomeadas. As colunas podem ser usadas para armazenar texto, vetores de features, labels e predições.
Pipelines: os workflows de ML são modelados como Pipelines, que consistem em uma sequência de estágios. Cada estágio transforma os dados de entrada para produzir a saída para os estágios seguintes. Um Pipeline encadeiam múltiplos Transformers e Estimators para especificar um workflow de ML.
Estágios do pipeline: definimos dois tipos de estágios: Transformers e Estimators.
Transformer: um algoritmo que pode transformar um DataFrame em outro DataFrame (por exemplo: o modelo de ML é um transformer que converte um DF com features em um DF com predições).
Um transformador converte um DataFrame em outro DataFrame com uma ou mais features adicionadas a ele. Por exemplo, no pacote Spark ML, o OneHotEncoder transforma uma coluna com um índice de label em uma coluna de features vetorizadas. Cada Transformer tem um método transform()
, que é chamado para converter um DataFrame em outro.
Estimator: o estimator é um algoritmo de ML que aprende com os dados fornecidos. A entrada de um estimator é um DataFrame e a saída é um Transformer. Usamos o estimador para treinar o modelo, que produz um Transformer. Por exemplo, um LogisticRegression
produz um LogisticRegressionModel
. Outro exemplo é o K-Means como estimator que aceita um DataFrame de treino e produz um K-Means model que é um transformer.
Parâmetro: os componentes de ML usam uma API em comum para especificar parâmetros. Por exemplo, o número máximo de iterações que o modelo deve usar.
Os componentes do pipeline de dados para o caso de uso de classificação de texto é mostrado na Figura 3.
Figura 3. Pipelines de dados usando Spark ML.
Casos de uso
Um dos casos de uso para pipelines de ML é a categorização de texto. Esse caso de uso tipicamente inclui os seguintes passos:
- limpar dados textuais;
- transformar os dados em vetores de features;
- treinar o modelo de classificação.
Na categorização ou classificação de texto, etapas de processamento de dados como extração de n-gramas e TF-IDF para medir a importância das features, são usados antes do treinamento do classificador (como SVM).
Outro caso de uso de pipeline de ML é a classificação de imagens, conforme descrito neste artigo.
Há vários outros casos de uso de ML que incluem detecção de fraudes (usando um modelo de classificação, que é um tipo de aprendizado supervisionado) e segmentação de usuários (modelo de clustering, que é um tipo de aprendizado não supervisionado).
TF-IDF
Frequência do termo - Inverso da frequência do documento (Term Frequency - Inverse Document Frequency, TF-IDF), é uma medida estatística para avaliar o quão importante uma palavra é para um documento de um dado corpus. É um algoritmo de recuperação de informação, usado para rankear a importância de uma palavra em uma coleção de documentos.
TF: Se uma palavra aparece frequentemente em um documento, então ela é importante. O TF é calculado como:
TF = (# de vezes que a palavra X aparece em um documento) / (# total de palavras no documento)
IDF: Mas se uma palavra aparece em muitos documentos (por exemplo, "a", "o", "de"), ela não é significativa, o que diminui seu score. Esse é o inverso da frequência do documento.
Aplicação de exemplo
Vamos olhar uma aplicação de exemplo para compreender como o pacote Spark ML pode ser utilizado em um sistema de processamento de Big Data. Desenvolveremos uma aplicação de classificação de documentos, que identifica spam nos conteúdos dos datasets fornecidos para a aplicação. Os datasets incluem documentos, mensagens de email ou outros tipos de conteúdo recebido por sistemas externos, que podem conter spam.
Usaremos o exemplo Spam Detection apresentado no workshop "Building machine-learning apps with Spark" do Strata Hadoop World Conference.
Caso de uso
Esse caso de uso inclui analisar diferentes mensagens enviadas ao sistema. Algumas dessas mensagens contêm spam, ao passo que as mensagens obtidas sem nenhum spam são chamadas de dados ham. O objetivo é encontrar as mensagens que contêm spam usando a API Spark ML.
Algoritmo
Usaremos o algoritmo de Regressão Logística (RL) no programa de machine learning. Logistic Regression é um modelo de análise de regressão, e é utilizado para predizer a probabilidade de uma resposta binária (sim ou não) baseado em uma ou mais variáveis independentes.
Detalhes da solução
Vamos observar os detalhes da aplicação de exemplo e os passos que seguiremos como parte da execução do programa em Spark ML.
Ingestão dos dados: os datasets (arquivos de texto) são carregados com dados que contêm spam, bem como dados que não contêm spam (chamados de dados ham).
Limpeza dos dados: na aplicação de exemplo, não fazemos nenhuma limpeza específica dos dados. Apenas agregamos os dados em um único objeto DataFrame.
Criamos um objeto array selecionando aleatoriamente dados de ambos datasets de treino e teste. No exemplo, os dados estão divididos em 70% para treino e 30% para teste.
Usaremos esses dois objetos de dados mais tarde no pipeline, para treinar o modelo e fazer predições, respectivamente.
O pipeline de dados de ML inclui quatro passos:
- Tokenizer (Tokenizador)
- HashingTF
- IDF
- LR
Crie um pipeline e configure os passos mencionados anteriormente. Então, crie um modelo de LR baseado dos dados de treino do exemplo.
Agora, podemos fazer predições do modelo usando dos dados de teste (novos datasets).
A Figura 4 mostra o diagrama da arquitetura da aplicação de exemplo.
Figura 4. Diagrama de arquitetura da aplicação de classificação de dados.
Tecnologias
Usaremos as seguintes tecnologias na implementação da solução do pipeline de ML.
Tecnologia |
Versão |
Apache Spark |
2.0.0 |
JDK |
1.8 |
Maven |
3.3 |
Tabela 2. Tecnologias e ferramentas usadas na aplicação de exemplo de machine learning.
Programa com Spark ML
O trecho de código a seguir, extraído do exemplo do workshop, foi escrito em linguagem Scala e pode ser executado utilizando o console do Spark Shell.
Trechos do código em Scala para detecção de Spam:
Passo 1: Crie uma custom class para armazenar os detalhes do conteúdo de spam.
case class SpamDocument(file: String, text: String, label: Double)
Passo 2: Inicialize o SQLContext e importe os métodos implícitos para converter os objetos Scala em DataFrames. Então, carregue os datasets do diretório especificado, onde os arquivos estão localizados, que retorna os objetos RDD. Crie objetos DataFrame a partir dos RDD's para ambos datasets.
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
//
// Carregar os arquivos de dados com spam.
//
val rddSData = sc.wholeTextFiles("SPAM_DATA_FILE_DIR", 1)
val dfSData = rddSData.map(d => SpamDocument(d._1, d._2,
1)).toDF()
dfSData.show()
//
// Carregar os arquivos de dados sem spam.
//
val rddNSData = sc.wholeTextFiles("NO_SPAM_DATA_FILE_DIR",
1)
val dfNSData = rddNSData.map(d => SpamDocument(d._1,
d._2, 0)).toDF()
dfNSData.show()
Passo 3: Agora, agregue os datasets, e divida todos os dados em datasets de treino e teste (com a proporção de 70% e 30%):
//
// Agregar ambos data frames.
//
val dfAllData = dfSData.unionAll(dfNSData)
dfAllData.show()
//
// Dividir os dados em 70% para treino e 30% para teste.
//
val Array(trainingData, testData) =
dfAllData.randomSplit(Array(0.7, 0.3))
Passo 4: Podemos configurar o pipeline de dados de machine learning agora, que inclui criar os componentes discutidos anteriormente, Tokenizer
, HashingTF
e IDF
. Então, criaremos o modelo de regressão, nesse caso, o LogisticRegression
, usando os dados de treino.
//
// Configurar o pipeline de dados de ML.
//
//
// Criar o passo do tokenizador.
//
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol("words")
//
// Criar os passos de TF e IDF.
//
val hashingTF = new HashingTF()
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("rawFeatures")
val idf = new
IDF().setInputCol("rawFeatures").setOutputCol("features")
//
// Criar o passo de Regressão Logística.
//
val lr = new LogisticRegression()
.setMaxIter(5)
lr.setLabelCol("label")
lr.setFeaturesCol("features")
//
// Criar o pipeline.
//
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, idf, lr))
val lrModel = pipeline.fit(trainingData)
println(lrModel.toString())
Passo 5: Finalmente, podemos chamar o método de transformação no modelo de regressão logística para fazer predições nos dados de teste.
//
// Fazer as predições.
//
val predictions = lrModel.transform(testData)
//
// Mostrar o resultado das predições.
//
predictions.select("file", "text", "label", "features",
"prediction").show(300)
Conclusão
A biblioteca de Machine Learning do Spark é uma das bibliotecas críticas no framework do Apache Spark. É utilizada para implementar pipelines de dados. Nessa seção, aprendemos como empregar o pacote da API spark.ml em um caso de uso de classificação de texto.
O que vem a seguir
Modelos de dados de grafos referem-se a dados conectados e as relações entre diferentes entidades do modelo de dados. Técnicas de processamento de grafos estão recebendo muita atenção ultimamente pois elas podem solucionar problemas como detecção de fraude e desenvolver engines de recomendação.
O framework Spark provê uma biblioteca especializada para análise de dados em grafos. Aprenderemos sobre essa biblioteca chamada Spark GraphX, no próximo artigo dessa série. Desenvolveremos uma pequena aplicação para realizar processamento de dados em grafos e análise usando a Spark GraphX.
References
- Apache Spark Main Website
- Spark Machine Learning Website
- Spark Machine Learning Programming Guide
- Spark Workshop Exercise em Spam Detection
Sobre o autor
Srini Penchikala atualmente trabalha como Arquiteto de Software em uma organização de serviços financeiros em Austin, Texas. Ele tem mais de 20 anos de experiência em arquitetura, design e desenvolvimento. Srini está atualmente escrevendo um livro sobre Apache Spark. Ele também é co-autor do livro "Spring Roo in Action" da Manning Publications. Ele palestrou em diversas conferências como: JavaOne, SEI Architecture Technology Conference (SATURN), IT Architect Conference (ITARC), No Fluff Just Stuff, NoSQL Now e Project World Conference. Srini também publicou diversos artigos sobre arquitetura de software, segurança e gerenciamento de risco, e sobre banco de dados NoSQL em sites como o InfoQ, The ServerSide, OReilly Network (ONJava), DevX Java, java.net e JavaWorld. Ele é o Editor Líder de Data Science na comunidade do InfoQ.
Este é o quinto artigo da série "Processamento de Big Data com Apache Spark". Também disponíveis: Parte 1: Introdução, Parte 2: Spark SQL, Parte 3: Spark Streaming e Parte 4: Spark Machine Learning.