Nesta unidade, você vai usar a biblioteca YDF (Yggdrasil Decision Forest) para treinar e interpretar uma árvore de decisão.
Esta unidade é inspirada no tutorial 🧭 Primeiros passos com o YDF.
Informações preliminares
Antes de estudar o conjunto de dados, faça o seguinte:
- Crie um bloco do Colab.
- Para instalar a biblioteca YDF, coloque e execute a seguinte linha de código
no novo notebook do Colab:
!pip install ydf -U
- 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 Palmer Penguins, que contém medidas de tamanho de três espécies de pinguins:
- Faixa para queixo
- Gentoo
- Adelie
Este é um problema de classificação. O objetivo é prever a espécie de pinguim com base nos dados do conjunto de dados de pinguins de Palmer. Confira os pinguins:
Figura 16. Três espécies diferentes de pinguins. Imagem de @allisonhorst
O código a seguir chama uma função pandas para carregar o conjunto de dados Palmer Penguins 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 três primeiros exemplos no conjunto de dados Palmer Penguins:
Tabela 3. Os três primeiros exemplos em Palmer Penguins
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 | 3750,0 | masculino | 2007 |
1 | Adelie | Torgersen | 39,5 | 17,4 | 186,0 | 3800,0 | feminino | 2007 |
2 | Adelie | Torgersen | 40,3 | 18.0 | 195,0 | 3250,0 | feminino | 2007 |
O conjunto de dados completo contém uma mistura de recursos numéricos (por exemplo, bill_depth_mm
), categóricos (por exemplo, island
) e ausentes. Ao contrário das redes neurais, as florestas de decisão oferecem suporte a todos esses tipos de recursos de forma nativa. Assim, você não precisa fazer codificação one-hot, normalização ou usar o recurso extra is_present.
A célula de código a seguir divide o conjunto de dados em um conjunto de treinamento e um conjunto de teste:
# 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
Treinar uma árvore de decisão com hiperparâmetros padrão
É possível treinar sua primeira árvore de decisão com o algoritmo de aprendizado CART (árvores de classificação e regressão), também conhecido como aprendiz, sem especificar hiperparâmetros.
Isso acontece porque o aprendizado ydf.CartLearner
fornece bons valores padrão de hiperparâmetros. Você vai saber mais sobre como esse tipo de modelo funciona
mais adiante no curso.
model = ydf.CartLearner(label=label).train(train_dataset)
A chamada anterior não especificou as colunas a serem usadas como recursos 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érica, categórica, texto) dos recursos de entrada. Portanto, a semântica de recursos é inferida automaticamente.
Chame model.plot_tree()
para mostrar a árvore de decisão resultante:
model.plot_tree()
No Colab, use o mouse para mostrar detalhes sobre elementos específicos, como a distribuição de classes em cada nó.
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, talvez você se lembre de que o conjunto de dados de treinamento continha 272 exemplos. Os 29 exemplos restantes foram reservados automaticamente para validação e poda da árvore.
A primeira condição testa o valor de bill_depth_mm
. As tabelas 4 e 5 mostram a probabilidade de diferentes espécies dependendo do resultado da primeira condição.
Tabela 4. Probabilidade de diferentes espécies se bill_depth_mm ≥
42.3
Espécie | Probabilidade |
---|---|
Adelie (vermelho) | 8% |
Gentoo (azul) | 58% |
Pinguim-de-barbicha (verde) | 36% |
Tabela 5. Probabilidade de diferentes espécies se bill_depth_mm < 42.3
Espécie | Probabilidade |
---|---|
Adelie (vermelho) | 97% |
Gentoo (azul) | 2% |
Pinguim-de-barbicha (verde) | 0% |
bill_depth_mm
é um atributo numérico. Portanto, o valor 42,3 foi encontrado usando o algoritmo de divisão exata para classificação binária com recursos numéricos.
Se bill_depth_mm ≥ 42.3
for "True", teste ainda mais se o flipper_length_mm ≥ 207.5
pode separar quase perfeitamente os Gentoos e os Gentoos+Adelie.
O código a seguir fornece a acurácia de treinamento e 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 a acurácia do treinamento. Nesse caso, o conjunto de teste provavelmente é diferente do conjunto de treinamento. No entanto, não é o caso aqui, já que o treinamento e o teste foram divididos aleatoriamente. Uma explicação mais provável é que o conjunto de dados de teste é muito pequeno (apenas 72 exemplos), então a estimativa de acurácia é ruidosa.
Na prática, para um conjunto de dados tão pequeno, é preferível usar a validação cruzada, porque ela calcula valores de métricas de avaliação mais precisos. No entanto, neste exemplo, vamos continuar com um treinamento e teste para simplificar.
Como melhorar os hiperparâmetros do modelo
O modelo é uma única árvore de decisão treinada com valores padrão de hiperparâmetros. Para receber previsões melhores, você pode:
Use um aprendizado mais eficiente, como um modelo de floresta aleatória ou de árvores otimizadas com gradiente. Esses algoritmos de aprendizado serão explicados na próxima página.
Otimize o hiperparâmetro usando suas observações e intuições. O guia de melhoria do modelo pode ser útil.
Use o ajuste de hiperparâmetros para testar automaticamente um grande número de hiperparâmetros possíveis.
Como ainda não vimos o algoritmo de floresta aleatória e árvores de aumento de gradiente, e como o número de exemplos é muito pequeno para fazer um ajuste automático de hiperparâmetros, você vai melhorar o modelo manualmente.
A árvore de decisão mostrada acima é pequena, e a folha com 61 exemplos contém uma mistura de rótulos de Adelie e Chinstrap. Por que o algoritmo não dividiu mais esta folha? Há dois possíveis motivos:
- O número mínimo de amostras por folha (
min_examples=5
por padrão) pode ter sido atingido. - A árvore pode ter sido dividida e depois podada para evitar overfitting.
Reduza o número mínimo de exemplos para 1 e confira os resultados:
model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()
Figura 18. Uma árvore de decisão treinada com min_examples=1.
O nó folha com 61 exemplos foi dividido várias vezes.
Para saber se vale a pena dividir ainda mais o nó, avaliamos a qualidade desse 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 passou de 0,9167 para 0,97222. Essa mudança de hiperparâmetro foi uma boa ideia.
Prévia das florestas de decisão
Ao continuar melhorando os hiperparâmetros, provavelmente vamos alcançar uma acurácia perfeita. No entanto, em vez desse processo manual, podemos treinar um modelo mais eficiente, como uma floresta aleatória, e verificar se ele funciona melhor.
model = ydf.RandomForestLearner(label=label).train(train_dataset)
print("Test accuracy: ", model.evaluate(test_dataset).accuracy)
# >> Test accuracy: 0.986111
A acurácia da floresta aleatória é melhor do que a da nossa árvore simples. Nas próximas páginas, você vai entender o motivo.
Uso e limitações
Como mencionado anteriormente, uma única árvore de decisão geralmente tem qualidade inferior aos métodos modernos de machine learning, como florestas aleatórias, árvores de gradiente impulsionadas e redes neurais. 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á uma compensação entre a qualidade e a interpretabilidade do modelo.
- Como um proxy para a interpretação do modelo de florestas de decisão, que o curso vai abordar mais tarde.