Como criar uma árvore de decisão

Nesta unidade, você vai usar o utilitário YDF (Yggdrasil, Decision Forest) treina e interpreta uma árvore de decisão.

Esta unidade é inspirada na 🧭 Conceitos básicos do YDF .

Informações preliminares

Antes de estudar o conjunto de dados, faça o seguinte:

  1. Crie um novo Colab notebook.
  2. Instale a biblioteca YDF colocando e executando a seguinte linha de código: no seu novo bloco do Colab:
    !pip install ydf -U
    
  3. Importe as bibliotecas a seguir:
    import ydf
    import numpy as np
    import pandas as pd
    

O conjunto de dados de pinguins de Palmer

Este Colab usa o Conjunto de dados de pinguins de Palmer, que contém medidas de tamanho para três espécies de pinguins:

  • Queixa
  • Gentoo
  • Adelie

Isso é um problema de classificação — o objetivo é prever as espécies de pinguim com base nos dados do conjunto de dados de pinguins de Palmer. Aqui estão os pinguins:

Três pinguins diferentes
espécie

Figura 16. Três espécies de pinguins diferentes. Imagem de @allisonhorst

 

O código a seguir chama uma pandas para carregar o conjunto de dados dos pinguins de Palmer na memória:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

A tabela a seguir formata os 3 primeiros exemplos da série de pinguins de Palmer conjunto de dados:

Tabela 3. Os três primeiros exemplos em pinguins de Palmer .

espécie ilha bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex ano
0 Adelie Torgersen 39,1 18,7 181,0 3.750,0 masculino 2007
1 Adelie Torgersen 39,5 17,4 186,0 3.800,0 feminino 2007
2 Adelie Torgersen 40,3 18.0 195,0 3.250,0 feminino 2007

O conjunto de dados completo contém uma combinação de valores numéricos (por exemplo, bill_depth_mm), categóricos (por exemplo, island) e atributos ausentes. Ao contrário de redes neurais as florestas de decisão dão suporte a todos esses tipos de atributos nativamente. não precisam fazer codificação one-hot, normalização ou atributo is_present extra.

A célula de código a seguir divide o conjunto de dados em um conjunto de treinamento e teste definido:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

Como treinar árvores de decisão com hiperparâmetros padrão

É possível treinar sua primeira árvore de decisão com o CART (classificação e Árvores de regressão) algoritmo de aprendizado (também conhecido como aprendizado) sem especificar nenhuma e ajustar os hiperparâmetros. Isso ocorre porque o aprendizado ydf.CartLearner fornece boas opções valores de hiperparâmetro. Você vai saber mais sobre como esse tipo de modelo funciona posteriormente no curso.

model = ydf.CartLearner(label=label).train(train_dataset)

A chamada anterior não especificou colunas a serem usadas como atributos de entrada. Portanto, todas as colunas no conjunto de treinamento são usadas. A chamada também não especificou a semântica (por exemplo, numérico, categórico, texto) dos atributos de entrada. Portanto, a semântica do recurso é inferida automaticamente.

Chame model.plot_tree() para exibir a árvore de decisão resultante:

model.plot_tree()

No Colab, é possível usar o mouse para mostrar detalhes sobre elementos específicos, como como a distribuição de classes em cada nó.

Uma árvore de decisão treinada com
e ajustar os hiperparâmetros.

Figura 17. Uma árvore de decisão treinada com hiperparâmetros padrão. .

O Colab mostra que a condição raiz contém 243 exemplos. No entanto, é possível lembre-se de que o conjunto de dados de treinamento continha 272 exemplos. Os 29 restantes foram reservados automaticamente para validação e remoção de árvores.

A primeira condição testa o valor de bill_depth_mm. As tabelas 4 e 5 mostram probabilidade de espécies diferentes dependendo do resultado da primeira condição.

Tabela 4. Probabilidade de espécies diferentes se bill_depth_mm ≥ 42.3

Espécie Probabilidade
Adriana (vermelho) 8%
Gentoo (azul) 58%
Chinstrap (verde) 36%

 

