Árvore de Decisão no Aprendizado de Máquina
- Página Anterior Treinamento/teste
- Próxima Página Introdução ao MySQL

Á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)
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)
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)
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()
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]]))
Exemplo
Se o nível de comédia for 6, qual é a resposta?
print(dtree.predict([[40, 10, 6, 1]]))
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.
- Página Anterior Treinamento/teste
- Próxima Página Introdução ao MySQL