Árvore de Decisão no Aprendizado de Máquina


Árvore de Decisão (Decision Tree)

Neste capítulo, vamos mostrar como criar uma 'árvore de decisão'. A árvore de decisão é um diagrama de fluxo que pode ajudar você a tomar decisões com base em sua experiência anterior.

Neste exemplo, alguém tentará decidir se deve participar do programa de comédia.

Felizmente, os personagens de nosso exemplo se registram sempre que há apresentação de comédia no vilarejo, e registram algumas informações sobre os comediantes, além de registrar se já foram.

Idade Experiência Rank Nationality Go
36 10 9 UK NO
42 12 4 USA NO
23 4 6 N NO
52 4 4 USA NO
43 21 8 USA YES
44 14 5 UK NO
66 3 7 N YES
35 14 9 UK YES
52 13 7 N YES
35 5 9 N YES
24 3 5 USA NO
18 3 7 UK YES
45 9 9 UK YES

Agora, com base neste conjunto de dados, o Python pode criar uma árvore de decisão, que pode ser usada para decidir se vale a pena participar de qualquer novo espetáculo.

Princípio de funcionamento

Primeiro, importe os módulos necessários e use o pandas para ler o conjunto de dados:

Exemplo

Ler e imprimir 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)

Executar Exemplo

Para criar uma árvore de decisão, todos os dados devem ser números.

Devemos converter as colunas não numéricas 'Nationality' e 'Go' para números.

O Pandas tem um map() Método, que aceita um dicionário contendo informações sobre como converter os valores.

{'UK': 0, 'USA': 1, 'N': 2}

Isso significa converter o valor 'UK' para 0, 'USA' para 1 e 'N' para 2.

Exemplo

Converter valores de string para números:

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)

Executar Exemplo

Depois, devemos separar as colunas de características da coluna de objetivo.

As colunas de características são as colunas que tentamos prever, e a coluna de objetivo é a coluna com os valores que tentamos prever.

Exemplo

X é a coluna de características, y é a coluna de objetivo:

features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)

Executar Exemplo

Agora, podemos criar a árvore de decisão real, ajustando-a aos nossos detalhes, e então salvar um arquivo .png no computador:

Exemplo

Crie uma árvore de decisão, salve-a como imagem e exiba 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()

Executar Exemplo

Explicação dos resultados

A árvore de decisão usa suas decisões anteriores para calcular a probabilidade de você querer assistir a atores de comédia.

Vamos ler diferentes aspectos da árvore de decisão:


Rank

Rank <= 6,5 Representa que os atores de comédia com rank inferior a 6,5 seguirão True Seta (para a esquerda), e o resto segue False Seta (para a direita).

gini = 0.497 Representa a qualidade da divisão e sempre é um número entre 0,0 e 0,5, onde 0,0 representa que todos os amostras obtiveram o mesmo resultado, e 0,5 representa que a divisão está completamente no meio.

samples = 13 Representa que ainda há 13 atores de comédia na decisão, porque é o primeiro passo, então todos eles são atores de comédia.

value = [6, 7] Representa que entre esses 13 atores de comédia, 6 receberão 'NO' e 7 receberão 'GO'.

Gini

Existem muitas maneiras de dividir amostras, e usamos o método GINI neste tutorial.

O método Gini usa a seguinte fórmula:

Gini = 1 - (x/n)2 - (y/n)2

Dentre eles, x é o número de respostas afirmativas ('GO'), n é o número de amostras, y é o número de respostas negativas ('NO'), e são calculados usando a seguinte fórmula:

1 - (7 / 13)2 - (6 / 13)2 = 0.497


O próximo passo inclui dois quadrados, um para atores de comédia cujo 'Rank' é 6,5 ou inferior, e o resto em um quadrado.

True - 5 atores de comédia terminam aqui:

gini = 0.0 Representa que todos os amostras obtiveram o mesmo resultado.

samples = 5 Representa que ainda há 5 atores de comédia nessa ramificação (5 atores com classificação de 6,5 ou inferior).

value = [5, 0] Isso significa que 5 receberá "NO" e 0 receberá "GO".

