Buscar

Implementação em Java de um Algoritmo de Árvore de Decisão Acoplado a um SGBD Relacional

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 10 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 10 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 10 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Implementação em Java de um Algoritmo de Árvore de Decisão Acoplado a 
um SGBD Relacional 
 
 
Mauricio Onoda & Nelson F. F. Ebecken 
COPPE/UFRJ – Universidade Federal do Rio de Janeiro 
monoda@uninet.com.br nelson@ntt.ufrj.br 
 
 
Resumo 
Atualmente um dos tópicos mais pesquisados em data mining é a sua integração com banco de dados. Os 
reflexos destes esforços já aparecem nos grandes bancos de dados comerciais, que estão fornecendo soluções 
integradas de data mining. Este trabalho avalia o acoplamento de um algoritmo de árvore de decisão não usual 
com um sistema gerenciador de banco de dados relacional e analisa o desempenho da sua implementação em 
Java. 
 
Abstract 
Nowadays one of the most researched topics in data mining is its integration with database. The reflexes of these 
efforts already appear in the major commercial databases, which are supplying integrated solutions of data 
mining. This work evaluates the coupling of an unusual decision tree algorithm to a relational database 
management system, and analyzes the performance of the implementation in Java. 
 
 
1. Introdução 
 
As pesquisas iniciais em data mining foram concentradas na definição de novas 
operações de mineração e no desenvolvimento de algoritmos, sendo a maioria dos sistemas de 
data mining implementada utilizando sistema de arquivos e estrutura de dados específica. 
Estes sistemas que operam diretamente num arquivo de dados (normalmente todo carregado 
na memória principal) tornaram-se insuficientes à medida que as aplicações envolveram a 
mineração de grandes data warehouses. Apesar da utilização de SGBD (Sistema Gerenciador 
de Banco de Dados) em data mining não ser nova, a maioria das aplicações ainda utiliza a 
arquitetura fracamente acoplada, onde os dados são lidos diretamente do banco de dados, 
tupla a tupla, usando a interface de cursor do SGBD. Este acoplamento fraco caracteriza-se 
pelo sistema de banco de dados ser executado num espaço de endereçamento diferente do 
processo de data mining. 
Este trabalho avalia o desempenho da implementação em Java de um algoritmo de 
árvore de decisão não usual, em ambiente de microinformática, numa abordagem fracamente 
acoplada. Este algoritmo, denominado PUBLIC (PrUning and BuiLding Integrated in 
Classification) [1], diferencia-se dos demais por realizar a poda da árvore durante a fase de 
crescimento. No PUBLIC, a fase de crescimento é baseada no algoritmo SPRINT (Scalable 
PaRallelizable INduction on decision Trees) [2], considerado o estado da arte na classificação 
de grande volume de dados, e a fase de poda baseia-se no princípio do MDL (Minimum 
Description Length) [3]. Estas características tornam este algoritmo adequado para o ambiente 
computacional escolhido. A utilização do Java proporciona uma solução mais versátil e 
abrangente, uma vez que a maioria dos grandes bancos de dados comerciais já possui versões 
onde está embutida uma máquina virtual Java (JVM - Java Virtual Machine). Para
comparação de desempenho com o Java, o mesmo algoritmo também foi implementado em 
PL/SQL, aproveitando-se das características do banco de dados Oracle utilizado. 
O trabalho está organizado como apresentado a seguir. A seção 2 mostra uma 
classificação das principais arquiteturas para integração entre data mining e banco de dados. 
A seção 3 apresenta um resumo sobre árvores de decisão. O detalhamento da implementação 
deste trabalho está na seção 4. A seção 5 contém a descrição das bases de dados utilizadas 
para testes e os resultados obtidos. Finalmente, na seção 6 são reunidas as conclusões deste 
trabalho. 
 
2. Arquiteturas para integração entre data mining e SGBD 
 
