Ciência dos Dados com Weka: Domine 7 Técnicas Essênciais sem Escrever uma Linha de Código

O Weka é sem dúvidas uma das melhores ferramentas para se trabalhar com Data Science.

Não é atoa que abordamos sua instalação aqui. 🙂

O cientista de dados precisa ser produtivo devido a diversas tarefas que lhe são atribuídas.

Mas como ser produtivo com diversas bases para analisar, processar, e testar soluções?

Por exemplo…

Você precisa testar diferentes algoritmos de machine learning para saber qual funcionará melhor para o seu sistema?

Ou ainda, você quer testar algumas técnicas de pré-processamento de dados e ver como seus modelos irão se comportar?

Você tem um banco de dados relacional na sua empresa com informações valiosas mas não sabe como pode trabalhar com esses dados?

Com o Weka é possível fazer todas essas tarefas com poucos cliques!

O Weka simplifica muito o trabalho por ser uma ferramenta simples e intuitiva.

Você precisa aprender a usar essa ferramenta, continue lendo para descobrir:

Se você já gostou do assunto desse artigo, não deixe de compartilhar com seus amigos para que cada vez mais pessoas aprendam a dominar as técnicas essênciais para fazer ciência dos dados com Weka. Aproveite assine nossa lista para ficar sempre atualizado com novas postagens.

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!


Instalação do Weka

A instalação do Weka é muito simples e rápida. Nesse artigo abordamos o processo.

Aplicações do Disponíveis

Ao executar a ferramenta, tela que se abre é essa abaixo. Perceba que contém várias aplicações (Explorer, Experimenter, KnowledgeFlow, Workbench e Simple CLI)

  • Explorer  Esta aplicação é a mais usada, com esta é possível trabalhar de forma interativa. È onde iremos explorar as funções da ferramenta. Vamos focar nessa ferramenta, pois, nas outras podemos fazer muitas funções que contém nessa, mas de forma automatizada.
  • Experimenter: Esta aplicação é usada para automatização de processos, é usada por exemplo, para rodar vários algoritmos de aprendizado de máquina de forma automática e visualizar todos os resultados de uma só vez.
  • KnowledgeFlow: Esta aplicação permite o usuário criar fluxos de processos através de uma interface baseada em fluxo de dados. È possível arrastar componentes como filtros ou classificadores e conecta-los, criando assim um fluxo de processamento.
  • Workbench: Esta aplicação combina todas as outras aplicações mostradas em uma unica interface. Essa pode ser interessante caso você tem que alternar entre a aplicação Explorer e Experimenter por muitas vezes.
  • Simple CLI: Essa é uma interface de linha de comando que permite criar scripts shell para usar a API do Weka. Com esta API é possível rodar experimentos, algoritmos de machine learning e diversas outras tarefas. A vantagem é que você pode automatizar tarefas e integrar na sua aplicação.

Weka Explorer

Clicando na aplicação Explorer é exibida tela inicial com a aba Preprocess marcada.

È nessa tela que iremos trabalhar com o pré-processamento da nossa base.

Na fase de pré-processamento envolve trabalhar no dado antes de realizar algum experimento.

Por exemplo, nessa tela é possível remover algum atributo da base de dados, aplicar um filtro de normalização ou discretiza algum atributo.

Essa tela exibe estatísticas importantes sobre a base de dados, informações como quantidade instâncias por classe, o tipo de um atributo, a quantidade de atributos faltantes, etc.

Veremos algumas tarefas de pré-processamento nas seções seguintes.

Clique em Open File e carregue uma base de dados de exemplo para visualizar as informações.

Dica: O Weka contém várias bases de dados de exemplos, basta navegar até o diretório de instalação e acessar a pasta data. Veja:

weka-datasets

Base de dados

O Weka nos permite trabalhar com diferentes fontes de dados.

Podemos importar dados a partir de uma consulta a um banco de dados relacional, a partir de uma URL ou através de arquivo de texto no formato arff.

