In questa unità utilizzerai la libreria YDF (Yggdrasil Decision Forest) per addestrare e interpretare un albero decisionale.
Questa unità è ispirata al 🧭 tutorial Inizia con YDF.
Eliminatorie
Prima di studiare il set di dati, segui questi passaggi:
- Crea un nuovo blocco note di Colab.
- Installa la libreria YDF inserendo ed eseguendo la seguente riga di codice nel nuovo notebook di Colab:
!pip install ydf -U
- Importa le seguenti librerie:
import ydf import numpy as np import pandas as pd
Il set di dati Palmer Penguins
Questo Colab utilizza il set di dati pinguini di Palmer, che contiene misurazioni delle dimensioni di tre specie di pinguini:
- Pygoscelide antartico
- Gentoo
- Adelie
Si tratta di un problema di classificazione: l'obiettivo è prevedere la specie di pinguino in base ai dati del set di dati Palmer's Penguins. Ecco i pinguini:
Figura 16. Tre diverse specie di pinguini. Immagine di @allisonhorst
Il seguente codice chiama una funzione pandas per caricare in memoria il set di dati dei pinguini di Palmer:
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)
La seguente tabella formatta mostra i primi 3 esempi nel set di dati Palmer Penguins:
Tabella 3. I primi 3 esempi in Palmer Penguins
specie | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | genere | anno | |
---|---|---|---|---|---|---|---|---|
0 | Adelie | Torgersen | 39,1 | 18,7 | 181,0 | 3750,0 | maschio | 2007 |
1 | Adelie | Torgersen | 39,5 | 17,4 | 186,0 | 3800,0 | donna | 2007 |
2 | Adelie | Torgersen | 40,3 | 18.0 | 195,0 | 3250,0 | donna | 2007 |
Il set di dati completo contiene una combinazione di elementi numerici (ad es. bill_depth_mm
), categorici (ad es. island
) e mancanti. A differenza delle reti neurali, le foreste di decisione supportano tutti questi tipi di funzionalità in modo nativo, quindi non è necessario eseguire la codifica one-hot, la normalizzazione o aggiungere la funzionalità is_present.
La seguente cella di codice suddivide il set di dati in un set di addestramento e un set di test:
# 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
Addestramento di alberi decisionali con iperparametri predefiniti
Puoi addestrare la tua prima albero decisionale con l'algoritmo di apprendimento CART (Classification and Regression Trees) (noto anche come learner) senza specificare iperparametri.
Questo perché l'addestratore ydf.CartLearner
fornisce buoni valori predefiniti per gli iperparametri. Scoprirai di più sul funzionamento di questo tipo di modello
più avanti nel corso.
model = ydf.CartLearner(label=label).train(train_dataset)
La chiamata precedente non ha specificato le colonne da utilizzare come funzionalità di input. Pertanto, viene utilizzata ogni colonna del set di addestramento. La chiamata inoltre non ha specificato la semantica (ad esempio numerica, categorica, di testo) delle funzionalità di input. Pertanto, la semantica delle funzionalità viene dedotta automaticamente.
Chiama model.plot_tree()
per visualizzare l'albero decisionale risultante:
model.plot_tree()
In Colab, puoi utilizzare il mouse per visualizzare i dettagli di elementi specifici, come la distribuzione delle classi in ogni nodo.
Figura 17. Un albero decisionale addestrato con gli iperparametri predefiniti.
Colab mostra che la condizione principale contiene 243 esempi. Tuttavia, potresti ricordare che il set di dati di addestramento conteneva 272 esempi. I 29 esempi rimanenti sono stati riservati automaticamente per la convalida e la potatura dell'albero.
La prima condizione testa il valore di bill_depth_mm
. Le tabelle 4 e 5 mostrano la probabilità di diverse specie a seconda del risultato della prima condizione.
Tabella 4. Probabilità di specie diverse se bill_depth_mm ≥
42.3
Specie | Probabilità |
---|---|
Adelie (rosso) | 8% |
Gentoo (blu) | 58% |
Pygoscelide antartico (verde) | 36% |
Tabella 5. Probabilità di specie diverse se
bill_depth_mm < 42.3
Specie | Probabilità |
---|---|
Adelie (rosso) | 97% |
Gentoo (blu) | 2% |
Pygoscelide antartico (verde) | 0% |
bill_depth_mm
è una caratteristica numerica. Pertanto, il valore 42,3 è stato trovato utilizzando l'algoritmo di suddivisione esatta per la classificazione binaria con caratteristiche numeriche.
Se bill_depth_mm ≥ 42.3
è True, esegui ulteriori test per verificare se flipper_length_mm ≥ 207.5
può separare quasi perfettamente i Gentoo dai Gentoo+Adelie.
Il seguente codice fornisce l'accuratezza di addestramento e test del modello:
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, ma possibile, che l'accuratezza del test sia superiore all'accuratezza dell'addestramento. In questo caso, il set di test potrebbe essere diverso dal set di addestramento. Tuttavia, non è questo il caso, in quanto i set di addestramento e di test sono stati suddivisi in modo randomico. Una spiegazione più probabile è che il set di dati di test è molto piccolo (solo 72 esempi), quindi la stima della precisione è incerta.
In pratica, per un set di dati così piccolo, sarebbe preferibile utilizzare la convalida incrociata, in quanto calcola valori delle metriche di valutazione più accurati. Tuttavia, in questo esempio continuiamo con l'addestramento e i test per motivi di semplicità.
Migliorare gli iperparametri del modello
Il modello è un singolo albero decisionale addestrato con valori degli iperparametri predefiniti. Per ottenere previsioni migliori, puoi:
Utilizza un'apprendimento automatico più potente, ad esempio un modello di foresta casuale o di alberi con boosting del gradiente. Questi algoritmi di apprendimento verranno spiegati nella pagina successiva.
Ottimizza l'iperparametro utilizzando le tue osservazioni e le tue intuizioni. La guida al miglioramento del modello può essere utile.
Utilizza l'ottimizzazione degli iperparametri per testare automaticamente un numero elevato di possibili iperparametri.
Poiché non abbiamo ancora visto l'algoritmo di foresta casuale e degli alberi con boosting della curva di apprendimento e poiché il numero di esempi è troppo ridotto per eseguire un'ottimizzazione automatica degli iperparametri, dovrai migliorare manualmente il modello.
L'albero decisionale mostrato sopra è piccolo e la foglia con 61 esempi contiene un insieme di etichette Adelie e Chinstrap. Perché l'algoritmo non ha suddiviso ulteriormente questo abbozzo? Il simbolo "--" può essere visualizzato per due ragioni:
- È possibile che sia stato raggiunto il numero minimo di campioni per riga (
min_examples=5
per impostazione predefinita). - L'albero potrebbe essere stato diviso e poi potato per evitare il sovraadattamento.
Riduci il numero minimo di esempi a 1 e controlla i risultati:
model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()
Figura 18. Un albero decisionale addestrato con min_examples=1.
Il nodo foglia contenente 61 esempi è stato ulteriormente suddiviso più volte.
Per capire se è utile suddividere ulteriormente il nodo, valutiamo la qualità di questo nuovo modello sul set di dati di test:
print(model.evaluate(test_dataset).accuracy)
# >> 0.97222
La qualità del modello è aumentata con un'accuratezza del test passata da 0,9167 a 0,97222. Questa modifica dell'iperparametro è stata una buona idea.
Foresta decisionale precedente
Continuando a migliorare gli iperparametri, potremmo probabilmente raggiungere un'accuratezza perfetta. Tuttavia, anziché questa procedura manuale, possiamo addestrare un modello più potente come una foresta casuale e vedere se funziona meglio.
model = ydf.RandomForestLearner(label=label).train(train_dataset)
print("Test accuracy: ", model.evaluate(test_dataset).accuracy)
# >> Test accuracy: 0.986111
La precisione della foresta casuale è migliore del nostro semplice albero. Nelle prossime pagine scoprirai il motivo.
Utilizzo e limitazioni
Come accennato in precedenza, un singolo albero decisionale ha spesso una qualità inferiore rispetto ai metodi di machine learning moderni come le foreste casuali, gli alberi con boosting del gradiente e le reti neurali. Tuttavia, gli alberi decisionali sono ancora utili nei seguenti casi:
- Come base di riferimento semplice e poco costosa per valutare approcci più complessi.
- Quando esiste un compromesso tra la qualità e l'interpretabilità del modello.
- Come sostituto dell'interpretazione del modello di foreste decisionali, che verrà esaminato più avanti nel corso.