Uma classificação abrangente para as diversas alternativas de arquiteturas para 
acoplamento entre data mining e um sistema de banco de dados é apresentada em BEZERRA 
et al. [4], onde as abordagens foram divididas em três catego rias principais: convencional, 
fortemente acoplada e caixa-preta (black box). Na categoria convencional, também chamada 
de fracamente acoplada, não há integração entre o SGBD e a aplicação de data mining. Os 
dados são lidos, tupla a tupla, do banco de dados utilizando o mecanismo de cursor do SGBD. 
Na categoria fortemente acoplada, as operações intensivas de dados e as operações que 
consomem muito tempo do algoritmo de data mining são inseridas no SGBD. Esta categoria 
pode ser subdividida em duas abordagens : SQL aware e Extensions aware. Na abordagem 
SQL aware, estas operações são mapeadas em SQL padrão, enquanto que na Extensions 
aware as aplicações de data mining utilizam extensões do banco de dados e extensões do 
SQL. A abordagem Extensions aware agrega as seguintes opções: 
 
- Funções internas: uma função interna é um pedaço de código escrito como UDF (user-
defined function), no IBM DB2/CS, ou como stored procedure, no Oracle PL/SQL. Nesta 
abordagem, parte do algoritmo de data mining é expressa como uma coleção de UDF ou de 
stored procedures, os quais são apropriadamente utilizados em expressões SQL. 
- Tipos de dados: neste caso, as aplicações de data mining utilizam alguns tipos de dados 
específicos do SGBD para melhorar o tempo de execução do algoritmo. 
- Extensões do SQL: o SQL é estendido para permitir execuções de operações intensivas de 
dados no SGBD na forma de primitivas. Assim, as vantagens das extensões do SQL são 
utilizadas pelas aplicações para realizar suas tarefas de mineração. Uma vantagem da 
utilização de extensões do SQL sobre o SQL padrão (SQL aware) é que algumas 
informações, como por exemplo sumários estatísticos, que poderiam ser obtidas através de 
uma seqüência de comandos SQL, podem ser conseguidas através de um número menor de 
requisições ao SGBD. 
 
Na categoria caixa-preta, os algoritmos de data mining são totalmente inseridos no 
SGBD. Neste caso, a aplicação envia ao SGBD uma simples requisição, que normalmente é 
uma expressão de consulta, solicitando a extração de determinado conhecimento. A maior 
desvantagem desta abordagem é devido ao fato que nenhum algoritmo de data mining é o 
mais adequado para todos os conjuntos de dados. Assim, não há meios do algoritmo 
implementado no SGBD ser o melhor em todas as situações. 
 
3. Árvores de decisão 
 