Tabela 5. Probabilidade de espécies diferentes se bill_depth_mm < 42.3

Espécie Probabilidade
Adriana (vermelho) 97%
Gentoo (azul) 2%
Chinstrap (verde) 0%

bill_depth_mm é um recurso numérico. Portanto, o valor 42,3 foi encontrado usando a divisão exata para classificação binária com valores numéricos atributos.

Se bill_depth_mm ≥ 42.3 for verdadeiro, testa mais a fundo se o flipper_length_mm ≥ 207.5 pode separar perfeitamente o Gentoo e do Gentoos+Adelie.

O código a seguir fornece a acurácia do treinamento e do teste do modelo:

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

É raro, mas possível, que a acurácia do teste seja maior do que precisão. Nesse caso, o conjunto de teste pode ser diferente do conjunto de treinamento. No entanto, esse não é o caso aqui, já que os pacotes teste foi dividido aleatoriamente. Uma explicação mais provável é que o conjunto de dados de teste é muito pequeno (somente 72 exemplos), então a estimativa de precisão é confusa.

Na prática, para um conjunto de dados tão pequeno, validação cruzada essa opção é preferível porque computaria valores de métrica de avaliação mais precisos. Neste exemplo, porém, vamos continuar com um para testar simplicidade.

Como melhorar os hiperparâmetros do modelo

O modelo consiste em uma única árvore de decisão treinada com hiperparâmetros padrão e a distribuição dos valores dos dados. Para receber previsões melhores, você pode:

  1. Use um aluno mais eficiente, como floresta aleatória ou árvores otimizadas com gradiente um modelo de machine learning. Esses algoritmos de aprendizado serão explicados na próxima página.

  2. otimizar o hiperparâmetro usando suas observações e intuição. A guia de melhoria do modelo pode ser útil.

  3. Usar o ajuste de hiperparâmetros para testar automaticamente um grande número de hiperparâmetros possíveis.

Como ainda não vimos a floresta aleatória e as árvores otimizadas com gradiente algoritmo, e como o número de exemplos é pequeno demais para fazer uma ajuste de hiperparâmetros, você vai melhorar manualmente o modelo.

A árvore de decisão mostrada acima é pequena, e a folha com 61 exemplo contém uma mistura das etiquetas Adelie e Chinstrap. Por que o algoritmo não dividiu essa folha? mais longe? Há dois possíveis motivos:

  • O número mínimo de amostras por folha (min_examples=5 por padrão) pode ter foram alcançados.
  • A árvore pode ter sido dividida e podada para evitar overfitting.

Reduza o número mínimo de exemplos para um e confira os resultados:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

Uma árvore de decisão treinada com
min_examples=1.

Figura 18. Uma árvore de decisão treinada com min_examples=1. .

 

O nó de folha que contém 61 exemplos foi dividido em vários vezes.

Para ver se é útil dividir o nó ainda mais, avaliamos a qualidade esse novo modelo no conjunto de dados de teste:

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

A qualidade do modelo aumentou com uma acurácia de teste que vai de 0,9167 para 0,97222. Essa mudança de hiperparâmetro foi uma boa ideia.

Anterior de uma floresta de decisão

Ao continuar melhorando os hiperparâmetros, é possível alcançar um resultado ideal precisão. No entanto, em vez desse processo manual, podemos treinar um modelo um modelo, como uma floresta aleatória, e ver se ele funciona melhor.

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

A precisão da floresta aleatória é melhor do que a nossa árvore simples. Você vai aprender nas próximas páginas o porquê.

Uso e limitação

Como mencionado anteriormente, uma única árvore de decisão geralmente tem qualidade inferior de machine learning, como florestas aleatórias, árvores otimizadas com gradiente e redes VPC. No entanto, as árvores de decisão ainda são úteis nos seguintes casos:

  • Como uma referência simples e barata para avaliar abordagens mais complexas.
  • Quando há um equilíbrio entre a qualidade e a interpretabilidade do modelo.
  • Como alternativa para a interpretação do modelo de florestas de decisão, que que o curso abordará mais tarde.