- View
As Árvores de Decisão são algoritmos versáteis de Machine Learning que podem executar tarefas de classificação e regressão, e até mesmo tarefas de multisaída. São algoritmos muito poderosos, capazes de encaixar conjuntos de dados complexos.
Uma árvore de decisão é uma estrutura de árvore semelhante a um fluxograma onde um nó interno representa um recurso (ou atributo), o ramo representa uma regra de decisão e cada nó folha representa o resultado.
O nó mais alto em uma árvore de decisão é conhecido como nó raiz. Ele aprende a particionar com base no valor do atributo. Ele particiona a árvore de uma maneira recursiva chamada particionamento recursivo. Esta estrutura semelhante a um fluxograma ajuda-o na tomada de decisões. É a visualização como um diagrama de fluxograma que imita facilmente o pensamento a nível humano. É por isso que as árvores de decisão são fáceis de entender e interpretar.

Uma árvore de decisão é um tipo de caixa branca do algoritmo de ML. Ele partilha a lógica interna de tomada de decisão, que não está disponível no tipo de caixa preta de algoritmos, como com uma rede neural. Seu tempo de treinamento é mais rápido em comparação com o algoritmo de rede neural.
A complexidade temporal das árvores de decisão é função do número de registos e atributos nos dados fornecidos. A árvore de decisão é um método livre de distribuição ou não paramétrico que não depende de pressupostos de distribuição de probabilidade. As árvores de decisão podem lidar com dados de alta dimensão com boa precisão.
Como funciona o algoritmo da árvore de decisão?
A ideia básica por trás de qualquer algoritmo de árvore de decisão é a seguinte:
- Selecione o melhor atributo usando as Medidas de Seleção de Atributos (ASM) para dividir os registros.
- Faça desse atributo um nó de decisão e divida o conjunto de dados em subconjuntos menores.
- Inicie a construção da árvore repetindo este processo recursivamente para cada criança até que uma das condições corresponda:
- Todas as tuplas pertencem ao mesmo valor de atributo.
- Não há mais atributos restantes.
- Não há mais casos.