Árvores de decisão são modelos estatísticos utilizados em problemas de predição 
supervisionada, onde um conjunto de atributos é utilizado para predizer o valor de um atributo 
de saída (resultado), sendo o mapeamento destas entradas para a saída denominado modelo 
preditivo. Os dados usados para estimar um modelo preditivo são um conjunto de casos 
(observações, exemplos) que contém valores das entradas e do resultado. Este modelo é 
aplicado em novos casos onde o resultado é desconhecido. Uma árvore de decisão possui este 
nome pois o modelo preditivo pode ser representado numa estrutura semelhante a uma árvore. 
A árvore de decisão é sempre lida de forma descendente, iniciando-se pelo nó raiz. Cada nó 
interno representa uma quebra baseada nos valores de um atributo de entrada, o qual pode 
aparecer em outras quebras na árvore. Os nós terminais de uma árvore são chamados folhas, 
que representam o resultado predito. Quando o resultado é discreto, o modelo é chamado de 
árvore de classificação, onde as folhas fornecem a classe predita e a sua probabilidade. 
Quando o resultado é contínuo, o modelo é chamado de árvore de regressão. Neste caso, as 
folhas fornecem apenas uma predição de valor do resultado. 
O método padrão usado no crescimento da árvore de decisão é baseado em partições 
recursivas, que é um algoritmo guloso descendente. Começando no nó raiz, um número de 
quebras pertinentes a um atributo de entrada é examinado. Para entradas contínuas, as 
divisões são segmentos disjuntos dos valores de entrada, enquanto que para entradas discretas 
as divisões são subconjuntos disjuntos das categorias de entrada.Várias estratégias podem ser 
utilizadas para determinar o conjunto de pontos de quebra, sendo que um critério é usado para 
escolher qual a melhor opção. Então, os casos no nó raiz são divididos de acordo com a 
quebra selecionada. A divisão é repetida para cada nó filho como se ele fosse a raiz de uma 
nova árvore. A profundidade da árvore é controlada pelo critério de parada. 
Uma árvore de decisão pode crescer até todo nó ser puro (árvore máxima), quando ela 
terá 100% de precisão nos dados de treinamento. A árvore máxima é o resultado de 
overfitting, pois ela se adapta à variação sistemática do resultado (sinal) e da variação 
aleatória (ruído). Com isso, ela não generaliza bem os novos dados, os quais normalmente 
contém muito ruído. Ao contrário, uma árvore pequena com somente poucos ramos pode 
subaproveitar os dados (underfitting) e, conseqüentemente, pode falhar na adaptação ao sinal. 
Isto resulta numa generalização pobre. Para evitar estes problemas, é necessário executar a 
poda da árvore, que pode ser do tipo descendente ou ascendente. Na poda descendente (top-
down pruning), ou pré-poda (pre pruning), podem ser utilizados os seguintes critérios de 
parada: limite na profundidade da árvore, limite na quantidade de fragmentação (por exemplo, 
não dividir um nó se o número de casos ficar abaixo de determinado limite) ou significância 
estatística (quando o teste chi-quadrado é utilizado como critério de quebra). Na poda 
ascendente (bottom-up pruning), também chamada de pós-poda (post pruning), uma grande 
árvore é gerada e então os ramos são cortados de maneira reversa usando um critério de 
seleção de modelo. A pré-poda normalmente é mais rápida, mas é consideravelmente menos 
eficiente que a pós-poda. 
 
4. Implementação 
 