False - 8 atores de teatro continuam:

Nationality (nacionalidade)

Nationality <= 0,5 Isso significa que comediantes com valor de nacionalidade menor ou igual a 0,5 seguirão o seta à esquerda (isto é, todos os que vêm da Grã-Bretanha), os outros seguirão a à direita.

gini = 0,219 Isso significa que aproximadamente 22% das amostras se moverão na mesma direção.

samples = 8 Isso significa que há ainda 8 comediantes restantes nessa ramificação (8 comediantes com classificação acima de 6,5).

value = [1, 7] Isso significa que dos 8 comediantes, 1 receberá "NO" e 7 receberão "GO".


True - 4 atores de teatro continuam:

Age (idade)

Age <= 35,5 Isso significa que comediantes com 35,5 anos ou menos seguirão o seta à esquerda, os outros seguirão a à direita.

gini = 0,375 Isso significa que aproximadamente 37,5% das amostras se moverão na mesma direção.

samples = 4 Isso significa que há ainda 4 comediantes restantes nessa ramificação (4 comediantes da Grã-Bretanha).

value = [1, 3] Isso significa que dos 4 comediantes, 1 receberá "NO" e 3 receberão "GO".

False - 4 comediantes aqui terminam:

gini = 0.0 Representa que todos os exemplos obtiveram o mesmo resultado.

samples = 4 Isso significa que há ainda 4 comediantes restantes nessa ramificação (4 comediantes da Grã-Bretanha).

value = [0, 4] Isso significa que dos 4 comediantes, 0 receberá "NO" e 4 receberão "GO".


True - 2 comediantes aqui terminam:

gini = 0.0 Representa que todos os exemplos obtiveram o mesmo resultado.

samples = 2 Isso significa que há ainda 2 comediantes restantes nessa ramificação (2 comediantes de 35,5 anos ou mais jovens).

value = [0, 2] Isso significa que dos 2 comediantes, 0 receberá "NO" e 2 receberão "GO".

False - 2 atores de teatro continuam:

Experience (experiência)

Experience <= 9,5 Isso significa que comediantes com 9,5 anos ou mais experiência seguirão o seta à esquerda, os outros seguirão a à direita.

gini = 0,5 Isso significa que 50% das amostras se moverão na mesma direção.

samples = 2 Isso significa que há ainda 2 comediantes restantes nessa ramificação (2 comediantes com mais de 35,5 anos).

value = [1, 1] Isso significa que 1 dos 2 comediantes receberá "NO" e 1 receberá "GO".


True - 1 comediante aqui termina:

gini = 0.0 Representa que todos os exemplos obtiveram o mesmo resultado.

samples = 1 Representa que há ainda 1 ator nessa ramificação (1 ator com 9,5 anos ou menos de experiência em comédia).

value = [0, 1] Representa 0 representa "NÃO", 1 representa "SIM".

False - 1 ator até aqui:

gini = 0.0 Representa que todos os exemplos obtiveram o mesmo resultado.

samples = 1 Representa que há ainda 1 ator de comédia nessa ramificação (1 ator com mais de 9,5 anos de experiência em comédia).

value = [1, 0] 1 representa "NÃO", 0 representa "SIM".

Valores de Previsão

Podemos usar a árvore de decisão para prever novos valores.

Por exemplo: Devo assistir a um programa estrelado por um ator de comédia americano de 40 anos com 10 anos de experiência e com uma classificação de comédia de 7?

Exemplo

Usar predict() Métodos para prever novos valores:

print(dtree.predict([[40, 10, 7, 1]]))

Executar Exemplo

Exemplo

Se o nível de comédia for 6, qual é a resposta?

print(dtree.predict([[40, 10, 6, 1]]))

Executar Exemplo

Resultados Diferentes

Se rodarmos o suficiente vezes, mesmo que você insira os mesmos dados, a árvore de decisão também fornecerá resultados diferentes.

Isso é porque a árvore de decisão não pode nos dar uma resposta de 100% de certeza. Ela se baseia na probabilidade dos resultados, e as respostas podem variar.