Árvore de Decisão
Um dos algoritmos mais poderosos do aprendizado de máquina.
O que é?
Árvore de Decisão é um algoritmo supervisionado de aprendizado de máquina utilizado para classificação e regressão. O objetivo é criar um modelo que prevê o valor do target, aprendendo regras simples através das features.
Vantagens
- Simples de entender e interpretar
- Necessita pouca preparação dos dados
- É capaz de lidar com variáveis númericas e categóricas
Desvantagens
- Árvores de decisão são propensos a criar modelos com overfitting que não generalizam bem
- Podem ser instáveis pois pequenas variáveis podem gerar árvores totalmente diferentes
- As previsões não são contínuas, mas sim aproximações
Na prática
Iremos utilizar um dataset de classificação de flores do Scikit-Learn, onde há 3 possíveis classes. Vamos treinar uma árvore de decisão para classificar uma flor, a partir de suas características, em setosa, versicolor ou virginica.
Após o modelo treinado, podemos utilizar a biblioteca GraphViz para visualizar a árvore de decisão
Cada retângulo é um nó. Cada nó possui exatamente 1 pai e 2 filhos. O nó que não possui pai é o nó raíz.
Pegando uma instância para usar como exemplo, vamos ver como ela se comporta e qual caminho faz na árvore?
Perceba que o nó raíz pergunta se a largura da pétala é menor ou igual 0.8. Se for verdadeiro, vai para o nó da esquerda. Caso contrário, iremos para direita.
No nosso exemplo, a largura da pétala é de 1.5, portanto é falso, não é menor ou igual à 0.8. Vamos para o nó da direita:
No segundo nó, a pergunta é se a largura da pétala é menor ou igual à 1.75. A nossa flor possui 1.5 de largura de pétala. Logo, é verdadeiro. Vamos para o nó da esquerda:
Agora, a condição é se o tamanho da pétala é maior ou igual à 4.95. O nosso é 4.9, então é verdadeiro. Seguimos no nó da esquerda:
Nesse nó, a pergunta é se a largura pétala é menor ou igual à 1.65. A nossa é 1.5. Como é verdadeiro, vamos para o nó da esquerda:
Chegamos no nó folha, que é aquele que não possui filhos. Quando a instância chega nesse nó, ela é classificada.
Samples é a quantidade de instâncias que durante o treinamento caíram naquele nó.
Value é um array que mostra a quantidade de instâncias de cada classe que caíram nesse nó.
Class indica qual classe a árvore irá atribuir para os valores que caírem naquele nó.
Gini
A impureza de Gini mede a probabilidade de uma instância qualquer ser escolhida aleatoriamente. Quanto menor o valor o valor, maior o grau de pureza daquele nó. Atinge seu mínimo (zero) quando todos os casos no nó caem em uma única categoria de destino. Isto é um nó puro.
- GI é o coeficiente de gini
- n é número de amostras
- pi é a probabilidade da classe
Pegando um nó qualquer, é possível perceber que o gini é de 0.168. A conta para obter esse resultado seria essa:
Como a árvore trabalha com valores exatos e eu arredondei, houve uma diferença de 0.001. Mas nada que impacte o nosso resultado final, podemos ignorar essa diferença.
Entropia
De forma similar ao gini, a entropia é a medida da desordem, ou da pureza. Basicamente, é a mensuração da impureza ou aleatoriedade dos dados observados. Se aproxima de 0 quando o nó está puro. Por padrão, a árvore de decisão utiliza o gini, para trocar é só especificar “entropy” no parâmetro criterion.
- Hi é o coeficiente de entropia
- n é o número de amostras
- pi é a probabilidade da classe
Perceba que é o mesmo nó utilizado para calcular o gini, mas agora com entropia. O cálculo de impureza desse nó seria o seguinte:
Hiperparâmetros
Como dito anteriormente, a árvore de decisão é um algoritmo muito poderoso e que aprende os dados muito bem. Se não for passado nenhum parâmetro, provavelmente o modelo irá overffitar.
- max_depth controla a profundidade da árvore.
- min_samples_split representa o minímo de instâncias que um nó precisa para fazer um split.
- min_samples_leaf representa o minímo de instâncias em um nó folha.
- max_leaf_nodes controla o número máximo de nó folha.
Perceba que é crucial saber controlar esse parâmetros. Se colocar números altos, irá fazer com que a árvore aprenda demais e cause overfitting. Do outro lado, números muito baixos irá fazer com que o modelo não aprenda nada. O ajuste dos parâmetros é crucial para encontrar um modelo ideal.
Árvore de Decisão para Regressão
Compreendido o conceito de árvore de decisão para problemas de classificação, podemos entender para regressão, que é bem similar!
Vamos utilizar esse dataset abaixo, que apresenta um target contínuo (salário) e features númericas.
Após treinar o modelo, a árvore ficou muito maior do que a de classificação. Para fins didáticos, colocarei apenas uma parte dela aqui, mas o conceito é o mesmo da classificação:
Há algumas diferenças: ao invés de utilizar o coeficiente de gini ou entropia para divisões, a árvore utiliza a métrica squared_error. Aqui, o value é a média de todas as instância daquele nó. Ao chegar no nó folha, o value assume a média de todas as instâncias de treinamento daquele nó folha.
Função de Custo
- J (K, Tk) representa a função de custo em que K é a feature e Tk é o limiar
- m é o número de samples do nó atual
- esquerdo se refere ao nó esquerdo e direito ao nó direito
- G é o coeficiente de gini
- MSE é o mean squared error
Vamos fazer um exemplo usando uma instância de classificação:
É possível perceber que K é petal length e Tk é 4.85. O número de samples do nó atual é igual à 46, do nó da esquerda é 3 e da direita é 43. O gini do nó da esquerda é 0.444 e da direita é 0, sendo considerado um nó puro. Aplicando a fórmula de função de custo para classificação:
Portanto, é correto dizer que 0.0289 é o custo desse split. Quanto mais baixo o valor da função de custo, melhor o modelo.
Complexidade
No geral, o número de operações para construção de uma árvore binária balanceada é dado pela fórmula:
Enquanto para consulta (query), é:
O que aprendemos?
- O que é e como funciona uma árvore de decisão
- O que é gini e entropia e como calcular
- Hiperparâmetros de uma árvore de decisão
- Função de custo da árvore
- Complexidade da árvore
Links
Para se conectar comigo, acesse meu LinkedIn.
Para ver o código desse artigo, acesse meu GitHub.