In questa unità, utilizzerai la libreria YDF (Yggdrasil Decision Forest) per addestrare e interpretare un albero decisionale.
Questa unità si ispira al tutorial 🧭 Guida introduttiva di YDF.
Eliminatorie
Prima di studiare il set di dati:
- Crea un nuovo notebook Colab.
- Installa la libreria YDF inserendo ed eseguendo la seguente riga di codice
nel nuovo notebook 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 Palmer Penguins, che contiene misurazioni delle dimensioni di tre specie di pinguini:
- Sottogola
- 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 specie diverse di pinguini. Immagine di @allisonhorst
Il seguente codice chiama una funzione pandas per caricare il set di dati Palmer Penguins in memoria:
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 i primi tre esempi nel set di dati Palmer Penguins:
Tabella 3. I primi tre 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 un mix di funzionalità numeriche (ad esempio bill_depth_mm
),
categoriche (ad esempio island
) e mancanti. A differenza delle reti neurali, le foreste decisionali supportano tutti questi tipi di funzionalità in modo nativo, quindi non devi eseguire la codifica one-hot, la normalizzazione o la funzionalità is_present aggiuntiva.
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 il primo albero decisionale con l'algoritmo di apprendimento CART (Classification and Regression Trees), noto anche come learner, senza specificare alcun iperparametro.
Questo perché lo strumento di apprendimento 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, vengono utilizzate tutte le colonne del set di addestramento. La chiamata non ha specificato neanche 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, ad esempio la distribuzione delle classi in ogni nodo.
Figura 17. Un albero decisionale addestrato con gli iperparametri predefiniti.
Colab mostra che la condizione radice 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 verifica il valore di bill_depth_mm
. Le tabelle 4 e 5 mostrano la probabilità di diverse specie a seconda dell'esito della prima condizione.
Tabella 4. Probabilità di specie diverse se bill_depth_mm ≥
42.3
Specie | Probabilità |
---|---|
Adelie (rosso) | 8% |
Gentoo (blu) | 58% |
Sottogola (verde) | 36% |
Tabella 5. Probabilità di specie diverse se
bill_depth_mm < 42.3
Specie | Probabilità |
---|---|
Adelie (rosso) | 97% |
Gentoo (blu) | 2% |
Sottogola (verde) | 0% |
bill_depth_mm
è una caratteristica numerica. Pertanto, il valore 42,3 è stato trovato
utilizzando l'algoritmo di divisione esatta per la classificazione binaria con caratteristiche numeriche.
Se bill_depth_mm ≥ 42.3
è True, ulteriori test per verificare se
flipper_length_mm ≥ 207.5
può separare quasi perfettamente i
pinguini Gentoo dai pinguini 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 a quella dell'addestramento. In questo caso, il set di test potrebbe differire dal set di addestramento. Tuttavia, in questo caso non è così, poiché la suddivisione di training e test è stata effettuata in modo casuale. Una spiegazione più probabile è che il set di dati di test sia molto piccolo (solo 72 esempi), quindi la stima dell'accuratezza è rumorosa.
In pratica, per un set di dati così piccolo, sarebbe preferibile utilizzare la convalida incrociata, in quanto calcolerebbe valori delle metriche di valutazione più accurati. Tuttavia, in questo esempio continuiamo con un addestramento e un test per semplicità.
Migliorare gli iperparametri del modello
Il modello è un singolo albero decisionale addestrato con valori predefiniti degli iperparametri. Per ottenere previsioni migliori, puoi:
Utilizza un algoritmo di apprendimento più potente, ad esempio foreste casuali o un modello di Gradient Boosted Decision Tree. Questi algoritmi di apprendimento verranno spiegati nella pagina successiva.
Ottimizza l'iperparametro utilizzando le tue osservazioni e la tua intuizione. Può esserti utile la guida al miglioramento del modello.
Utilizza l'ottimizzazione degli iperparametri per testare automaticamente un numero elevato di iperparametri possibili.
Poiché non abbiamo ancora visto l'algoritmo di random forest e gradient boosted trees e poiché il numero di esempi è troppo piccolo per eseguire un'ottimizzazione automatica degli iperparametri, migliorerai manualmente il modello.
L'albero decisionale mostrato sopra è piccolo e la foglia con 61 esempi contiene un mix di etichette Adelie e Chinstrap. Perché l'algoritmo non ha suddiviso ulteriormente questo nodo? Il simbolo "--" può essere visualizzato per due ragioni:
- Potrebbe essere stato raggiunto il numero minimo di campioni per foglia (
min_examples=5
per impostazione predefinita). - L'albero potrebbe essere stato diviso e poi potato per evitare l'overfitting.
Riduci il numero minimo di esempi a 1 e visualizza 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 verificare se la suddivisione del nodo è utile, 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 che è passata da 0,9167 a 0,97222. Questa modifica dell'iperparametro è stata una buona idea.
Anteprima delle foreste decisionali
Continuando a migliorare gli iperparametri, potremmo probabilmente raggiungere una precisione perfetta. Tuttavia, anziché questo processo 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
L'accuratezza della foresta casuale è migliore di quella del nostro semplice albero. Nelle pagine successive scoprirai il perché.
Utilizzo e limitazione
Come accennato in precedenza, un singolo albero decisionale ha spesso una qualità inferiore rispetto ai moderni metodi di machine learning come le foreste casuali, gli alberi potenziati dal gradiente e le reti neurali. Tuttavia, gli alberi decisionali sono ancora utili nei seguenti casi:
- Come base di riferimento semplice ed economica per valutare approcci più complessi.
- Quando esiste un compromesso tra la qualità e l'interpretabilità del modello.
- Come proxy per l'interpretazione del modello di foreste decisionali, che verrà esplorato più avanti nel corso.