weka

Embed Size (px)

Citation preview

Weka na MunhecaUm guia para uso do Weka em scripts e integrao com aplicaes em JavaRafael Santos (www.lac.inpe.br/rafael.santos)

SumrioSobre este documento Notaes usadas neste documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Introduo 1.1 Sobre o Weka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Ambiente de desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Usando aplicaes do Weka em scripts 2.1 Formato .ARFF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Executando aplicaes a partir da linha de comando (classicao com o algoritmo J4.8) 2.3 Classicando dados com o algoritmo K-Means . . . . . . . . . . . . . . . . . . . . . . 2.4 Encontrando regras de associao com o algoritmo Apriori . . . . . . . . . . . . . . . . 2.4.1 Discretizando os dados contnuos . . . . . . . . . . . . . . . . . . . . . . . . . Incluindo classes do Weka em aplicaes em Java 1 1 2 2 2 2 2 3 7 8 10 13

2

. . . . .

3

Lista de Listagens2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 Contedo do arquivo weather.arff . . . . . . . . . . . . . . . . . Executando o classicador J4.8 pela linha de comando (com classpath) Declarando a varivel de ambiente CLASSPATH . . . . . . . . . . . . Executando o classicador J4.8 pela linha de comando (sem classpath) . Resultado da execuo do comando da listagem 2.2 . . . . . . . . . . . Parte do arquivo iris.arff modicado . . . . . . . . . . . . . . . . Executando o algoritmo K-Means pela linha de comando . . . . . . . . Resultado da execuo do algoritmo K-Means com os dados de ris . . . O arquivo compras.arff . . . . . . . . . . . . . . . . . . . . . . . Executando o algoritmo Apriori pela linha de comando . . . . . . . . . Resultado da execuo do algoritmo Apriori . . . . . . . . . . . . . . . Comando para discretizar os atributos do arquivo iris.arff . . . . . Parte do arquivo iris-disc.arff (discretizado) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 . 4 . 4 . 4 . 5 . 7 . 7 . 7 . 8 . 9 . 9 . 11 . 11

www.lac.inpe.br/rafael.santos

i

27 de abril de 2005

2.14 2.15 3.1 3.2 3.3 3.4 3.5 3.6

Executando o algoritmo Apriori pela linha de comando (arquivo iris-disc.arff) . . Resultado da execuo do algoritmo Apriori (arquivo iris-disc.arff) . . . . . . . . Lendo o contedo de um arquivo .arff . . . . . . . . . . . . . . . . . . . . . . . . . . Criando vetores de dados e armazenando em um arquivo .arff . . . . . . . . . . . . . . Criando vetores de dados e armazenando em um arquivo .arff . . . . . . . . . . . . . . Executando o algoritmo J4.8 em uma aplicao (e avaliando o resultado) . . . . . . . . . . Executando o algoritmo KMeans em uma aplicao (duas vezes) . . . . . . . . . . . . . . Executando o algoritmo KMeans em uma aplicao (e classicando instncias dos dados)

12 12 13 14 15 16 17 17

Sobre este documentoAntes de imprimir este documento por favor leia esta seo. Este documento um guia para o desenvolvimento de aplicaes usando o software Weka [1]. Weka na Munheca indica o foco do documento: ele descreve como usar as classes e aplicativos do pacote Weka em pequenos scripts e aplicaes em Java ao invs de usar as interfaces grcas do pacote (Explorer, KnowledgeFlow). O documento foi escrito para servir de guia para algumas das aulas da disciplina Princpios e Aplicaes de Minerao de Dados (CAP-359-3), oferecido pelo Programa de Ps-Graduao em Computao Aplicada do Instituto Nacional de Pesquisas Espaciais. Veja o site http://www.lac.inpe.br/cap/ para mais informaes sobre o programa e http://www.lac.inpe.br/rafael.santos/cap359/ para mais informaes sobre a disciplina. Este documento est em construo, e provavelmente ser escrito e reescrito nos prximos meses. Ao imprimir este documento por favor considere que outras verses do mesmo estaro disponveis no futuro. Verses do documento podem ser identicadas pela sua data, presente no rodap. Em novas verses darei prioridade para adicionar contedo e exemplos e no para o formato do documento. Notaes usadas neste documento Comandos, listagens, resultados de execuo e opes para programas so mostrados com fonte proporcional. Links para sites de interesse so mostrados em azul. O documento ainda pode ter algumas notas de interesse do autor (basicamente tenho que terminar de escrever isso!), estas anotaes aparecem em violeta negrito. Trechos envoltos em caixas com linhas azuis correspondem a comandos que devem ser executados em uma linha de comando. Trechos envoltos em caixas com linhas verdes correspondem a resultados exibidos no terminal pelos programas executados. Programas que devem ser digitados, compilados e executados aparecem envoltos em caixas com linhas vermelhas. Exerccios propostos aparecem dentro de caixas com linhas pretas.