O formato ARFF significa Attribute-Relation File Format ou Arquivo no Formato Atributo Relação.

Este formato de arquivo é especificado pelo Weka em um padrão muito simples divido basicamente em duas sessões Header (Cabeçalho) e Data (Dado).

Na sessão Header temos a especificação dos atributos de nossa base de dados e seus tipos de dados incluindo a classe.

Na sessão Data é onde informamos ao Weka os dados que constituem nossa base de dados.

Veja no exemplo abaixo o dataset iris no formato arff.

iris-arff

Observe que o nosso arquivo se inicia com a tag @RELATION que indica qual o nome de nossa base de dados.

O próximo passo é definir os atributos e seus tipos de dados utilizando a tag @ATTRIBUTE e por fim marcamos com a tag @DATA onde inicia os dados no arquivo.

Na definição dos atributos podemos especificar diferentes tipos de dados como numeric nominal, string e date. Como é o exemplo do atributo class que é do tipo nominal e possui os três valores únicos (Iris-setosa, Iris-versicolor, Iris-virginica).

Para mais detalhes do formato ARFF clique aqui.

Importando dados CSV

O Weka nos permite importar dados a partir de outros formatos além do formato padrão ARFF.

Neste caso o Weka se encarrega de carregar os dados com as devidas informações de atributos.

Veja na imagem abaixo a base de dados iris no formato csv.

dataset-iris-csv

Para importar dados csv no Weka simplesmente informamos o formato na tela para abrir o arquivo de dados conforme animação abaixo.

weka-importacao-csv

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!

Consultando dados em um banco de dados MySQL

conectando-weka-com-mysql

Imagine aqueles dados do sistema de RH em suas mãos? Tabelas de salários, hora extra, etc.

Ou ainda, aqueles dados de vendas do ERP da empresa, daria para fazer um trabalho legal de ciência dos dados né ?

(É claro que o objetivo aqui seria vender isso para seu chefe depois) 🙂

Pois é…

O Weka nos permite consultar dados diretamente em diversos SGBD’s através de um driver JDBC.

Dessa forma facilita muito o acesso e manipulação dos dados que estão armazenados em um banco de dados relacional como o MySQL, Oracle, PostgreSQL etc.

Através de uma query(consulta) podemos importar os dados retornados para o Weka e trabalhar normalmente com todos os filtros, métodos e classificadores sem a necessidade de gerar um arquivo de dados nos formatos acima.

Você vai ver que é bem simples o processo.

Como neste exemplo iremos utilizar o MySQL, faça o download do driver JDBC aqui.

Após fazer o download do arquivo de driver coloque o arquivo .jar no mesmo diretório de instalação do Weka.

Observe na imagem abaixo que o arquivo de driver de conexão mysql-connector-java-5.1.30-bin.jar está na mesmo diretório do arquivo weka.jar

weka-mysql-connector

Depois de baixado o arquivo de driver o próximo passo é editar o script RunWeka.ini e incluir o nome do arquivo de driver ao classpath para a inicialização do Weka conforme imagem abaixo.

Observe que a inclusão do nome do arquivo vem precedida de um ; (ponto e virgula).

Uma vez incluído o nome do arquivo de driver. Antes de inicializar o Weka precisamos configurar o arquivo DatabaseUtils.prop.

Apontando o driver do SGBD

Este arquivo define diversas configurações específicas sobre o SGBD que iremos nos conectar.

O Weka nos disponibiliza o arquivo DatabaseUtils.prop para vários SGBD´s e para acessar extraia o arquivo weka.jar e navegue até o diretório weka\experiment conforme imagem abaixo.

weka-database-props

Escolha o arquivo conforme o sistema de gerenciamento de banco de dados desejado, reoneie para DatabaseUtils.props e salve no mesmo diretório do arquivo weka.jar.

Uma vez o arquivo foi incluido no diretório do Weka edite e configure as variáveis  JDBC Driver e database URL conforme imagem abaixo.

Query no Weka

