1) O documento discute sistemas de apoio à decisão usando árvores de decisão e regressão. 2) Apresenta exemplos de como árvores de decisão podem ser usadas para problemas de classificação e árvores de regressão para problemas numéricos. 3) Discutem como avaliar a qualidade de modelos de decisão obtidos a partir de dados históricos.
1. Sistemas de Informação
MEAE
3- Sistemas de apoio à decisão - Árvores de Decisão e Regressão
Pedro Campos 2019/2020
(parcialmente baseado nos apontamentos de Gestão de Informação, FEP)
1
2. Faculdade de Economia do Porto 2
Sistemas de apoio à decisão - Árvores de
Decisão e Regressão
3. Faculdade de Economia do Porto 3
Sistemas de Apoio à Decisão
• Hoje em dia, alguns sistemas de apoio a decisão
são contruídos a partir de aprendizagem
automática (machine learning)
• Dentro dos algoritmos de machine learning,
destacam-se:
– os algoritmos supervisionados, permitem fazer
tarefas de classificação (tais como as árvores de
decisão e as árvores de regressão)
– os algoritmos não supervisionados, que permitem
encontrar padrões nos dados (como as regras de
associação e o clustering)
4. Faculdade de Economia do Porto 4
Árvores de Decisão e Regressão
• Os problemas de tomada de decisão com
árvores que consideramos são:
– Decisão.
• A decisão a tomar é qualitativa (ex. Compar ou não um
dado produto).
– Regressão.
• A decisão a tomar é numérica (ex. valor de um bem
imobiliário).
5. Neste caso, como a decisão a tomar é do tipo
qualitativo (conceder ou não crédito), estamos perante
um problema de que pode ser resolvido recorrendo a
árvores de decisão
5
Exemplo - concessão de crédito
• Em vez de “extraírmos” dos peritos do banco o
modelo de decisão que usam, podemos solicitar-
lhes o registo histórico das suas decisões.
Vantagens : Mais fácil e mais rápido.
Poderiamos obter uma tabela de casos de decisões como a seguinte:
Montante Idade Salário Conta Decisão
médio junior médio sim concedido
médio junior baixo não não concedido
alto senior alto sim concedido
baixo junior médio sim concedido
alto senior médio não não concedido
… … … … …
6. Faculdade de Economia do Porto 6
Árvores de decisão
• Existem métodos para obter um modelo de decisão a
partir de dados como os da tabela anterior.
Esta árvore foi obtida de um
registo histórico contendo 29
decisões de não conceder e 70
decisões de conceder (a decisão
maioritária é “sim”)
8. Informática Faculdade de Economia do Porto 8
Árvores de decisão podem ser escritas como
regras
Se salário=baixo E montante=alto/médio Então não conceder
Senão Se salário=baixo E montante=alto Então conceder
Senão Se conta=não E montante=alto Então não conceder
Senão Se conta=não E montante=baixo/médio Então conceder
Senão conceder
9. Informática Faculdade de Economia do Porto 9
Obter os dados
– Análise de dados e apoio à decisão/dados-crédito.txt
– Copiar e colar para um ficheiro de texto no notepad
– Guardar (por exemplo com o nome cred.csv.txt)
• Vejamos como colocar estes dados num data frame do R
> dados <- read.csv(’cred.txt’)
> dados
montante idade salario conta emprestimo
1 medio junior baixo sim nao
2 medio junior baixo nao nao
3 baixo junior baixo sim sim
4 alto media baixo sim sim
5 alto senior alto sim sim
...
Ler os dados de um ficheiro
CSV para um data frame
Atributo classe
10. Informática Faculdade de Economia do Porto 10
Obter um árvore de decisão
com os dados de um data frame
• O modelo de decisão
– É construído através da análise dos dados (data mining)
• Como?
– É capaz, com uma certa percentagem de erro, de classificar um novo caso
• Como se mede essa percentagem de erro?
– Ou seja, determina o valor do atributo classe (empréstimo) em função dos outros
atributos (montante, idade, salário, conta)
dados
rpart
modelo de decisão
11. Informática Faculdade de Economia do Porto 11
Obter um árvore de decisão
com os dados de um data frame
> library(rpart)
> árvore <- rpart(emprestimo ~ ., dados)
> árvore
n= 99
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 99 29 sim (0.29292929 0.70707071)
2) salario=baixo 31 11 nao (0.64516129 0.35483871)
4) montante=alto,medio 21 1 nao (0.95238095 0.04761905) *
5) montante=baixo 10 0 sim (0.00000000 1.00000000) *
3) salario=alto 68 9 sim (0.13235294 0.86764706)
6) conta=nao 27 9 sim (0.33333333 0.66666667)
12) montante=alto 9 0 nao (1.00000000 0.00000000) *
13) montante=baixo,medio 18 0 sim (0.00000000 1.00000000) *
7) conta=sim 41 0 sim (0.00000000 1.00000000) *
A função rpart não vem
com o R base.
Ver:
http://www.statmethods.
net/advstats/cart.html
12. > árvore
n= 99
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 99 29 sim (0.29292929 0.70707071)
2) salario=baixo 31 11 nao (0.64516129 0.35483871)
4) montante=alto,medio 21 1 nao (0.95238095 0.04761905) *
5) montante=baixo 10 0 sim (0.00000000 1.00000000) *
3) salario=alto 68 9 sim (0.13235294 0.86764706)
6) conta=nao 27 9 sim (0.33333333 0.66666667)
12) montante=alto 9 0 nao (1.00000000 0.00000000) *
13) montante=baixo,medio 18 0 sim (0.00000000 1.00000000) *
7) conta=sim 41 0 sim (0.00000000 1.00000000) *
Informática Faculdade de Economia do Porto 12
Nº de exemplos
dados ao R
Nº de exemplos
em que a classe
é “não”
Antes de sabermos/testarmos o
valor de qualquer variável,
a melhor decisão seria “sim”.
Probabilidade de um
qualquer exemplo ser
se classe “sim”
13. Informática Faculdade de Economia do Porto 13
> árvore
n= 99
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 99 29 sim (0.29292929 0.70707071)
2) salario=baixo 31 11 nao (0.64516129 0.35483871)
4) montante=alto,medio 21 1 nao (0.95238095 0.04761905) *
5) montante=baixo 10 0 sim (0.00000000 1.00000000) *
3) salario=alto 68 9 sim (0.13235294 0.86764706)
6) conta=nao 27 9 sim (0.33333333 0.66666667)
12) montante=alto 9 0 nao (1.00000000 0.00000000) *
13) montante=baixo,medio 18 0 sim (0.00000000 1.00000000) *
7) conta=sim 41 0 sim (0.00000000 1.00000000) *
Informática Faculdade de Economia do Porto 13
Nº de exemplos em que
o salário é “alto”, a conta é
“não” e o montante é “baixo”
ou “médio”
Nº de exemplos em que
o salário é “alto”, a conta é
“não” , o montante é “baixo”
ou “médio” e a classe é “não”
No grupo de exemplos em
que o salário é “alto”, a conta é
“não” e o montante é “baixo”
ou “médio”, a melhor decisão
seria “sim”.
Probabilidade de um
qualquer exemplo em
que o salário é “alto”,
a conta é “não” e o
montante é “baixo”
ou “médio” ser de
classe “sim”
14. Informática Faculdade de Economia do Porto 14
Obter uma representação gráfica
de uma árvore de decisão
> plot(árvore)
> text(árvore)
• Usando alguns parâmetros destas duas
funções é possível obter resultados gráficos
muito melhores.
• Por exemplo:
> mostra.arvore <- function(árvore) {
+ plot(árvore,uniform=T,branch=0)
+ text(árvore,digits=3,cex=0.65,
+ font=10, pretty=0,fancy=T,fwidth=0,
+ fheight=0)
+ }
> mostra.arvore(árvore)
• Com mais parametrização é possível ainda melhor
como na árvore mostrada anteriormente
> help(plot.rpart)
15. Informática 15
Avaliar a qualidade do modelo de decisão
• Que confiança podemos ter no modelo de decisão que obtivemos a partir
do registo histórico de decisões?
• Podemos tentar responder a esta questão usando o modelo para tomar
decisões, e verificando que percentagem destas é acertada.
• Para isso vamos proceder do seguinte modo:
– Vamos dividir a nossa amostra de decisões (para as quais sabemos a decisão
correcta) em duas partes:
• Uma para construir o modelo de decisão
• Outra para o testar comparando as previsões do modelo com as decisões dos
peritos
dados
rpart
modelo de decisão
treino
teste
avaliação
do modelo
16. Avaliar a qualidade do modelo de decisão
Primeira abordagem:
selecção das primeiras linhas (ex. 70% delas)
para dados de treino e das restantes para
dados de teste.
> dados.treino <- dados[1:69,]
> dados.teste <- dados[70:99,]
Ou um pouco mais geral:
> caso.separador <- 0.7*nrow(dados)
> dados.treino <- dados[1:caso.separador,]
> dados.teste <- dados[-(1:caso.separador),]
Informática Faculdade de Economia do Porto 16
17. Função sample
A função sample permite gerar números
aleatórios inteiros não repetidos.
> sample(1:10,3)
Informática Faculdade de Economia do Porto 17
Sequência de inteiros
de onde se vai extrair
os números aleatórios
Nº de números
aleatórios a extrair
O resultado desta instrução foi 7, 8 e 9. Se se executar uma segunda vez a
instrução, o resultado será, em princípio, diferente, pois senão não seriam
números aleatórios!
18. Informática Faculdade de Economia do Porto 18
Avaliar a qualidade do modelo de decisão
Segunda abordagem:
selecção aleatória dos dados de treino e dos dados
de teste.
> amostra <- sample(1:nrow(dados),0.7*nrow(dados))
> dados.modelo <- dados[amostra,]
> dados.teste <- dados[-amostra,]
> árvore <- rpart(emprestimo ~ .,dados.modelo)
> previsões.modelo <- predict(árvore,dados.teste,predict="prob")
> previsões.modelo
nao sim
3 0.7200000 0.2800000
7 0.1590909 0.8409091
...
A árvore prevê que existe 72% de probabilidade de
este ser um caso em que não se deve conceder
crédito.
19. Informática Faculdade de Economia do Porto 19
Avaliar a qualidade do modelo de decisão (cont.)
> previsões.modelo <- predict(árvore,dados.teste,type='class')
> previsões.modelo
[1] nao sim nao sim sim sim sim sim nao sim sim sim sim sim sim sim sim nao sim
[20] sim nao sim sim sim sim nao sim sim sim sim
Levels: nao sim
> table(dados.teste$emprestimo,previsões.modelo)
previsões.modelo
nao sim
nao 2 2
sim 4 22
> m.conf <- table(dados.teste$emprestimo,previsões.modelo)
> perc.erro <- 100*(m.conf[1,2]+m.conf[2,1])/sum(m.conf)
> perc.erro
[1] 20
• Nestes 30 casos de teste, a árvore acerta em 80% dos
casos.
Matriz de confusão
20. Informática Faculdade de Economia do Porto 20
Avaliar a qualidade do modelo de decisão (cont.)
O método de cálculo de erro apresentado antes tem uma desvantagem:
Aplica-se só aos casos que envolvem 2 classes só.
O problema pode ser contornado, usando a instrução diag(m.conf),
que retorna os elementos na diagonal da matriz (i.e. acertos):
> perc.erro <- 100*(sum(m.conf) – sum(diag(m.conf)))/sum(m.conf)
> perc.erro
[1] 20
21. Faculdade de Economia do Porto 21
Árvores de Regressão
• Agora os problemas de tomada de decisão
com árvores que consideramos são:
– Regressão.
• A decisão a tomar é numérica (ex. valor de um bem
imobiliário).
22. Faculdade de Economia do Porto 22
• Variável Objectivo
– preço
• Atributos descritivos
– quartos, zona
• Modelo de regressão
Se quartos>3
Se zona=cara Então preço=250000
Senão preço=150000
Senão se quartos<=3
Se zona=cara Então preço=180000
Senão preço=100000
250000 150000 180000 100000
quartos>3 quartos<=3
zona=cara zona=barata
zona=cara zona=barata
Exemplo – preço de uma casa
23. Faculdade de Economia do Porto 23
Um problema de árvores de regressão
• O conjunto de dados “swiss” que vem com o R apresenta vários casos referentes a um estudo
destinado a explorar a relação entre a taxa de mortalidade infantil e uma série de factores
sócio-económicos de várias províncias da Suíça.
> data(swiss)
> swiss[1:5,]
Fertility Agriculture Examination Education Catholic Infant.Mortality
Courtelary 80.2 17.0 15 12 9.96 22.2
Delemont 83.1 45.1 6 9 84.84 22.2
Franches-Mnt 92.5 39.7 5 5 93.40 20.2
Moutier 85.8 36.5 12 7 33.77 20.3
Neuveville 76.9 43.5 17 15 5.16 20.6
>
24. Faculdade de Economia do Porto 24
Um problema de regressão
> summary(swiss)
Fertility Agriculture Examination Education
Min. :35.00 Min. : 1.20 Min. : 3.00 Min. : 1.00
1st Qu.:64.70 1st Qu.:35.90 1st Qu.:12.00 1st Qu.: 6.00
Median :70.40 Median :54.10 Median :16.00 Median : 8.00
Mean :70.14 Mean :50.66 Mean :16.49 Mean :10.98
3rd Qu.:78.45 3rd Qu.:67.65 3rd Qu.:22.00 3rd Qu.:12.00
Max. :92.50 Max. :89.70 Max. :37.00 Max. :53.00
Catholic Infant.Mortality
Min. : 2.150 Min. :10.80
1st Qu.: 5.195 1st Qu.:18.15
Median : 15.140 Median :20.00
Mean : 41.144 Mean :19.94
3rd Qu.: 93.125 3rd Qu.:21.70
Max. :100.000 Max. :26.60
> hist(swiss$Infant.Mortality,
+ main='Histograma da variável objectivo',
+ xlab='Taxa de mortalidade')
25. Faculdade de Economia do Porto 25
Árvores de regressão
• A função “rpart()” usada para obter árvores de decisão, pode ser usada de
igual forma para obter árvores de regressão.
> arv.regr <- rpart(Infant.Mortality ~ ., data=swiss)
> arv.regr
n= 47
node), split, n, deviance, yval
* denotes terminal node
1) root 47 390.25490 19.94255
2) Fertility< 64.25 11 76.84727 17.35455 *
3) Fertility>=64.25 36 217.22000 20.73333
6) Agriculture>=72.8 7 20.56000 18.10000 *
7) Agriculture< 72.8 29 136.40210 21.36897
14) Catholic< 59.305 19 50.76421 20.73684 *
15) Catholic>=59.305 10 63.62100 22.57000 *
> mostra.arvore(arv.regr)
26. > arv.regr
n= 47
node), split, n, deviance, yval
* denotes terminal node
1) root 47 390.25490 19.94255
2) Fertility< 64.25 11 76.84727 17.35455 *
3) Fertility>=64.25 36 217.22000 20.73333
6) Agriculture>=72.8 7 20.56000 18.10000 *
7) Agriculture< 72.8 29 136.40210 21.36897
14) Catholic< 59.305 19 50.76421 20.73684 *
15) Catholic>=59.305 10 63.62100 22.57000 *
Faculdade de Economia do Porto 26
Nº de casos em
que a Fertility é
menor do que
64.25
Valor médio, na variável objectivo,
dos exemplos em que a Fertility é
menor do que 64.25. A previsão da
variável objectivo, pela árvore, para
um qualquer caso em que a Fertility é
menor do 64.25, é de
17.35455
Soma dos quadrados dos
desvios em relação à média, na
variável objectivo, para os
exemplos em que a Fertility é
menor do 64.25
27. Faculdade de Economia do Porto 27
Avaliar a árvore de regressão
• Vamos usar um processo semelhante de divisão dos dados:
> amostra <- sample(1:nrow(swiss),as.integer(0.7*nrow(swiss)))
> dados.treino <- swiss[amostra,]
> dados.teste <- swiss[-amostra,]
> arv.regr <- rpart(Infant.Mortality ~.,data=dados.treino)
> prev.arv <- predict(arv.regr,dados.teste)
> prev.arv
Franches-Mnt Neuveville Glane Gruyere Veveyse Aubonne
22.53636 22.53636 18.65000 22.53636 18.65000 18.65000
Avenches Echallens Grandson Oron Entremont Herens
18.65000 18.65000 22.53636 18.65000 18.65000 18.65000
Boudry Le Locle ValdeTravers
22.53636 22.53636 22.53636
> (mae <- mean(abs(prev.arv-dados.teste$Infant.Mortality)))
[1] 2.683636
Erro absoluto
médio.
testen
i
ii
teste
deiroValorVerdaevistoValor
n
MAE
1
1
Pr
28. Faculdade de Economia do Porto 28
Outros aspetos com árvores
• Overfitting
• Prunning (poda)
• Bagging
• Random forests
29. Faculdade de Economia do Porto 29
Overfitting
• Overfitting) ocorre quando o modelo de dados se ajusta
em demasiado ao conjunto de dados/amostra.
• Os dados de treino podem apresentar desvios causados
por erros de medição ou outros fatores aleatórios, e o
overfitting ocorre quando o modelo se ajusta em
demasia a dados com estas imprecisões
30. Faculdade de Economia do Porto 30
Poda (Prunning)
• A poda evita o overfitting dos dados
• A ideia é minimizar os erros no porcesso de validação
cruzada
• Exemplo:
z.auto <- rpart(Mileage ~ Weight, car.test.frame)
zp <- prune(z.auto, cp = 0.1)
plot(z.auto)
plot(zp)
cp é o “complexity parameter”, ou seja, é o custo de adicionar uma nova variável ao modelo
31. Faculdade de Economia do Porto 31
Bagging
• Bagging, (=Bootstrap aggregating) é um algoritmo de machine
learning do tipo ensemble ou meta-algorithm desenhado para
melhorar a estabilidade e a precisãod e uma árvore de decisão ou
regressão. Reduz tambmém a a variância e ajuda a evitar o
overfitting
• Dado um conjunto de treino D de tamanho n, o bagging gera m
novos conjuntos Di, cada um de tamanho n′, através de um processo
de amostragem a partir de D uniformemente com reposição
(bootstrap sampling).
• Os m modelos são ajustados usando estas amostras e combinados
através da média ou de um algoritmo de votação
32. Faculdade de Economia do Porto 32
Bagging
Exemplo:
• Recorrendo ao package ipred do R (instale-o primeiro) e recorrendo
ao conjunto de dados swiss, disponível no R
library ( ipred )
modelo <- bagging ( Fertility ~ ., swiss , nbagg =100)
previsoes.finais <-predict ( modelo , swiss , type =" class ")
• Para verificar relação entre previsões e dados reais:
cor(previsoes.finais, swiss$Fertility)
33. Faculdade de Economia do Porto 33
Random Forests
• A diferença entre o bagging e as random forests está no modo de
construção de cada árvore.
• O bagging, considera todas as variáveis explicativas em todos os nós
(splits),
• As random forests não consideram todas as variáveis explicativas em
cada split. Consideram apenas um número reduzido destas
• Supostamente, as random forests são mais eficazes, pois aumentam
a diversidade do modelo de previsão em comparação com o bagging
e diminuem o esforço computacional
34. Faculdade de Economia do Porto 34
Random Forests
• Exemplo
• Recorrendo ao package randomForest do R (instale-o primeiro) e
recorrendo ao conjunto de dados swiss, disponível no R
Library (randomForest)
modelo <- randomForest ( Fertility ~ ., swiss , ntree =100 , mtry
=5)
predict(modelo)
35. Faculdade de Economia do Porto 35
Package Party
• Install.package (“party”)
• library(party)
• modelo <- ctree ( Fertility ~ ., swiss)
• plot(modelo)