www.lac.inpe.br/rafael.santos

1

27 de abril de 2005

11.1 1.2

IntroduoSobre o Weka Ambiente de desenvolvimento

Para desenvolver aplicaes e scripts com Weka, voc deve ter o ambiente de desenvolvimento Java (J2SE, Java 2 Standard Edition) instalado. Note que no basta ter somente a mquina virtual (J2SE Runtime Environment), necessrio ter instalado o J2SE Development Kit . Se voc no tiver o ambiente instalado, visite http://java.sun.com para obter o software e instrues para instalao. O ambiente de desenvolvimento sugerido o Eclipse (http://www.eclipse.org). A verso sugerida a 3.1. Tanto o Eclipse quanto o J2SE Development Kit podem ser instalados em computadores executando os sistemas operacionais Windows e Linux. Todos os exemplos mostrados neste documento foram criados usando Linux, mas a execuo em Windows no deve apresentar problemas. Para organizar melhor o cdigo que usa o Weka devemos criar um projeto novo no Eclipse. Para isso use a opo File - New - Project do menu do Eclipse. Escolha Java Project e use um nome adequado para seu projeto. Para que o Weka possa ser includo nas classes do nosso projeto, devemos avanar (use o boto Next ao invs de Finish) e selecione a tab Libraries no dilogo Java Settings. Use o boto Add External JARs para adicionar o arquivo weka.jar (a localizao depende de onde voc instalou o Weka). Clique no boto Finish para criar o projeto. Para criar uma classe em seu projeto use a opo File - New - Class. Para simplicar usaremos o pacote default embora o Eclipse informe que isso no aconselhvel. Mais detalhes sobre a criao de classes sero mostrados na seo 3.

2

Usando aplicaes do Weka em scripts

Nesta seo veremos como usar as aplicaes do Weka a partir da linha de comando e em scripts simples. Antes de executar a aplicao, precisamos formatar dados no format .ARFF (Attribute-Relation File Format), que o formato esperado pelos componentes do software Weka. 2.1 Formato .ARFF

Um arquivo no formato .ARFF um arquivo de texto puro, composto de trs partes: Relao, a primeira linha do arquivo, que deve ser igual a @relation seguida de uma palavrachave que identique a relao ou tarefa sendo estudada. Atributos, um conjunto de linhas onde cada uma inicia com @attribute seguida do nome do atributo e seguida do seu tipo, que pode ser nominal (neste caso as alternativas devem aparecer como uma lista separada por vrgulas e cercadas por chaves) ou numrico (neste caso o nome deve ser seguido da palavra-chave real). Geralmente, em uma tarefa de classicao supervisionada (onde conhecemos as classes das instncias usadas para treinamento) o ltimo atributo a classe para as instncias.

www.lac.inpe.br/rafael.santos

2

27 de abril de 2005

Dados, depois de uma linha contendo @data. Cada linha deve corresponder a uma instncia e deve ter valores separados por vrgula correspondentes (e na mesma ordem) dos atributos da seo Atributos. O arquivo tambm pode conter linhas iniciadas com o sinal de percentagem (%). Estas linhas sero consideradas comentrios e no sero processadas. Para referncia, o contedo do arquivo weather.arff mostrado na listagem 2.1. Listagem 2.1: Contedo do arquivo weather.arff1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

@relation weather @attribute @attribute @attribute @attribute @attribute outlook {sunny, overcast, rainy} temperature real humidity real windy {TRUE, FALSE} play {yes, no}

