Este documento descreve um estudo sobre encontrar subconjuntos de itens frequentes em grandes conjuntos de dados utilizando o modelo Map-Reduce no Hadoop. O autor implementou funções Map e Reduce em Python para encontrar subconjuntos frequentes em um conjunto de dados sobre incêndios florestais, contendo variáveis meteorológicas e a área queimada. Testes iniciais foram realizados para validar as funções em uma pequena parte do conjunto de dados.
Dicionário de Genealogia, autor Gilber Rubim Rangel
Uma abordagem BigData para Encontrar Sub-conjuntos de itens frequentes mediante MapReduce no Hadoop
1. Encontrando Sub-conjuntos de itens frequentes
mediante MapReduce no Hadoop
Juan Gabriel Colonna
12/15/13
1
Introdu¸˜o
ca
Este trabalho consiste na implementa¸˜o de uma t´cnica de minera¸˜o para
ca
e
ca
encontrar subconjuntos de itens frequentes em grandes conjuntos de dados utilizando o modelo Map-Reduce. Este modelo foi desenvolvido para processar
grandes conjuntos de dados em paralelos sobre arquiteturas de clusters [3]. A
Arquitetura Map-Reduce baseia-se no uso de computadores simples, tais como
n´s conectados em rede mediante ethernet, possibilitando o intercambio de ino
forma¸˜o entre eles. Para o processamento utiliza duas fun¸˜es principais, a
ca
co
fun¸˜o Map que transforma os dados de entrada em uma palavra chave e um
ca
valor da forma < key, value > e a fun¸˜o Reduce que utilizando o value para
ca
somar as ocorrˆncias das palavras chaves (ou keys).
e
A forma de modelar um problema mediante Map-Reduce pode ser aplicado a
v´rios m´todos de aprendizagem de m´quina tais como os explicados por Chu et
a
e
a
al. [1]. Mas nossa abordagem foi baseado no trabalho pr´vio de Cortez et al.[5]
e
com duas diferen¸as. A primeira diferen¸a ´ o conjunto de dados utilizados,
c
c e
que no meu caso utilizei a cole¸˜o F orestF ires1 . Escolhi este dataset por que
ca
inclui dados de um problema ambiental amplamente abordado nas aplica¸˜es de
co
monitoramento que utilizam Redes de Sensores. A segunda diferen¸a ´ a forma
c e
em que s˜o gerados os keys da fun¸˜o Map. Diferente de Cortez et al.[5] eu
a
ca
utilizei subconjuntos frequentes especificando o tamanho m´ximo poss´ e n˜o
a
ıvel
a
pares frequentes.
Finalmente o problema estudado neste trabalho foi definido como: dado um
conjunto de dados (ou dataset), separado por instancias (linhas), determinar os
subconjuntos de itens que aparecem com mas frequˆncias em todas as instancias.
e
As fun¸˜es Map e Reduce foram implementadas na linguagem python e os
co
teste foram executados em uma plataforma Hadoop instalada localmente 2 . A
ferramenta Hadoop provˆ a plataforma Map-Reduce permitindo ao usu´rio criar
e
a
as fun¸˜es pr´prias Map e Reduce [4]. O Hadoop utiliza um sistema de arquivo
co
o
distribu´ e implementa, de forma transparente para o usu´rio, a fun¸˜o que
ıdo
a
ca
ordena os keys. No arquivo instalando haddop no ubuntu.txt inclui uma
guia de instala¸˜o e configura¸˜o do Hadoop no Ubuntu linux 12.04.
ca
ca
1 http://archive.ics.uci.edu/ml/datasets/Forest+Fires
2 http://hadoop.apache.org/
1
2. 2
Testes r´pidos
a
O objetivo desta se¸˜o ´ explicar como executar rapidamente alguns testes com
ca e
as fun¸˜es Map e Reduce, sem muito detalhe do funcionamento, para poder ter
co
uma visualiza¸˜o sobre a entrada e a sa´
ca
ıda. Nas pr´ximas se¸˜es continuarei
o
co
com a explica¸˜o detalhada.
ca
Este relat´rio ´ acompanhado de quatro scripts: mapper.py, reducer.py, reo
e
e
a
ducer teste.py e menu.sh. Para poder executar todos eles ´ necess´rio primeiro
dar permiss˜o de execu¸˜o a cada um, que pode ser feito num terminal exea
ca
cutando dentro da pasta dos arquivos sudo chmod a+x mapper.py ree
ducer teste.py reducer.py menu.sh. Para executar tais testes ´ utilizada
uma base menor, com trˆs linhas, e uma sabe completa, sendo os arquivos foe
rest fires input teste.txt e forestfires.cvs respetivamente.
Como a linguagem utilizada foi python n˜o inclu´ um makefile, mas criei
a
ı
um script que permite executar os testes. Este scrit ´ o arquivo menu.sh. O
e
primeiro passo ´ executar em um terminal ./menu.sh. Ser˜o apresentadas trˆs
e
a
e
op¸˜es:
co
ıda
1. Testar a fun¸˜o Map com forest fires input teste.txt que gera a sa´
ca
teste map out.txt;
2. Testar a fun¸˜o Map e Reduce com forest fires input teste.txt que gera
ca
teste MapReduce out.txt; e
3. Testar a fun¸˜o Map/Reduce com a base completa (forestfires.csv) que
ca
gera teste completo out.txt.
A op¸˜o 1 mostra o resultado de executar somente a fun¸˜o Map gerando
ca
ca
assim os respetivos pares <key,values>. A op¸˜o 2 aplica a fun¸˜o Map, orca
ca
dena a sa´ alfabeticamente e executa a fun¸˜o Reduce para fazer a contagem.
ıda
ca
Com a configura¸˜o por defeito ser˜o mostrados apenas as os subconjuntos com
ca
a
frequˆncias maiores ou iguais a 2. A ultima op¸˜o, executa o teste Map-Reduce
e
ca
usando a base completa mostrando na sa´ os subconjuntos com frequˆncias
ıda
e
maiores ou iguais a 200. Assim esta sa´ gera o arquivo teste completo out.txt
ıda
com:
rain 0 512
area 0 257
rain 0 area 0 254
Y 4 203
Y 4 rain 0
201
Este resultado deve ser interpretado como “nome da vari´vel, valor da vari´vel
a
a
e frequˆncia”. Exemplo: a ultima regra ´ “subconjunto com as vari´veis Y e
e
´
e
a
rain com valores 4 e 0 respetivamente ocorreu 201 vezes”.
Finalizando com os teste r´pidos continuamos com a descri¸˜o detalhada do
a
ca
dataset, das fun¸˜es e dos testes usando o Hadoop.
co
3
Descri¸˜o do dataset
ca
O dataset escolhido ´ um arquivo csv, isto significa que as vari´veis encontrame
a
se separadas por virgulas, correspondendo cada linha da base a uma instancia
2
3. de dados e cada coluna a uma vari´vel. Na teoria de aprendizagem de m´quina
a
a
´ comum referirmos ao conjunto vari´veis que comp˜e uma instancia como ”cae
a
o
racter´
ısticas”. A base Forest Fires possui 12 caracter´
ısticas e por tratar-se uma
base desenvolvida para modelar um problema de regress˜o a ultima coluna, a
a
n´mero 13, ´ um valor real que representa a ´rea total queimada do parque em
u
e
a
hectares. Assim o conjuntos de dados foi originalmente usado para entender a
rela¸˜o entre quantidade de ´rea queimada no parque Montesinho e os dados
ca
a
meteorol´gicos desse momento [2]. O conjunto de caracter´
o
ısticas utilizadas s˜o:
a
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
4
X = coordenada do parque entre 1 e 9 no exio x;
Y = coordenada do parque entre 2 e 9 no eixo y;
month = mes do ano desde janeiro at´ dezembro (”jan- ”dec”);
e
day = dia da semana (”mon- ”sun”);
FFMC - valor num´rico da umidade contida nos produtos vegetais de
e
superf´
ıcie e outros combust´
ıveis secos. Mostra a relativa facilidade de
igni¸˜o e a combustibilidade (18.7 - 96.20);
ca
DMC - valor num´rico da umidade m´dia contida em camadas orgˆnicas
e
e
a
compactas de profundidade moderada. Indica a profundidade a que o fogo
se produzir´ em materiais vegetais (1.1 - 291.3);
a
DC - valor num´rico da umidade contida em materiais compactos e de
e
´
grande volume. E um indicador util de seca e mostra a probabilidade de
´
o fogo atingir enorme profundidade nos materiais (7.9 - 860.6);
ISI - valor da evolu¸˜o inicial do fogo, este indica a velocidade de evolu¸˜o
ca
ca
do fogo de lento a r´pido (0.0 - 56.10);
a
temp - temperatura em graus Celsius (2.2 - 33.30);
RH - porcentagem de umidade relativa %: 15.0 to 100
wind - velocidade do vento em km/h: 0.40 to 9.40
rain - chuva em mm/m2 : 0.0 to 6.4
area - ´rea da floresta queimada em hectares (ha): 0.00 to 1090.84
a
Abordagem
Usar um dataset diferente levou a ter que fazer trˆs considera¸˜es pr´ticas: (a)
e
co
a
os valores das colunas de nosso dataset est˜o sempre ordenados, consequentea
mente n˜o ´ necess´rio implementar um m´todo de ordena¸˜o dentro da fun¸˜o
a e
a
e
ca
ca
Map como fez [5] na linha 2 da figura 4.6, sem correr o risco de contar conjuntos com os mesmos elementos como se fossem diferentes (ex: <beer,cracker>
e <cracker,beer>), (b) as vari´veis que representam n´mero reais foram arrea
u
dondadas para o inteiro mais pr´ximo devido a que n´meros inteiros com dois
o
u
decimais podem ser pouco frequentes e (c) o nome de cada coluna ´ anteposto a
e
cada valor para evitar confundir dois n´mero inteiros que representam vari´veis
u
a
diferentes.
4.1
Fun¸˜o Map
ca
Um exemplo da sa´ da fun¸˜o Map, como foi explicado, seriam os subconjunıda
ca
tos:
e
a
• <X 7,1> o key ´ a vari´vel X, que representa a coordenada do parque
sendo um n´mero inteiro, possui o valor 7 e o value igual a 1;
u
3
4. • <Y 5,1> o key ´ a vari´vel Y, que representa a coordenada, possui o valor
e
a
5 e o value igual a 1;
• <month mar,1> a vari´vel mˆs do ano com o valor mar¸o e o value 1;
a
e
c
• <X 7,Y 5,1> a combina¸˜o das vari´veis X e Y com valores 7 e 5 respeca
a
tivamente, formando um novo subconjunto de tamanho 2 e o value 1;
ca
a
e
• <X 7 month mar,1> a combina¸˜o das vari´veis X e mˆs com valores 7 e
mar¸o respetivamente, formando um novo subconjunto de tamanho 2 e o
c
value 1;
assim cada key ´ um novo subconjunto de tamanho m´ximo definido pelo usu´rio
e
a
a
e o valor 1 ´ igual para todos os subconjuntos.
e
O c´digo da fun¸˜o Map:
o
ca
1
2
3
4
5
6
7
#! / u s r / b i n / env python
# −∗− c o d i n g : u t f −8 −∗−
”””
C r e a t e d on Wed Dec 4 0 8 : 4 2 : 1 8 2013
@author : j u a n
Os c o m e n t a r i o s nao possuem a c e n t o s para poder u s a r o c o d i g o no
r e l a t o r i o em l a t e x
”””
8
9
10
im po rt s y s # i m p o r t a a b i b l i o t e c a que p e r m i t e l e r a e n t r a d a STDIN
c o m p a t i v e l com o Hadoop
im po rt math
11
12
13
14
15
16
17
d e f l i s t p o w e r s e t ( l s t ) : # f u n c a o que g e r a o s s u b c o n j u n t o s
r e s u l t = [ [ ] ] # d e f i n o a l i s t a que t e r a o s s u b c o n j u n t o s
for x in l s t :
r e s u l t = r e s u l t + [ subset + [ x ] for subset in r e s u l t i f len (
s u b s e t ) < sub max ] # l i s t a com l i s t a s c o n c a t e n a d a s
# n e s t a l i n h a cada v e z que a v a r a i v e l x e i g u a l a um novo
elemnto , e l a e c o n c a t e n d a com o s a n t e r i o r e s e com o s
proximos
return r e s u l t [ 1 : ]
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sub max = 4 #tamanho maximo do s u b c o n j u n t o , s e o d e s e j a d o foram
t o d o s o s s u b c o n j u n t o s p o s i v e i s sub max deve s e r i g u a l ao numero
t o t a l de v a r i v e i s da b a s e Ex : sub max = 13
h e a d e r = 1 # f l a g que i n d i c a o c a b e c a l h o
f o r l i n e i n s y s . s t d i n : # e n t r a d a p r o v e n i n t e do STDIN ( s t a n d a r d
input )
l i n e = l i n e . s t r i p ( ) # removendo a f o r m a t a c a o
i f h e a d e r == 1 :
h e a d e r = 0 # f l a g que i n d i c a o c a b e c a l h o
var names = l i n e . s p l i t ( ’ , ’ ) # s e p a r a a s v a r i a v e i s para f a z e r o
t r a t a m e n t o do nomes das c o l u n a s
else :
words = l i n e . s p l i t ( ’ , ’ ) # quebra cada l i n h a em p a l a v r a s ( ou
valores )
i n s t a n c e = [ ] # d e f i n o una nova l i s t a c o r r e s p o n d e n t e a cada
i n s t a n c i a da b a s e
f o r i i n r a n g e ( 0 , l e n ( words ) ) : # c o n c a t e n o o nome de cada c o l u n a
com s e u r e s p e t i v o v a l o r usando um
i f i < 4 : # as p r i m e i r a s quatro v a r i a v e i s sao s t r i n g
i n s t a n c e . append ( var names [ i ] + ’ ’ + words [ i ] )
e l s e : # o r e s t o das v a r i a v e i s s a o numeros r e a i s
4
5. 33
i n s t a n c e . append ( var names [ i ] + ’ ’ + s t r ( i n t ( round ( f l o a t (
words [ i ] ) ) ) ) ) # arredondamento para o i n t e i r o mais
proximo
34
35
a l l s u b s e t = l i s t p o w e r s e t ( i n s t a n c e ) # chama a f u n c a o que c r i a
o s sub−c o n j u n t o s
36
37
38
39
f o r s u b s e t i n a l l s u b s e t : # cada s u b s e t e um e l e m e n t o da l i s t a
all subset
key = ’ ’ . j o i n ( s u b s e t ) # c o n c a t e n a n d o o s e l e m e n t o s e
t r a n s f o r m a n d o em s t r i n g
p r i n t ’%s t%s ’ % ( key , 1 ) # s a i d a para o Hadoop
mapper.py
Nossa fun¸˜o Map come¸a com a linha 9 importando a biblioteca sys para
ca
c
poder interagir com o Hadoop usando as entradas e sa´
ıdas standar do sistema
operacional. Isso significa que o Hadoop possui a capacidade de executar as
fun¸˜es Map e Reduce como sendo comandos do pr´prio sistema.
co
o
As linhas 19 e 20 correspondem ` defini¸˜o de uma constante e uma vari´vel,
a
ca
a
a
a sub max que limita o tamanho m´ximo do subconjunto e o flag header que
indica o tipo de linha de entrada: valor 1 para cabe¸alho e 0 para linhas de
c
dados.
O la¸o principal come¸a na linha 21 executando as fun¸˜es seguintes para
c
c
co
cada linha do dataset. Para cada linha lida s˜o removidos os caracteres de
a
formata¸˜o do texto (linha 23) e posteriormente ´ avaliada a vari´vel header.
ca
e
a
Assim, na primeira execu¸˜o ´ lido o cabe¸alho e o nome das vari´veis que
ca e
c
a
estavam separadas por virgulas ´ armazenado em var names. A var names ´
e
e
utilizada nas itera¸˜es posteriores para identificar cada valor de cada vari´vel
co
a
da base e concatena-lo com “ ”como foi explicado no come¸o desta se¸˜o.
c
ca
A linha 27 quebra cada instˆncia do dataset em palavras, assim no la¸o
a
c
principal existem dois loops for que para separar cada linha e cada palavra da
base. Entre as linhas 30 e 33 ´ realizada a concatena¸˜o dos valores com o nome
e
ca
das vari´veis, mas de forma separada para os primeiros 4 valores, porque s˜o
a
a
strings, j´ os valores subsequentes s˜o primeiro convertidos no tipo float para
a
a
poder ser arredondados.
Todas as linha com seu respetivos valores s˜o armazenados em instance que
a
sar´ o argumento de entrada para a fun¸˜o mais importante list powerset.
a
ca
Exemplo de instance: [‘X 7’ ‘Y 5’ ‘month mar’ ‘day fri’ ‘FFMC 86’ ‘DMC 26’
‘DC 94’ ‘ISI 5’ ‘temp 8’ ‘RH 51’ ‘wind 7’ ‘rain 0’ ‘area 0’]
A fun¸˜o list powerset (linha 12) cria todas as poss´
ca
ıveis combina¸˜es de
co
subconjuntos. Para isso ´ utilizado um loop f or (linha 14) que seleciona cada
e
elemento [x] dentro da lista “instˆncia”que foi passada como argumento de
a
entrada. A cada itera¸˜o o valor [x] ´ combinado com os elementos que j´
ca
e
a
encontram-se na vari´vel result. Esta forma de criar listas em python e conhea
cida como comprehension list e permite definir os elementos da lista seguindo a
regra definida em ela.
´
E mais simples entender a sa´ da fun¸˜o list powerset com um exemplo.
ıda
ca
Supondo a instˆncia de entrada anterior [‘X 7’ ‘Y 5’ ‘month mar’....] a primeira
a
execu¸˜o da linha 15 usa o valor x=‘X 7’ e o combina com result retornando
ca
dentro de result=[[],[‘X 7’]]. O pr´ximo valor de x=‘Y 5’ ´ combinado com os
o
e
anteriores resultando result=[[],[‘X 7’], [‘Y 5’], [‘X 7’ ‘Y 5’]]. Assim o valor de
result durante as trˆs primeiras itera¸˜es muda conforme:
e
co
5
6. 1. [[], [X 7]] primeira itera¸˜o do loop f or;
ca
2. [[], [X 7], [Y 5], [X 7, Y 5]] segunda itera¸˜o do loop f or;
ca
3. [[], [X 7], [Y 5], [X 7, Y 5], [month mar], [X 7, month mar], [Y 5, month mar]]
terceira itera¸˜o do loop f or.
ca
´ preciso destacar que dentro da comprehension list existe uma condi¸˜o if para
e
ca
limitar o tamanho m´ximo do subconjunto especificado pelo valor da constante
a
sub max, e que a sa´ final ´ uma lista com sub-listas menos a primeira posi¸˜o
ıda
e
ca
que possui o valor vazio (linha 17).
ıda
Retornando da fun¸˜o list powerset as linhas 37 a 39 imprimem na sa´
ca
standar do sistema cada key separado por uma tabula¸˜o com o valor 1 (value).
ca
Esta sa´ ser´ ordenada pelo Hadoop e passada para a fun¸˜o Reduce.
ıda
a
ca
4.2
Fun¸˜o Reduce
ca
O objetivo da fun¸˜o Reduce ´ contar o numero de ocorrˆncias da cada subconca
e
e
junto igual para determinar a frequˆncia das regras mais repetidas dentro do
e
dataset.
O c´digo da fun¸˜o Reduce ´:
o
ca
e
1
2
3
4
5
6
7
8
9
10
11
#! / u s r / b i n / env python
# −∗− c o d i n g : u t f −8 −∗−
”””
C r e a t e d on Wed Dec 4 1 4 : 4 5 : 2 0 2013
@author : j u a n
”””
im po rt s y s
c u r r e n t w o r d = None
current count = 0
word = None
f r e q u e n c y = 200
12
13
14
15
16
17
18
19
f o r l i n e in sys . stdin : # entrada standar
line = line . strip ()
word , count = l i n e . s p l i t ( ’ t ’ , 1 ) # s e p a r a a s e n t r a d a s dos k e y s
e v a l u e s em word e count
try :
count = i n t ( count ) # c o n v e r t e o v a l o r count num i n t e i r o
except ValueError :
continue
20
i f c u r r e n t w o r d == word : # v e r i f i c a s e d o i s k e y s s a o i g u a i s e
incrmenta o contador
c u r r e n t c o u n t += count
else :
i f c u r r e n t c o u n t >= f r e q u e n c y : # imprime o r e s u l t a d o da
soma dos v a l u e s
p r i n t ’%s t%s ’ % ( c u r r e n t w o r d , c u r r e n t c o u n t )
c u r r e n t c o u n t = count
c u r r e n t w o r d = word
21
22
23
24
25
26
27
28
29
30
if
( ( c u r r e n t w o r d == word ) & ( c u r r e n t c o u n t >= f r e q u e n c y ) ) :
p r i n t ’%s t%s ’ % ( c u r r e n t w o r d , c u r r e n t c o u n t ) # imprime o
u l t i m o v a l o r de word
reducer.py
6
7. Como comentei anteriormente a fun¸˜o Reduce aproveita o fato que o Haca
doop ordena alfabeticamente os keys retornados pela fun¸˜o Map. Assim o for
ca
da linha 13 lˆ cada subconjunto e o compara com o anterior. Diferentemente
e
da fun¸˜o Map cada linha de entrada para Reduce ´ um subconjunto e n˜o
ca
e
a
uma instˆncia. Entre as linhas 21 e 30 ´ realizada a compara¸˜o, atualizado
a
e
ca
os valores de contagem para cada ocorrˆncia repetida ´ imprimido o resultado
e
e
final.
A constate frequency ´ usada para imprimir as regras com frequˆncia maior
e
e
ao n´mero definido. Se for usado usado frequency=200, um exemplo de sa´
u
ıda
seria:
rain 0 512
area 0 257
rain 0 area 0 254
Y 4 203
Y 4 rain 0 201
A pr´xima se¸˜o ´ brevemente explicado como executar o MapReduce usando
o
ca e
o Hadoop.
5
Usando o Hadoop
Considerando que o Hadoop j´ foi instalado e esta funcionando corretamente
a
(ver Apˆndice A) os passos para a excuss˜o s˜o:
e
a a
1. Acessar em um terminal como usu´rio do Hadoop com os respetivos pria
vil´gios e criar uma pasta onde ficar´ o dataset mkdir forestfires 1;
e
a
2. Em um terminal de usu´rio normal do sistema copiar o dataset para dentro
a
do diret´rio do usu´rio com privil´gios de execu¸˜o do Hadoop, por exemo
a
e
ca
plo: sudo cp facultad/Doutorado/Big data/Amazon/forest fires
input.txt /home/hduser/forestfire 1/;
3. loggar-se como usu´rio do Hadoop e fazer uma copia do dataset para
a
a estrutura de arquivos distribu´ com hadoop dfs -copyFromLocal
ıda
/home/hduser/forestfires 1/ /user/hduser/forestfires 1;
4. copiar a fun¸˜o Map sudo cp facultad/Doutorado/Big data/Amazon
ca
/mapper.py /home/hduser/;
5. copiar a fun¸˜o Reduce sudo cp facultad/Doutorado/Big data/Amazon
ca
/reducer.py /home/hduser/;
6. executar a opera¸˜o hadoop jar /usr/lib/hadoop/contrib/streaming
ca
/hadoop-streaming-1.0.2.jar -file /home/hduser/mapper.py -mapper
/home/hduser/mapper.py -file /home/hduser/reducer.py -reducer
/home/hduser/reducer.py -input /user/hduser/forestfires 1/* output /user/hduser/forestfires 1-output;
7. para extrair os resultados primeiro criamos uma pasta com mkdir /home/hduser/forestfires 1-output; e
8. para copiar os resultados desde o sistema de arquivos do Hadoop para a
pasta de usu´rio hadoop dfs -getmerge /user/hduser/forestfires 1a
output /home/hduser/forestfires 1-output
7
8. Neste trabalho o Hadoop executou de forma local mas pode ser simulada uma
distribui¸˜o de tarefas em diferentes cluster com a op¸˜o -D mapred.reduce.
ca
ca
tasks=16. Enquanto o Hadoop estiver funcionando os processos em andamento ou finalizados podem ser monitorados em um browser usando o endere¸o
c
http://localhost:50030/jobtracker .jsp (figura 1).
Figura 1: Estado das tarefas no Hadoop http://localhost:50030/jobtracker.jsp
Ap´s a execu¸˜o no terminal do comando hadoop jar /usr/lib/hadoop/o
ca
contrib /streaming/hadoop-streaming-1.0.2.jar -file /home/hduser/mapper.py -mapper /home/hduser/mapper.py -file /home/hduser/reducer.py -reducer /home/hduser/reducer.py -input /user/hduser/forestfires 1/* -output /user/hduser/forestfires 1-output. Um exemplo
da sa´ ´ apresentado na figura 2.
ıda e
Figura 2: Estado das tarefas no Hadoop no terminal.
8
9. 6
Interpretando os resultados
O resultado da execu¸˜o anterior mostrando os subconjuntos de tamanho m´ximo
ca
a
4 e frequˆncia maior ou igual a 100 s˜o:
e
a
rain 0 512
area 0 257
rain 0 area 0 254
Y 4 203
Y 4 rain 0 201
month aug 184
month aug rain 0 179
month sep rain 0 172
month sep 172
FFMC 92 133
FFMC 92 rain 0 132
wind 5 130
wind 5 rain 0 127
Y 5 125
Y 5 rain 0 123
Existem algumas informa¸˜es uteis que poder ser extra´
co
ıdas do resultado
anterior. Um exemplo pode ser encontrar amostras que indiquem um desbalanceamento na base. Exemplo: existem muitas mais amostras sem valores de
chuva que com chuva (<rain 0,512>) o que pode causar uma interpreta¸˜o erca
rada das outras regras, como por exemplo <rain 0 area 0,254>, induzindo a
pensar na existˆncia de uma rela¸˜o direta entre n˜o chuva e n˜o queimada na
e
ca
a
a
floresta, conclus˜o que parece estar em contra da l´gica.
a
o
Das regras <month aug rain 0,179> e <month sep rain 0,172> podemos interpretar que nos meses de setembro e agosto praticamente n˜o chove no parque.
a
Tamb´m podemos ver que o ´
e
ındice FFMC que indica a umidade nos produtos
vegetais ´ baixo quando no chove (<FFMC 92 rain 0,132>).
e
Assim, como estas regras outras podem ser obtidas, variando o tamanho dos
subconjuntos e a frequˆncia m´
e
ınima mostrada.
7
Considera¸oes finais
c˜
A forma de abordar o problema gerando subconjunto com a fun¸˜o Map n˜o
ca
a
´ ´tima, porque possui custo exponencial que depende do tamanho m´ximo do
eo
a
subconjunto desejado e com da quantidade de colunas do dataset. O custo da
fun¸˜o list powerset na linha 12 da fun¸˜o Map pode ser calculado como:
ca
ca
k
i=1
n
k
k
=
i=1
n!
k! (n − k)!
na qual n ´ o n´mero de colunas da base e k igual ` constante sub max.
e
u
a
Desta forma podemos calcular a quantidade m´xima de subconjuntos que
a
podem ser obtidos no nosso dataset quando sub max n˜o for limitado, este
a
seriam 8191 conjuntos por cada linha da base! Assim a recomenda¸˜o final ´
ca
e
n˜o use esta abordagem para combinar regras muito grandes!
a
9
10. Referˆncias
e
[1] C. Chu, Sang Kyun Kim, Yi-An Lin, YuanYuan Yu, Gary Bradski, Andrew Y Ng, and Kunle Olukotun. Map-reduce for machine learning on
multicore. Advances in neural information processing systems, 19:281, 2007.
[2] P. Cortez and A. Morais. A data mining approach to predict forest fires using
meteorological data. In New Trends in Artificial Intelligence, Proceedings
of the 13th EPIA 2007 - Portuguese Conference on Artificial Intelligence,
pages 512–523, 2007.
[3] Anand Rajaraman and Jeffrey David Ullman. Mining of massive datasets.
Cambridge University Press, 2012.
[4] Tom White. Hadoop: the definitive guide. O’Reilly, 2012.
[5] Jongwook Woo and Yuhang Xu. Market basket analysis algorithm with
map/reduce of cloud computing. In proc. of the Intl. Conf. on Parallel
and Distributed Processing Techniques and Applications (PDPTA 2011), Las
Vegas, USA, 2011.
10