Conforme citado anteriormente cada SGBD permite o acesso aos bancos de dados através de um driver e para informações sobre cada sistema clique aqui.

Como estamos utilizando o MySQL em nosso teste especifique o driver jdbc conforme a imagem e a informação de URL seguindo o padrão acima.

Lembre-se de alterar os dados do seu servidor como nome do servidor, porta e banco de dados.

No exemplo estou conectando ao meu servidor local com localhost, utilizando a porta 3306 e o banco de dados employees.

Com os arquivos perfeitamente configurados é hora de inicializar o Weka.

Execute o script RunWeka.bat para inicializar o Weka em Windows ou caso você esteja no ambiente Linux ou sua instalação do Weka não possui os arquivos RunWeka.ini e RunWeka.bat execute o Weka através da linha de comando incluindo o arquivo de driver ao classpath com o parâmetro -cp conforme o comando abaixo.

O comando acima inicializa o Weka passando para o seu classpath o arquivo de driver de conexão com o MySQL.

Esta opção é equivalente aos passos descritos acima para especificar o arquivo de driver no arquivo RunWeka.ini.

Com o Weka inicializado o próximo passo é configurar nossa conexão com o usuário e senha, e por fim a consulta para selecionar os dados. Veja na animação abaixo.

weka-conexao-mysql

Na animação acima mostra passo a passo como estabelecemos a conexão utilizando o usuário e senha para a conexão com o MySQL, a execução da query e a importação dos resultados no Weka.

O processo de utilização do Weka para consulta em sistemas de gerenciamento de banco de dados é extremamente simples e muito poderoso economizando muito tempo de coleta e transformação de dados.

Pre-processamento de Dados

weka-preprocessamento-de-dados

Discretização

Discretização de dados é um técnica que consiste em transformar valores numéricos em valores nominais ou discretos que possam representar melhor os dados em determinados conjuntos.

Através da Discretização é possível utilizar algoritmos que não trabalham com valores numéricos já que os dados são transformados em valores discretos.

No exemplo abaixo estamos discretizando os dados do atributo Altura em três grupos ou ‘bins’ .

discretizacao-atributo-altura

No exemplo da imagem acima discretizamos os dados do atributo Altura em três bins, ou seja, três grupos de dados chamados de Baixa, Média e Alta.

Basicamente o que fizemos foi transformar os valores de uma determinada faixa de valores e agrupá-los conforme seus valores ordenados.

Observe que os dados de altura com a faixa de valores até 1.55 foram adicionados ao bin chamado de Baixa, acima desse valor até o valor 1.69 foi incluído no bin chamado de Média e acima desse valor foi inserido ao bin chamado Alta.

Fantátisco né? 🙂

Existem diversas formas de discretização de dados e neste exemplo usamos para título de demonstração a ordenação dos dados e agrupamento em três simples bins, ou grupos.

Podemos levar em consideração a classe em uma discretização do tipo supervisionada, podemos usar métodos estatísticos e vários outros métodos que podemos explorar cada um destes em outro artigo.

Aplicando no Weka

Para demonstração usaremos a base de dados iris.arff. Essa base está disponível no diretório onde foi instalado o Weka dentro da pasta data.

Para fazer a discretização utilizando o Weka siga os passos:

No menu Weka Explorer clique no botão Choose na sessão Filter e selecione filters > unsupervised > attribute > Discretize

Após selecionar o filtro o menu filter mostrará o nome do filtro selecionado e os seus parâmetros, clique no filtro para abrir a janela para a configuração.

Especifique o número de bins que deseja agrupar os dados, por padrão o Weka gera 10 bins.

Deixe esse valor conforme o padrão.

Especifique o atributo de índice 2 no  parâmetro atributeIndices que corresponde ao nosso atributo temperature e  selecione True na opção useEqualFrequency para o Weka tentar colocar a mesma quantidade de instâncias em cada bin e por fim clique em OK.

Após configurar os parâmetros do filtro o último passo é clicar em Apply para aplicá-lo a base de dados. Veja na animação abaixo a execução dos passos descritos acima.