@data sunny,85,85,FALSE,no sunny,80,90,TRUE,no overcast,83,86,FALSE,yes rainy,70,96,FALSE,yes rainy,68,80,FALSE,yes rainy,65,70,TRUE,no overcast,64,65,TRUE,yes sunny,72,95,FALSE,no sunny,69,70,FALSE,yes rainy,75,80,FALSE,yes sunny,75,70,TRUE,yes overcast,72,90,TRUE,yes overcast,81,75,FALSE,yes rainy,71,91,TRUE,no 2.2 Executando aplicaes a partir da linha de comando (classicao com o algoritmo J4.8)

Esta subseo usa o mesmo exemplo mostrado no captulo 8 de Witten e Frank [2]. O exemplo foi traduzido, corrigido para a ltima verso do Weka e ligeiramente modicado. Vamos usar o algoritmo J4.8, que cria uma rvore de deciso, com os dados weather (previso de jogar golfe ou no baseado em algumas informaes meteorolgicas simples, mostrado na gura 2.1). A rvore pode ser criada com o comando mostrado na listagem 2.2.

www.lac.inpe.br/rafael.santos

3

27 de abril de 2005

Listagem 2.2: Executando o classicador J4.8 pela linha de comando (com classpath)1 2 3

java -cp /usr/local/weka-3-4-4/weka.jar weka.classifiers.trees.J48 -t /usr/local/weka-3-4-4/data/weather.arff