Existem vários classificadores que constroem árvore de decisão, sendo que geralmente 
eles geram toda a árvore para depois podá- la. Esta fase de poda serve para melhorar a precisão 
e prevenir contra o overfitting. Entretanto, a geração de uma árvore de decisão em duas fases 
distintas pode resultar num desperdício de esforço considerado se uma subárvore inteira 
construída na primeira fase for podada na segunda fase. Se durante a fase de construção, antes 
de dividir um nó, puder ser concluído que ele será podado na próxima fase, este esforço pode 
ser evitado. Desta forma, como as leituras dos dados são repetidas várias vezes para gerar uma 
subárvore, pode-se conseguir reduções significativas de I/O e melhorar o desempenho do 
processo. 
Este trabalho está baseado no PUBLIC, que é um classificador tipo árvore de decisão 
que integra as duas fases. Se ele parar a expansão de um nó somente quando determinado que 
o mesmo será podado na próxima fase, há a garantia de que a árvore gerada é exatamente a 
mesma do que a obtida pela execução das duas fases separadamente, uma após a outra. 
Entretanto, determinar, durante a fase de construção, se um nó será podado na outra fase é 
problemático porque a árvore ainda está parcialmente gerada. Isto requer que seja estimado 
para cada folha desta árvore parcial, baseado nos registros contidos na folha, o menor custo da 
subárvore originada por esta folha. Quanto maior este valor, maior a quantidade de poda 
possível na fase de construção da árvore. Apesar do PUBLIC utilizar a entropia para 
selecionar o melhor ponto de divisão dos dados, neste trabalho utilizou-se o índice Gini, 
originalmente proposto por BREIMAN et al. [5], como definido no SPRINT. A grande 
vantagem deste índice é que seus cálculos necessitam somente da distribuição dos valores de 
classes em cada partição. 
Enquanto que os conhecidos classificadores CART [5] e C4.5 [6] utilizam o 
crescimento da árvore em profundidade (depth-first), no PUBLIC o crescimento da árvore é 
feito em largura (breadth-first) para permitir que a poda possa ser realizada de forma 
integrada. Durante esta fase de crescimento, o objetivo em cada nó é determinar o ponto de 
quebra que melhor divide os dados de treinamento pertencentes a esta folha. Para descobrir a 
melhor quebra para um nó são avaliadas todas as quebras dos atributos, sendo escolhido para 
dividir o nó o atributo que contém o ponto de quebra com o menor valor de índice Gini. Neste 
trabalho, como são utilizadas somente árvores binárias, um algoritmo guloso é aplicado em 
atributos discretos para dividir os valores sempre em dois grupos. 
Para prevenir o overfitting, o princípio do MDL é utilizado para a poda da árvore, 
tornando-a menos específica. A poda baseada no MDL possui as seguintes vantagens em 
comparação com outros algoritmos de poda: produz árvores com boa precisão para uma 
grande variedade de conjuntos de dados, produz árvores de menor tamanho e é 
computacionalmente eficiente. O princípio do MDL afirma que a melhor árvore é aquela que 
pode ser codificada usando o menor número de bits [1]. Assim, o desafio para a fase de poda 
é achar a subárvore de uma árvore que pode ser codificada com o menor número de bits. O 
custo de codificação de árvore compreende três custos separados: o custo para codificar a 
estrutura de uma árvore, o custo para codificar cada divisão, com o atributo e o respectivo 
valor e o custo para codificar as classes dos registros em cada folha da árvore. 
A estrutura de uma árvore pode ser codificada usando um simples bit para cada nó pois 
precisa especificar apenas se é um nó interno ou é uma folha. Como no PUBLIC são 
consideradas somente árvores binárias, esta técnica de codificação para representar árvores é 
quase ótima [1]. No custo para codificar cada divisão, o atributo a ser dividido pode ser 
codificado usando log2a bits (a é o número de atributos), enquanto que o valor do atributo 
depende se ele é contínuo ou discreto. Sendo v o número de valores distintos para o atributo a 
ser dividido, se o mesmo for contínuo, há v-1 pontos diferente onde o nó pode ser dividido, e 
log2(v-1) bits são necessários para codificar o ponto de quebra. Se o atributo for discreto, 
existem 2v subconjuntos diferentes de valores, sendo seu custo de divisão log2(2v-2). Para um 
nó interno N, seu custo de divisão será denotado por Csplit(N). O custo para codificar os 
registros em cada folha é dado pela Equação 4.1 [3], sendo S um conjunto que contém n 
registros pertencentes a uma das k classes e ni o número de registros com classe i. 
 