Observe que os dados foram alterados a partir de seus valores numéricos para valores nominais no formato ‘(-inf-64.5]’ que significa um intervalo definido pelo Weka que neste caso é de menos infinito até o valor 64.5.  Este intervalo significa que os dados até o valor 64.5 foram inseridos no primeiro bin, os valores entre 64.5 até 66.5 foram incluídos no segundo bin e assim por diante.

Conforme dito acima, fizemos uma discretização do tipo não supervisionada, ou seja, não levamos em consideração as classes das instâncias para o agrupamento em cada bin.

Normalização

normalizacao-weka

Trabalhar com dados em diferentes escalas pode ser um problema que pode inferir sobre os resultados dos algoritmos de Machine Learning.

Supondo que podemos ter um atributo que seja uma contagem de valores enquanto outro pode ser um valor em medidas de peso.

Nessas situações pode ser interessante normalizar os valores em uma única faixa, ou seja, transformamos os valores do atributo em intervalos determinados.

Digamos que iremos normalizar os dados entre a faixa de valores 0 e 1, dessa forma, o maior valor será o número 1 e o menor 0.

O processo é simples mas pode trazer inúmeros benefícios para sua análise de dados.

Veja na animação abaixo como realizar a normalização usando o filtro Normalize do Weka.

Conforme exemplo acima utilizamos o filtro Normalize do Weka para fazer a normalização dos atributos numéricos em nosso dataset.

Observe que diferente do filtro Discretize mostrado anteriormente, este não nos permite selecionar o atributo para a transformação.

Neste caso o filtro é executado em todos os atributos numéricos da base de dados

Valores faltantes – Missing Values

weka-valores-faltantes

Base de Dados com valores faltantes é uma realidade no dia a dia do Cientista de Dados.

Saber trabalhar para resolver esses problemas é fundamental para a análise de dados.

O Weka nos permite manipular valores faltantes em nossa base de dados de forma muito simples e intuitiva através dos filtros ReplaceMissingValues e ReplaceMissingWithUserContent.

O filtro ReplaceMissingValues faz a substituição de todos os valores faltantes em nossa base de dados com os valores da média para os atributos numéricos e valores da moda para os atributos do tipo nominal.

Já o filtro ReplaceMissingWithUserContent como o nome já diz, permite especificar um valor para a substituição dos dados para cada tipo de atributo.

Veja na animação abaixo como utilizar o filtro ReplaceMissingValues no Weka.

weka-valores-faltantes

Para este exemplo utilizarei a base de dados chamada labor.arff disponível como um dataset de teste do Weka no diretório data.

Esta base de dados contém muitos valores faltantes e como mostro no exemplo acima após aplicar o filtro ReplaceMissingValues os valores faltantes foram zerados, ou seja, para os atributos numéricos o Weka atribuiu o valor da média dos valores para os valores faltantes e para os atributos do tipo nominal o Weka atribuiu o valor da moda do atributo para os valores faltantes.

Interessante né?

Vetorização de palavras

weka-vetorizacao-palavras

Outro método de pré-processamento extremamente poderoso do Weka é a Vetorização de palavras.

Este método consiste em transformar uma base de dados em texto em uma matriz onde as colunas são as palavras únicas da base de dados e cada instância consiste de um vetor binário indicando a ocorrência da palavra ou não.

Para aprender mais sobre essa modelagem leia o artigo que falamos mais dessa técnica aqui.

Para fazer a vetorização de palavras no Weka vamos aplicar o filtro StringToWordVector na base de dados de teste ReutersCorn-train.arff do Weka disponível no diretório data.

Veja a aplicação do filtro na animação abaixo.

 weka-vetorizacao-palavras

Observe que a base de dados consiste de duas colunas uma com dados em texto e outra com a classe para cada instância.

Perceba que após aplicar o filtro são geradas centenas de colunas..

Isso aconteceu, pois, agora cada palavra na base de dados corresponde a uma coluna e seu valor pode ser 0 ou 1 dependendo da ocorrência daquela palavra na instância.

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!