Algumas observaes sobre o comando na listagem 2.2: Todo o contedo da listagem acima deve ser digitado em uma nica linha de comando. A linha est quebrada em trs para facilitar a visualizao e explicao. Usamos a opo -cp para indicar que usaremos um pacote adicional para a mquina virtual Java (linha 1). O argumento para a opo -cp deve ser o caminho completo para a localizao do arquivo weka.jar. O exemplo assume que o pacote foi instalado no diretrio /usr/local/weka-3-4-4/. O nome da classe que implementa o classicador weka.classifiers.trees.J48 (linha 2). Este nome inclui o nome dos pacotes e subpacotes onde as classes esto organizadas. A opo -t (linha 3) indica o nome do arquivo que ser usado como entrada (arquivo de treinamento). Vrios arquivos no formato .arff so distribudos como parte do Weka (no exemplo, os arquivos esto instalados no diretrio /usr/local/weka-3-4-4/data/. Uma forma alternativa de execuo de comandos que dispensa a opo -cp declarar a varivel de ambiente CLASSPATH, o que feito diferentemente para o Windows e para diversos shells do Linux. Como exemplo, para o shell TCSH no Linux podemos usar o comando mostrado na listagem 2.3. Listagem 2.3: Declarando a varivel de ambiente CLASSPATH1

setenv CLASSPATH /usr/local/weka-3-4-4/weka.jar

Com a varivel de ambiente CLASSPATH denida, podemos executar o algoritmo J4.8 com o comando mostrado na listagem 2.4. Listagem 2.4: Executando o classicador J4.8 pela linha de comando (sem classpath)1 2

java weka.classifiers.trees.J48 -t /usr/local/weka-3-4-4/data/weather.arff

Enquanto a sesso durar (isto , enquanto a varivel de ambiente CLASSPATH estiver denida) podemos usar a forma acima, sem a opo -cp. Existem formas de manter a varivel de ambiente constante entre sesses, que tambm so diferentes para os diferentes shells e que no sero cobertas neste documento.

www.lac.inpe.br/rafael.santos

4

27 de abril de 2005

Independentemente da forma usada para executar o comando, o resultado ser exibido no terminal. interessante paginar o resultado para melhor visualizao, isso pode ser feito terminando o comando com | less para paginar de forma simples ou redirecionando o resultado para um arquivo, terminando o comando com > res.txt (onde o arquivo res.txt conter o resultado da execuo, sendo criado ou sobreescrito se necessrio). O resultado da execuo do comando mostrado na listagem 2.2 mostrado na listagem 2.5. Listagem 2.5: Resultado da execuo do comando da listagem 2.21 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

J48 pruned tree -----------------outlook = sunny | humidity 75: no (3.0) outlook = overcast: yes (4.0) outlook = rainy | windy = TRUE: no (2.0) | windy = FALSE: yes (3.0) Number of Leaves : 5 8

Size of the tree :

Time taken to build model: 0.03 seconds Time taken to test model on training data: 0 seconds === Error on training data === Correctly Classified Instances Incorrectly Classified Instances Kappa statistic Mean absolute error Root mean squared error Relative absolute error Root relative squared error Total Number of Instances 14 0 1 0 0 0 0 14 100 0 % %

% %

=== Confusion Matrix === a b cerveja=no 5 conf:(1) leite=sim 5 ==> cerveja=no 5 conf:(1) leite=sim ovos=sim 4 ==> farinha=no cerveja=no leite=sim farinha=no 4 ==> ovos=sim cerveja=no ovos=sim farinha=no 4 ==> leite=sim cerveja=no leite=sim ovos=sim farinha=no 4 ==> cerveja=no leite=sim ovos=sim cerveja=no 4 ==> farinha=no leite=sim farinha=no cerveja=no 4 ==> ovos=sim ovos=sim farinha=no cerveja=no 4 ==> leite=sim

4 4 4 4 4 4 4

conf:(1) conf:(1) conf:(1) conf:(1) conf:(1) conf:(1) conf:(1)

Alguns pontos de interesse da listagem 2.11 so: O resultado mostra alguns dos valores default para os parmetros do algoritmo. Entre as linhas 10 e 16 os tamanhos dos conjuntos de itemsets com suporte mnimo so mostrados. A partir da linha 20 as melhores regras de associao so mostradas. Os valores depois dos antecedentes e consequentes das regras so o nmero de instncias ou ocorrncias para as quais a associao ocorre. interessante observar que o algoritmo usa tanto atributos positivos (sim) como negativos (no), encontrando muitas regras signicativas onde a associao Se A no foi comprado ento B tambm no foi comprado. Por default a execuo do algoritmo tenta criar 10 regras de associao, ordenadas por conana. Exerccio 2.3: Execute novamente o algoritmo Apriori modicando o suporte mnimo para considerao dos itemsets (argumento -M).

Exerccio 2.4: Execute novamente o algoritmo Apriori modicando o nmero de regras listadas (argumento -N). Qual o nmero mximo de regras que pode ser criado, com qualquer suporte ou conana?

Exerccio 2.5: Execute novamente o algoritmo Apriori listando o conjunto de itemsets (argumento -I).

2.4.1 Discretizando os dados contnuos Em alguns casos no poderemos executar o algoritmo Apriori diretamente em um conjunto de dados. O caso mais freqente quando temos dados numricos, pois o algoritmo s trabalha com dados discretos

www.lac.inpe.br/rafael.santos

10

27 de abril de 2005

ou nominais. Podemos usar uma rotina do Weka para discretizar dados numricos. A rotina mais simples a que discretiza dados usando intervalos iguais, e trocando a categoria numrica por uma nominal correspondente ao intervalo. Esta rotina implementada no aplicativo weka.filters.unsupervised. attribute.Discretize. Um exemplo de discretizao mostrado a seguir. Consideremos o problema de discretizar o arquivo de dados das ores ris, que tem quatro atributos numricos. Vamos discretizar estes atributos de forma que cada um dos atributos tenha cinco valores nominais ou discretos possveis. O comando para discretizao mostrado na listagem 2.12. Listagem 2.12: Comando para discretizar os atributos do arquivo iris.arff1 2 3

java weka.filters.unsupervised.attribute.Discretize -R 1,2,3,4 -B 5 -i iris.arff -o iris-disc.arff

A discretizao feita pela aplicao Discretize. A opo -R indica quais so os ndices dos atributos que devem ser discretizados (vrios podem ser indicados, separados por vrgulas). A opo -B indica quantos valores discretos teremos no mximo. A opo -i indica o arquivo de entrada e a opo -o o de sada. Para comparao, parte do arquivo processado mostrado na listagem 2.13. O arquivo foi reformatado para melhor visualizao.

Listagem 2.13: Parte do arquivo iris-disc.arff (discretizado)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

@relation iris-weka.filters.unsupervised.attribute. Discretize-B5-M-1.0-R1,2,3,4 @attribute sepallength {(-inf-5.02],(5.02-5.74],(5.74-6.46], (6.46-7.18],(7.18-inf)} @attribute sepalwidth {(-inf-2.48],(2.48-2.96],(2.96-3.44], (3.44-3.92],(3.92-inf)} @attribute petallength {(-inf-2.18],(2.18-3.36],(3.36-4.54], (4.54-5.72],(5.72-inf)} @attribute petalwidth {(-inf-0.58],(0.58-1.06],(1.06-1.54], (1.54-2.02],(2.02-inf)} @attribute class {Iris-setosa,Iris-versicolor,Iris-virginica} @data (5.02-5.74],(3.44-3.92],(-inf-2.18],(-inf-0.58],Iris-setosa www.lac.inpe.br/rafael.santos 11 27 de abril de 2005

17 18 19

(-inf-5.02],(2.96-3.44],(-inf-2.18],(-inf-0.58],Iris-setosa (-inf-5.02],(2.96-3.44],(-inf-2.18],(-inf-0.58],Iris-setosa (-inf-5.02],(2.96-3.44],(-inf-2.18],(-inf-0.58],Iris-setosa Com os atributos discretizados podemos executar o algoritmo Apriori nos dados das ris. O comando est mostrado na listagem 2.14. Listagem 2.14: Executando o algoritmo Apriori pela linha de comando (arquivo iris-disc.arff)

1

java weka.associations.Apriori -t iris-disc.arff

O resultado da execuo mostrado na listagem 2.14 Listagem 2.15: Resultado da execuo do algoritmo Apriori (arquivo iris-disc.arff)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Apriori ======= Minimum support: 0.3 Minimum metric : 0.9 Number of cycles performed: 14 Generated sets of large itemsets: Size of set of large itemsets L(1): 8 Size of set of large itemsets L(2): 3 Size of set of large itemsets L(3): 1 Best rules found: 1. petallength=(-inf-2.18] 50 ==> class=Iris-setosa 50 conf:(1) 2. class=Iris-setosa 50 ==> petallength=(-inf-2.18] 50 conf:(1) 3. petalwidth=(-inf-0.58] 49 ==> petallength=(-inf-2.18] class=Iris-setosa 49 conf:(1) 4. petallength=(-inf-2.18] petalwidth=(-inf-0.58] 49 ==> class=Iris-setosa 49 conf:(1) 5. petalwidth=(-inf-0.58] class=Iris-setosa 49 ==> petallength=(-inf-2.18] 49 conf:(1) 6. petalwidth=(-inf-0.58] 49 ==> class=Iris-setosa 49 conf:(1) www.lac.inpe.br/rafael.santos 12 27 de abril de 2005

30 31 32 33 34 35 36 37

7. petalwidth=(-inf-0.58] 49 ==> petallength=(-inf-2.18] 49 conf:(1) 8. petallength=(-inf-2.18] 50 ==> petalwidth=(-inf-0.58] class=Iris-setosa 49 conf:(0.98) 9. class=Iris-setosa 50 ==> petallength=(-inf-2.18] petalwidth=(-inf-0.58] 49 conf:(0.98) 10. petallength=(-inf-2.18] class=Iris-setosa 50 ==> petalwidth=(-inf-0.58] 49 conf:(0.98)

Exerccio 2.6: Compare os resultados da classicao das ris obtido com o algoritmo Apriori com o resultado obtido com o algoritmo J4.8. Existe alguma regra correlata?

3

Incluindo classes do Weka em aplicaes em Java

Nesta seo veremos como incluir classes do Weka em aplicaes. No vou escrever muito, vou mais colocar o cdigo como exemplo.Falta completar esta parte. Antes de mais nada, vejamos algumas classes interessantes do Weka: FastVector uma implementao rpida de vetores (arrays de tamanho mutvel). Instances o mapeamento para memria de um arquivo .ARFF. Contm informaes sobre a relao, atributos e dados. Instance contm informaes sobre uma instncia (vetor) de dados. Attribute contm informaes sobre um atributo de uma base de dados qualquer.

Listagem 3.1: Lendo o contedo de um arquivo .arff1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

import import import import import

java.io.FileReader; java.io.IOException; weka.core.Attribute; weka.core.Instance; weka.core.Instances;

public class LeArff { public static void main(String[] args) throws IOException { // Read the instances from a file. FileReader reader = new FileReader("/home/rafael/InpeHP/javadm/datasets/iris-missing.arff"); Instances instances = new Instances(reader); // Get the relation name. System.out.println(instances.relationName()); // Get the number of attributes. System.out.println(instances.numAttributes()+" attributes"); // Show the attributes. for(int i=0;i