å
÷
ø
ö
ç
è
æG
+-+=
i
k
i
i k
nk
n
nnSC
2
log
2
log
2
1log)(
2
222
p (4.1) 
 
Depois de formulado o custo de uma árvore, o objetivo é calcular o custo mínimo de 
uma árvore gerada na fase de construção. Sendo S um conjunto de registros em N e N1 e N2 
são filhos de N, a subárvore de custo mínimo de raiz N, se N é uma folha, é ele mesmo. O 
custo da subárvore de N com menor valor é C(S)+1 (é requerido 1 bit para especificar se o nó 
é uma folha). Se N é um nó interno da árvore com dois filhos N1 e N2, então há duas opções 
para a subárvore de custo mínimo: somente o nó N (isto corresponde a podar os dois filhos do 
nó N e convertê- lo numa folha), ou N junto com seus dois filhos e as subárvores de custo 
mínimo de N1 e N2. Destas duas opções, a que possui menor custo será a subárvore de custo 
mínimo para o nó N. O custo da primeira opção é C(S) +1. Para calcular o custo da segunda 
opção, o procedimento é chamado recursivamente para processar o custo mínimo da 
subárvore de cada um dos filhos. O custo desta segunda opção fica então 
Csplit (N)+1+minCustoN1+minCustoN2. Neste algoritmo, os filhos de um nó N são podados se 
o custo para codificar os registros de dados em N é menor que o custo de codificação da 
subárvore de custo mínimo de N. 
Como no PUBLIC a poda deve ser realizada numa árvore parcial, não se pode assumir 
que o custo da subárvore de menor valor de uma folha N seja C(S)+1. Isto é verdade para uma 
árvore já totalmente construída, mas falso para uma árvore parcialpois esta folha pode ainda 
ser dividida posteriormente. Conseqüentemente, o custo da subárvore de N pode ser um pouco 
menor que C(S)+1 como resultado da sua divisão. Se C(S)+1 sobre-estimar o custo da 
subárvore de menor valor de N, pode ocorrer o over-pruning, ou seja, nós podem ser podados 
durante a fase de construção, mas que não seriam realmente durante a fase de poda. Isto é 
indesejável, pois a proposição do PUBLIC é que a árvore induzida por este classificador seja 
a mesma que a construída por um classificador tradicional. RASTOGI et al. [1] propõem que 
seja subestimado o custo mínimo da subárvore de cada nó folha que ainda pode ser 
expandido. Com a subestimação deste custo, os nós podados são um subconjunto daqueles 
nós que, de qualquer forma, teriam sido podados durante a fase de poda. Assim, a poda 
executada em PUBLIC distingue três tipos de nós folha: o primeiro tipo de folhas são aquelas 
que ainda precisam ser expandidas, o segundo tipo são aquelas que já são resultantes de uma 
poda e o terceiro consiste naquelas que não precisam ser expandidas pois são nós puros. No 
primeiro tipo, é determinado um limite inferior dos custos das subárvores destas folhas. Nos 
outros dois tipos, é utilizado o custo de C(S)+1. Além disso, quando os filhos de um nó N são 
podados, todos os seus descendentes são removidos da fila Q utilizada pelo procedimento de 
construção. Desta forma fica garantido que eles não serão expandidos por este procedimento. 
O algoritmo de poda do PUBLIC mostrado na Figura 4.1 é chamado pelo programa de 
construção da árvore periodicamente, ou depois que um certo número de nós é dividido (este 
pode ser um parâmetro definido pelo usuário), a partir do nó raiz da árvore parcialmente 
gerada. Neste trabalho a poda está sendo executada da segunda forma. É importante ressaltar 
que, depois de concluída a fase de construção, não existirá nenhum nó folha que ainda precisa 
ser expandido. 
 
Procedimento ProcessaCusto&PodaPUBLIC(Nó N) 
 
 1. Se N é uma folha ainda a ser expandida 
 2. Retornar o limite inferior do custo da subárvore de N 
 3. Se N é uma folha já podada ou uma folha não expansível 
 2. Retornar C(S)+1 
 3. minCustoN1 = ProcessaCusto&PodaPUBLIC(N1) 
 4. minCustoN2 = ProcessaCusto&PodaPUBLIC(N2) 
 5. minCustoN = min{C(S)+1, Csplit(N)+1+minCustoN1+minCustoN2} 
 6. Se minCustoN = C(S)+1 
 7. Podar nós filhos N1 e N2 da árvore 
 8. Remover nós N1 e N2 e todos os seus descendentes da fila Q 
 9. Marcar o nó N como já podado 
10. Retornar minCustoN 
 
Figura 4.1 – Algoritmo de poda do PUBLIC 
 
Qualquer subárvore de um nó N deve ter um custo de pelo menos 1, e este valor unitário 
é uma simples, mas conservadora, estimativa para o custo da subárvore de menor valor de um 
nó folha que ainda poderá ser expandido. Dois outros algoritmos foram testados por 
RASTOGI et al. [1] para melhorar esta estimativa de custo mínimo das subárvores dos nós 
folhas. Estes dois estimadores foram bem melhores mas não o suficiente para promover 
ganhos significativos no número de nós podados com relação à primeira estimativa. Os 
resultados indicaram que uma significativa melhora do desempenho pode ser realizada 
somente utilizando o custo unitário. 
 
4.1. Ambiente computacional 
 
Com o intuito de avaliar o desempenho do algoritmo PUBLIC implementado em Java 
utilizou-se o Oracle 8i v.8.1.7 (release 3) configurado em um microcomputador Pentium II 
350Mhz com 128MB de memória principal e executando o Windows NT Server 4.0, onde foi 
instalado o pacote Java SDK 2 v.1.3.0. O acesso da aplicação Java ao banco de dados Oracle é 
realizado através do driver JDBC Thin. Com o objetivo de ter uma referência para 
comparação de desempenho, este algoritmo PUBLIC também foi implementado numa 
arquitetura fortemente acoplada, onde os procedimentos foram escritos em Oracle PL/SQL, 
que é uma extensão do SQL, e armazenados dentro do dicionário de dados do Oracle. A 
utilização da linguagem PL/SQL só foi possível devido à sua capacidade de trabalhar com 
SQL dinâmico, não possuindo similar em outros bancos de dados. Uma característica 
operacional do PL/SQL é que, por ser uma linguagem de programação proprietária, sua 
utilização fica restrita aos bancos de dados da Oracle. Uma avaliação de desempenho de uma 
abordagem fortemente acoplada com PL/SQL em ambiente Oracle paralelo é mostrada em 
SOUSA et al. [7]. Observa-se que, em ambas as implementações (Java e PL/SQL), os 
comandos SQL executados são os mesmos. 
 
4.2. Java 
 
Em três anos, o Java passou de uma linguagem de programação usada no 
desenvolvimento de simples programas com interface gráfica que podiam ser enviados pela 
Web para uma plataforma para desenvolvimento e disponibilização de aplicações corporativas 
e de Internet. O Java tornou-se muito popular entre os desenvolvedores de aplicação porque 
os deixou mais produtivos e por ser uma linguagem moderna, robusta e orientada a objeto. 
Além disso, segundo ORACLE [8], a popularidade sem precedentes do Java é decorrente de 
três benefícios: 
 
1. O desenvolvimento de aplicações é mais simples: o Java oferece características como o 
suporte para rede e para programação concorrente (multithreading), que tornam o 
desenvolvimento de aplicações mais simples que a maioria dos seus predecessores; 
2. As aplicações são independentes de plataforma: o mesmo código binário Java pode ser 
executado em qualquer plataforma que suporta uma máquina virtual Java, incluindo 
mainframes; 
3. As aplicações podem ser desenvolvidas como componentes: o Java oferece um modelo de 
componentes, o JavaBeans, que permite aos desenvolvedores definir e encapsular 
componentes que podem ser montados com componentes escritos por outros 
desenvolvedores. 
 
Através de um programa Java, há duas opções para acessar banco de dados: o JDBC 
e/ou o SQLJ, onde ambos são APIs (também denominados drivers, pacotes). O JDBC (Java 
Database Connectivity) é um padrão independente de fabricante, desenvolvido pela empresa 
Javasoft, o qual foi modelado com base no ODBC, desenvolvido pela Microsoft. O JDBC é 
atualmente o método "de facto" para acessar banco de dados com o Java. Muitas empresas, 
entre as quais Oracle, Intersolv e Weblogic, desenvolveram tipos de drivers JDBC. O SQLJ é 
um padrão para embutir SQL diretamente em programas Java. Ele é um produto de uma 
junção de esforços da Oracle, IBM, Sybase, Tandem e Informix. Apesar do JDBC e do SQLJ 
serem complementares, o JDBC é necessário quando se utiliza SQL dinâmico, que é o caso 
desta aplicação, enquanto que o SQLJ é utilizado para SQL estático. 
A Oracle oferece dois drivers JDBC para o lado cliente, o Thin e o OCI, e um driver 
JDBC para servidor (dentro do Oracle JServer). O Thin é um driver tipo 4, escrito totalmente 
em Java, enquanto o OCI é um driver tipo 2, que é um nível implementado no topo do Oracle 
Call Interface (biblioteca C para acessar o SGBD Oracle). O driver JDBC para servidor é 
executado no mesmo espaço de endereçamento e processo do banco de dados, acessando 
diretamente SQL e PL/SQL. 
 
5. Estudo de casos 
 
Para avaliar a implementação realizada neste trabalho, foram conduzidos experimentos 
utilizando as seguintes bases de dados: base de dados real de domínio público, base de dados 
de meteorologia e base de dados de companhia de seguro. Estas duas últimas bases, que 
também contêm dados reais, foram consideradas pois possuem uma dimensionalidade 
adequada aos testes pretendidos, uma vez que as bases de dados reais de domínio público 
geralmente são pequenas. Estes experimentos utilizaram o método denominado holdout [9] 
para a estimativa de taxa de erro, onde uma parte dos dados é reservada para treinamento e o 
restante é utilizado para teste. Na prática, foi selecionado aleatoriamente 30% dos dados para 
teste, ficandoos 70% restantes para treinamento. 
 
- Base de dado real de domínio público: foi utilizada a base de dados denominada “Adult”, 
uma das maiores do UCI Machine Learning Repository [10], com 48.842 registros. Esta 
base possui 8 atributos discretos e 6 atributos contínuos, com 2 classes de saída. Além 
disso, também possui valores ausentes. 
- Base de dados meteorológicos: são dados adquiridos no Aeroporto do Rio de Janeiro, cuja 
finalidade é a previsão de nevoeiro. Os arquivos texto gerados, um para cada ano, com o 
registro da observação meteorológica horária de superfície com informações de 36 
atributos coletados diariamente foram concatenados numa única base de dados, 
totalizando 28.596 registros. COSTA [11] realizou uma limpeza nestes dados devido ao 
grande número de inconsistências e ruídos, o que resultou num conjunto com 18 atributos 
de entrada e 1 atributo de saída, para um total de 26.492 registros. 
- Base de dados de companhia de seguro: estes dados foram extraídos de um data 
warehouse que coleta e analisa dados de uma companhia privada de seguro de vida. Os 
arquivos disponibilizados pela companhia descrevem o relacionamento entre clientes, 
contratos de seguro e componentes de tarifa, sendo que a identificação de alguns atributos, 
bem como a explicação sobre o conteúdo dos mesmos, estão protegidas por questões de 
sigilo. As tabelas inicialmente armazenadas no servidor paralelo Oracle do NACAD/UFRJ 
foram agrupadas numa única tabela, com 80 atributos e 147.478 registros. Após a limpeza 
dos dados realizada por COSTA [11], o conjunto resultante ficou com 130.143 registros e 
64 atributos, assim distribuídos: 9 atributos com informações de clientes, 33 atributos de 
características de família, 13 atributos de contratos de seguro, 15 atributos de 
componentes de tarifa e 1 atributo contendo a classificação do cliente. 
 
5.1. Resultados 
 
O desempenho da implementação em Java e o erro calculado para as bases de dados 
avaliadas estão mostrados na Tabela 5.1. Nestes resultados, como as árvores geradas são 
binárias, o tamanho de cada árvore (número de nós) é a medida da sua complexidade. 
 
Base de dados 
Tamanho 
da árvore 
(nós) 
Tempo de 
execução (s) 
Java 
Erro 
(%) 
Adult 105 717 18,32 
Meteorologia 183 379 36,75 
Seguro 267 39.006 30,86 
 
Tabela 5.1 – Resultados da implementação em Java 
 
Na Tabela 5.2 compara-se o desempenho do algoritmo PUBLIC implementado em Java 
e em PL/SQL. 
 
Base de dados 
Tempo de 
execução (s) 
Java 
Tempo de 
execução (s) 
PL/SQL 
Adult 717 797 
Meteorologia 379 398 
Seguro 39.006 38.413 
 
Tabela 5.2 – Comparação entre Java e PL/SQL 
 
6. Conclusões 
 
Enquanto a maioria das pesquisas envolvendo a integração de SGBD com data mining 
direciona-se a melhorar a escalabilidade e o desempenho das técnicas de análise de dados, 
este trabalho mostrou que é completamente viável a execução de data mining em ambiente de 
microinformática com Java. A característica de poda integrada do algoritmo PUBLIC foi 
fundamental para o sucesso nas execuções dos experimentos pois, devido à capacidade de 
processamento do microcomputador, é inviável aguardar o final da construção da árvore para 
grandes bases de dados no caso de pós-poda. 
Um ponto que ressaltou nos experimentos realizados foi o desempenho semelhante 
entre o Java e o PL/SQL. No início deste trabalho alguns desenvolvedores experientes 
afirmaram que, neste tipo de aplicação, o Java seria muito mais lento que o PL/SQL. Este fato 
mostra que a utilização do Java deve ser considerada em soluções de data mining integradas 
com SGBD pois também garante à aplicação uma grande portabilidade, uma vez que os 
principais bancos de dados comerciais já interagem com o Java. 
Os resultados desta implementação abrem possibilidades para pesquisas na área de data 
mining incremental utilizando este tipo de plataforma, cujo conjunto aproximar-se-ia das 
necessidades das corporações, onde a repetição de todo o processo de mineração para uma 
determinada base de dados devido à inclusão de novos registros é computacionalmente 
onerosa. 
 
Referências bibliográficas 
 
[1] RASTOGI, R., SHIM, K., “PUBLIC: A Decision Tree Classifier that Integrates 
Building and Pruning”. In: Proceedings of the 24th International Conference 
on Very Large Databases (VLDB), New York, USA, 1998. http://www.bell-
labs.com/user/rastogi/pub.html. 
[2] SHAFER, J., AGRAWAL, R., MEHTA, M., “SPRINT: A Scalable Parallel 
Classifier for Data Mining”. In: Proceedings of the 22nd International 
Conference on Very Large Databases (VLDB), Mumbai (Bombay), India, 
1996. http://www.almaden.ibm.com/cs/quest/PUBS.html. 
[3] MEHTA, M., RISSANEN, J., AGRAWAL, R., “MDL-based Decision Tree 
Pruning”. In: Proceedings of the International Conference on Knowledge 
Discovery in Databases and Data Mining (KDD), Montreal, Canada, 1995. 
http://www.almaden.ibm.com/cs/quest/PUBS.html. 
 
[4] BEZERRA, E., MATTOSO, M., XEXÉO, G., “An analysis of the integration 
between data mining applications and database systems”, In: Proceedings of 
the 2nd International Conference on Data Mining (Data Mining II), pp. 151-
160, Cambridge, UK, 2000. 
[5] BREIMAN, L., FRIEDMAN, J. H., OLSHEN, R. A., et al., Classification and 
Regression Trees, First CRC Press reprint, Boca Raton, USA, Chapman & 
Hall / CRC, 1998. 
[6] QUINLAN, J. R., C4.5: Programs for Machine Learning, 7 ed., San Mateo, 
USA, Morgan Kaufmann Publishers, 1993. 
[7] SOUSA, M. S. R., MATTOSO, M., EBECKEN, N. F. F., “Mining a large 
database with a parallel database server”, IDA – Intelligent Data Analysis, 
n.3 (1999), pp. 437-451, Oct.1999. 
[8] ORACLE CORPORATION, Developing Stored Procedures In Java, Oracle 
Technical White Paper, Redwood Shores, USA, 1999. 
[9] WITTEN, I. H., FRANK, E., Data Mining – Practical Machine Learning Tools 
and Techniques with Java Implementations, 1st ed., San Francisco, USA, 
Morgan Kaufmann Publishers, 2000. 
[10] UCI MACHINE LEARNING REPOSITORY. http:///www.ics.uci.edu/~mlearn/ 
MLRepository.html. 
[11] COSTA, M. C. A, Data Mining em Computadores de Alto Desempenho 
Utilizando-se Redes Neurais, Tese de D.Sc., COPPE/UFRJ, Rio de Janeiro, 
1999.

Outros materiais