Aplicando algoritmos de Machine Learning

weka-algoritmos-machine-learning

Árvores de Decisão

As árvores de decisão são algoritmos clássicos e de fácil compreensão.

Árvores de decisão são similares a regras Se e Então, pois, fazem testes em seus atributos para se tomar uma decisão de qual atributo representa melhor o dado.

A árvore de decisão são construídas a partir de uma seqüência de testes nos seus dados de treino.

Cada nó interno da árvore corresponde a um teste do valor de uma das propriedades, e os ramos deste nó são identificados com os possíveis valores do teste.

Veja um exemplo, onde queremos predizer se uma pessoa vai sair de sua casa para jogar tênis ou não, baseado no clima do dia.

Para classificar se vale a pena sair para para jogar, temos que considerar algumas variáveis, como: O aspecto do céu, a temperatura do dia, a humidade e a força do vento.

Por exemplo, o aspecto do céu está como ‘Chuvoso’, mas a temperatura está ‘Quente’ o que inviabilizaria a saída de casa, pois, tem muita chance de começar a chover no meio do jogo.

Por outro lado, o aspecto do céu pode está como Chuvoso, mas a temperatura está ‘Ameno’, resultando em Sim para ir jogar tênis, pois, o clima está agradável.

A Árvore de decisão leva em consideração os valores dos atributos, baseado nos dados disponíveis para treino.

Algoritmos de árvore de decisão são inteligentes, pois, usam técnicas capazes de distinguir os atributos que melhor representam os dados na hora da construção da árvore.

Árvore de decisão no WEKA

Abra o Weka e clique em Explorer

Vamos carregar a base de dados weather.nominal.arff . Essa base vem junto com o Weka, para testes.

Essa base contém os atributos temperatura, vento,umidade e aspecto.

A classe se vai ter jogo ou não (sim ou não) como demos o exemplo acima, porém, os dados aqui estão em inglês 🙂

Para abrir clique em Open file… navegue até a pasta de instalação do weka, em seguida abra a pasta data, clique no arquivo informado acima. Como no gif abaixo:

weka-carrega-dataset

Após carregar o dataset, é possível ver informações da base. Podemos ver que esta contém 4 atributos (outlook, temperature,humidy,windy) e por fim a coluna ‘Play’ que pode ser da classe Yes ou No.

Para rodar o algoritmo clique na aba Classify, em seguida clique em Choose para escolher o algoritmo.

Será exibida diversas categorias, clique em trees e escolha o algoritmo J48, como no gif abaixo:

weka-classificacao-tela

Ok, com o algoritmo selecionado podemos iniciar a classificação clicando em Start.

Mas antes disso, vamos entender melhor essa tela.

Cada algoritmo contém parâmetros que o usuário pode definir antes da execução do mesmo.

Clique em cima do algoritmo para visualizar as opções de parâmetros disponíveis neste.

Perceba que para esse algoritmo existem diversos parâmetros, veja:

weka-tela-parametros-algoritmo-j48-classificacao

Por enquanto mantenha os valores default.

Na aba test options, temos as formas de teste e validação que iremos aplicar.

Por padrão o Weka, sugere aplicar o validação usando a técnica de Cross-Validation com 10 folds.

Para entender melhor como essa técnica funciona, leia esse artigo que fizemos onde falamos mais dessa técnica

Clique em Start para executar o algoritmo.

weka-algoritmo-classificacao-j48

Ao clicar em Start o algoritmo é executado e validado usando a opção de teste definida.

È exibido os resultados do processo de classificação.

Nesse caso 50% das instâncias foram calculadas corretamente.

Podando a Àrvore

Podemos realizar diversos testes e o Weka irá salvar os resultados na lista de resultados na parte inferior a esquerda.

Vamos executar o algoritmo novamente

Porém, agora iremos alterar o valor do parâmetro confidence factor  para 1 e ver o que acontece.

weka-parametroC-algoritmo-j48