Medidas de seleção de atributos
A medida de seleção de atributos é uma heurística para selecionar o critério de divisão que particiona os dados da melhor maneira possível. Também é conhecido como regras de divisão porque nos ajuda a determinar pontos de interrupção para tuplas em um determinado nó. O ASM fornece uma classificação para cada recurso (ou atributo) explicando o conjunto de dados fornecido. O melhor atributo de pontuação será selecionado como um atributo de divisão. No caso de um atributo de valor contínuo, os pontos de divisão para ramos também precisam ser definidos. As medidas de seleção mais populares são Ganho de Informação, Índice de Ganho e Índice de Gini.
Ganho de informação
Claude Shannon inventou o conceito de entropia, que mede a impureza do conjunto de entrada. Em física e matemática, a entropia é referida como a aleatoriedade ou a impureza em um sistema. Na teoria da informação, refere-se à impureza em um grupo de exemplos. O ganho de informação é a diminuição da entropia. O ganho de informação calcula a diferença entre a entropia antes da divisão e a entropia média após a divisão do conjunto de dados com base em determinados valores de atributo. O algoritmo da árvore de decisão ID3 (Dicotomiser Iterativo) usa ganho de informação.
\( Info(D)=-\sum\limits_{i=1}^{m} pi \cdot log_2 pi \)
Onde Pi é a probabilidade de uma tupla arbitrária em D pertencer à classe Ci.
\( Info_A(D)=\sum\limits_{j=1}^{V} \frac{|{ Dj|}}{|D|}X Info(D_j) \)
\( Ganho(A)=Info(D)-Info_A(D) \)
Em que:
- Info(D) é a quantidade média de informação necessária para identificar o rótulo de classe de uma tupla em D.
- |Dj|/|D| atua como o peso da partição jth.
- InfoA(D) é a informação esperada necessária para classificar uma tupla de D com base no particionamento por A.
O atributo A com o maior ganho de informação, Gain(A), é escolhido como o atributo de divisão no nó N().
Índice de ganho
O ganho de informação é tendencioso para o atributo com muitos resultados. Isso significa que ele prefere o atributo com um grande número de valores distintos. Por exemplo, considere um atributo com um identificador exclusivo, como customer_ID, que tenha zero info(D) devido à partição pura. Isso maximiza o ganho de informações e cria particionamentos inúteis.
C4.5, uma melhoria do ID3, usa uma extensão para o ganho de informação conhecida como a taxa de ganho. A taxa de ganho lida com a questão do viés normalizando o ganho de informações usando Split Info. A implementação Java do algoritmo C4.5 é conhecida como J48, que está disponível na ferramenta de mineração de dados WEKA.
\( SplitInfo_A(D)=-\sum\limits_{j=1}^{V} \frac{|{ Dj|}}{|D|} \times log_2(\frac{|{ Dj|}}{|D|}) \)
Em que:
- \( \frac{|D_j|}{|D|} \) atua como o peso da j-ésima partição.
- v é o número de valores discretos no atributo A.
A taxa de ganho pode ser definida como
\( GainRatio(A)=\frac{Ganho(A)}{SplitInfo_A(D)} \)
O atributo com a maior taxa de ganho é escolhido como o atributo de divisão (Source).
Índice de Gini
Outro algoritmo de árvore de decisão CART (Classification and Regression Tree) usa o método Gini para criar pontos de divisão.
\( Gini(D)=1-\sum\limits_{i=1}^{m} Pi^2 \)
Onde pi é a probabilidade de uma tupla em D pertencer à classe Ci.
O Índice de Gini considera uma divisão binária para cada atributo. Você pode calcular uma soma ponderada da impureza de cada partição. Se uma divisão binária no atributo A particiona os dados D em D1 e D2, o índice de Gini de D é:
\( Gini_A(D)=\frac{|{ D_1|}}{|D|}Gini(D_1)+\frac{|{ D2|}}{|D|}Gini(D_2) \)
No caso de um atributo de valor discreto, o subconjunto que fornece o índice gini mínimo para o escolhido é selecionado como um atributo de divisão. No caso de atributos de valor contínuo, a estratégia é selecionar cada par de valores adjacentes como um possível ponto de divisão, e um ponto com um índice de gini menor é escolhido como o ponto de divisão.
\( \Delta Gini(A)=Gini(D)-Gini_A(D) \)
O atributo com o índice de Gini mínimo é escolhido como o atributo de divisão.
Edifício do Classificador de Árvore de Decisão em Scikit-learn
Importando bibliotecas necessárias
Vamos primeiro carregar as bibliotecas necessárias.
# Load libraries
import pandas as pd
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculation
Carregando dados
Vamos primeiro carregar o conjunto de dados Pima Indian Diabetes necessário usando a função CSV de leitura dos pandas. Pode baixar o conjunto de dados do Kaggle para acompanhar.
col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("diabetes.csv", header=None, names=col_names)
pima.head()
| pregnant | glucose | bp | skin | insulin | bmi | pedigree | age | label | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
| 1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
| 2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
| 3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
| 4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
Seleção de recursos
Para entender o desempenho do modelo, dividir o conjunto de dados em um conjunto de treinamento e um conjunto de testes é uma boa estratégia.
Vamos dividir o conjunto de dados usando a função train_test_split(). Você precisa passar três características de parâmetros; e test_set tamanho.
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 70% training and 30% test
Modelo de árvore de decisão de construção
# Create Decision Tree classifer object
clf = DecisionTreeClassifier()
# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)
#Predict the response for test dataset
y_pred = clf.predict(X_test)
Avaliação do modelo
Vamos estimar com que precisão o classificador ou modelo pode prever o tipo de cultivares.
A precisão pode ser calculada comparando os valores reais do conjunto de testes e os valores previstos.
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

