Aprendizado de máquina - Árvore de decisão
Árvore de decisão
Neste capítulo, mostraremos como fazer uma "Árvore de Decisão". Uma Árvore de Decisão é um Fluxograma e pode ajudá-lo a tomar decisões com base na experiência anterior.
No exemplo, uma pessoa tentará decidir se deve ou não ir a um show de comédia.
Por sorte, nosso exemplo se cadastrou todas as vezes que havia um show de comédia na cidade, e registrou algumas informações sobre o comediante, e também registrou se ele foi ou não.
Era | Experiência | Classificação | Nacionalidade | Vai |
36 | 10 | 9 | Reino Unido | NÃO |
42 | 12 | 4 | EUA | NÃO |
23 | 4 | 6 | N | NÃO |
52 | 4 | 4 | EUA | NÃO |
43 | 21 | 8 | EUA | SIM |
44 | 14 | 5 | Reino Unido | NÃO |
66 | 3 | 7 | N | SIM |
35 | 14 | 9 | Reino Unido | SIM |
52 | 13 | 7 | N | SIM |
35 | 5 | 9 | N | SIM |
24 | 3 | 5 | EUA | NÃO |
18 | 3 | 7 | Reino Unido | SIM |
45 | 9 | 9 | Reino Unido | SIM |
Agora, com base nesse conjunto de dados, o Python pode criar uma árvore de decisão que pode ser usada para decidir se vale a pena assistir a novos shows.
Como funciona?
Primeiro, importe os módulos que você precisa e leia o conjunto de dados com pandas:
Exemplo
Leia e imprima o conjunto de dados:
import pandas
from sklearn import tree
import pydotplus
from
sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)
Para fazer uma árvore de decisão, todos os dados devem ser numéricos.
Temos que converter as colunas não numéricas 'Nationality' e 'Go' em valores numéricos.
O Pandas tem um map()
método que pega um dicionário com informações sobre como converter os valores.
{'UK': 0, 'USA': 1, 'N': 2}
Significa converter os valores 'UK' para 0, 'USA' para 1 e 'N' para 2.
Exemplo
Altere os valores da string para valores numéricos:
d = {'UK': 0,
'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d =
{'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
Em seguida, temos que separar as colunas de recursos da coluna de destino .
As colunas de recurso são as colunas das quais tentamos prever e a coluna de destino é a coluna com os valores que tentamos prever.
Exemplo
X
é as colunas de recurso,
y
é a coluna de destino:
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
Agora podemos criar a árvore de decisão real, ajustá-la com nossos detalhes e salvar um arquivo .png no computador:
Exemplo
Crie uma Árvore de Decisão, salve-a como uma imagem e mostre a imagem:
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data =
tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph =
pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()
Resultado explicado
A árvore de decisão usa suas decisões anteriores para calcular as chances de você querer ir ver um comediante ou não.
Vamos ler os diferentes aspectos da árvore de decisão:
Classificação
Rank <= 6.5
significa que todo comediante com uma classificação de 6,5 ou inferior seguirá a
True
seta (para a esquerda) e o restante seguirá a False
seta (para a direita).
gini = 0.497
refere-se à qualidade da divisão e é sempre um número entre 0,0 e 0,5, onde 0,0 significa que todas as amostras obtiveram o mesmo resultado e 0,5 significa que a divisão é feita exatamente no meio.
samples = 13
significa que restam 13 comediantes neste momento da decisão, que é todos eles, já que este é o primeiro passo.
value = [6, 7]
significa que desses 13 comediantes, 6 receberão um "NÃO" e 7 receberão um "GO".
Gini
Existem muitas maneiras de dividir as amostras, usamos o método GINI neste tutorial.
O método Gini usa esta fórmula:
Gini = 1 - (x/n)2 - (y/n)2
Onde x
é o número de respostas positivas ("GO"),
n
é o número de amostras, e
y
é o número de respostas negativas ("NÃO"), o que nos dá este cálculo:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
O próximo passo contém duas caixas, uma caixa para os comediantes com um 'Rank' de 6,5 ou inferior, e uma caixa com o resto.
Verdadeiro - 5 comediantes terminam aqui:
gini = 0.0
significa que todas as amostras obtiveram o mesmo resultado.
samples = 5
significa que há 5 comediantes restantes neste ramo (5 comediantes com um Rank de 6,5 ou inferior).
value = [5, 0]
significa que 5 receberá um "NO" e 0 receberá um "GO".
Falso - 8 Comediantes Continuam:
Nacionalidade
Nationality <= 0.5
significa que os comediantes com um valor de nacionalidade inferior a 0,5 seguirão a seta para a esquerda (o que significa todos do Reino Unido, ), e o resto seguirá a seta para a direita.
gini = 0.219
significa que cerca de 22% das amostras iriam em uma direção.
samples = 8
significa que restam 8 comediantes neste ramo (8 comediantes com Rank superior a 6,5).
value = [1, 7]
significa que desses 8 comediantes, 1 receberá um "NÃO" e 7 receberão um "GO".
Verdadeiro - 4 Comediantes Continuam:
Era
Age <= 35.5
significa que os comediantes com 35,5 anos ou menos seguirão a seta para a esquerda e o resto seguirá a seta para a direita.
gini = 0.375
significa que cerca de 37,5% das amostras iriam em uma direção.
samples = 4
significa que restam 4 comediantes neste ramo (4 comediantes do Reino Unido).
value = [1, 3]
significa que desses 4 comediantes, 1 receberá um "NÃO" e 3 receberão um "GO".
Falso - 4 Comediantes Terminam Aqui:
gini = 0.0
significa que todas as amostras obtiveram o mesmo resultado.
samples = 4
significa que restam 4 comediantes neste ramo (4 comediantes que não são do Reino Unido).
value = [0, 4]
significa que desses 4 comediantes, 0 receberá um "NÃO" e 4 receberão um "GO".
Verdadeiro - 2 Comediantes Terminam Aqui:
gini = 0.0
significa que todas as amostras obtiveram o mesmo resultado.
samples = 2
significa que restam 2 comediantes neste ramo (2 comediantes com 35,5 anos ou menos).
value = [0, 2]
significa que desses 2 comediantes, 0 receberá um "NÃO" e 2 receberá um "GO".
Falso - 2 Comediantes Continuam:
Experiência
Experience <= 9.5
significa que comediantes com 9,5 anos de experiência, ou menos, seguirão a seta para a esquerda e os demais seguirão a seta para a direita.
gini = 0.5
significa que 50% das amostras iriam em uma direção.
samples = 2
significa que restam 2 comediantes neste ramo (2 comediantes com mais de 35,5 anos).
value = [1, 1]
significa que desses 2 comediantes, 1 receberá um "NÃO" e 1 receberá um "GO".
Verdadeiro - 1 Comediante Termina Aqui:
gini = 0.0
significa que todas as amostras obtiveram o mesmo resultado.
samples = 1
significa que resta 1 comediante neste ramo (1 comediante com 9,5 anos de experiência ou menos).
value = [0, 1]
significa que 0 receberá um "NO" e 1 receberá um "GO".
Falso - 1 Comediante termina aqui:
gini = 0.0
significa que todas as amostras obtiveram o mesmo resultado.
samples = 1
significa que resta 1 comediante neste ramo (1 comediante com mais de 9,5 anos de experiência).
value = [1, 0]
significa que 1 receberá um "NO" e 0 receberá um "GO".
Prever valores
Podemos usar a Árvore de Decisão para prever novos valores.
Exemplo: Devo ir ver um show estrelado por um comediante americano de 40 anos, com 10 anos de experiência e um ranking de comédia de 7?
Exemplo
Use o método predict() para prever novos valores:
print(dtree.predict([[40, 10, 7, 1]]))
Exemplo
Qual seria a resposta se a classificação de comédia fosse 6?
print(dtree.predict([[40, 10, 6, 1]]))
Resultados Diferentes
Você verá que a Árvore de Decisão fornece resultados diferentes se você a executar várias vezes, mesmo que a alimente com os mesmos dados.
Isso porque a Árvore de Decisão não nos dá uma resposta 100% certa. É baseado na probabilidade de um resultado, e a resposta irá variar.