O Weka manteve o último resultado em buffer e criou uma nova tela de resultados, quanto clicamos em Start.

Podemos ver que o percentual de instâncias classificadas corretamente aumentou( 57% ), após a alteração do parâmetro confidence factor.

Isso aconteceu porque esse parâmetro, é usado para fazer uma poda na árvore de decisão.

Essa poda significa diminuir o tamanho da árvore usando atributos que não são tão importantes para árvore

Dessa forma a árvore fica menor e mais genérica , ou seja, ela não está tão idêntica aos dados de treino.

O que pode ser bom para classificação de instâncias que esta nunca viu.

No nosso caso, melhorou a classificação após aumentar o parâmetro confidence factor para 1

Com essa alteração estamos dizendo para o modelo que queremos uma árvore mais genérica.

Nessa tela é interessante também visualizar a árvore que o modelo gerou,

Para isso, clique com o botão direito do mouse em um resultado na lista e em seguida clique em Visualize tree

weka-visualizacao-arvore-decisao-j48

SVM – Suporte Vector Machines

O Svm é um algoritmo muito famoso e bastante usado.

Este algoritmo através dos dados de treino, cria uma “linha” que divide as classes conforme características encontradas nos dados.

Essa linha normalmente é chamda de “Hyperplano”

svm

Imagine uma base que contém 2 classes a serem classificadas.

Após conseguir dividir os dados (classe A de um lado e classe B de outro lado)

É criada uma margem que é a distância entre essas duas classes.

O SVM possui um parâmetro C que basicamente dita como será construída essa margem que separa as classes.

Valores pequenos no parâmetro C diz para o SVM que o modelo deve ser menos tolerante a erros

Por consequência, o modelo irá tentar separar melhor os dados de treino.

Um valor maior do parâmetro C diz para o SVM que o modelo pode ser mais tolerante a erros

Isso significa que o modelo permitirá mais erros, e a margem será menor entre as classes.

Para rodar o SVM usando Weka, clique no botão Choose e escolha o classificador chamado SMO que fica na categoria functions, veja:

weka-classificacao-algoritmo-svm

Após escolher o classificador vamos manter as configurações padrão e rodar o algoritmo

weka-classificacao-algoritmo-svm2

Após execução a tela de resultados exibe as métricas.

Esse se saiu melhor perante a árvore de decisão, 64% de instâncias corretas.

O valor atual do parâmetro C é 1.0,

Tuning do SVM

Vamos alterar o parâmetro C do SVM para 1.5 e ver como este se comporta.

Isso é bem fácil de fazer usando o Weka, veja:

weka-classificacao-algoritmo-svm-parametroC

Como podemos perceber, ao aumentar o valor do parâmetro C o modelo piorou, o número de classificações corretas diminuiu (57%)

Isso aconteceu, pois, aumentamos a margem, assim o modelo permitiu mais erros nos dados de treino.

Por consequência, nosso modelo ficou menos complexo e na hora do teste, este se saiu pior.

O Weka permite fazer diversos ajustes nos algoritmos, e melhor, é possível testar de forma rápida e intuitiva. Faça mais testes 😉

Conclusão

Nesse artigo vimos o poder do Weka.

Com o Weka podemos fazer inúmeras tarefas de forma rápida, o que aumenta a nossa produtividade como cientista de dados.

Principalmente quando queremos experimentar, essa ferramenta é perfeita. 🙂

Vimos que com o Weka é possível consultar dados de vários SGBD’s, isso permite trabalhar com fontes de dados diferentes.

Outro recurso fantástico do Weka, são os diversos filtros para pré-processamento e transformação de dados. Tudo isso acessível com poucos cliques!

Vimos também que experimentar vários algoritmos de Machine learning é muito simples

Inclusive é possível parametrizar algoritmos e comparar os resultados.

Se você gostou desse artigo, não se esqueça de assinar nossa lista de e-mails e compartilhar com seus amigos!

Vamos criar uma comunidade de mineradores 🙂

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!

  • Felipe Santana

    ..