Creare un albero decisionale

In questa unità, utilizzerai YDF (Yggdrasil) Decision Forest) addestra e interpreta un albero decisionale.

Questa unità si ispira 🧭 Guida introduttiva di YDF tutorial di Google Cloud.

Eliminatorie

Prima di studiare il set di dati, segui questi passaggi:

  1. Crea un nuovo Colab un blocco note personalizzato.
  2. Installa la libreria YDF inserendo ed eseguendo la seguente riga di codice nel nuovo blocco note di Colab:
    !pip install ydf -U
    
  3. Importa le seguenti librerie:
    import ydf
    import numpy as np
    import pandas as pd
    

Set di dati Palmer Penguins

Questo Colab utilizza Set di dati Palmer Penguins, che contiene le misure di tre dimensioni specie di pinguini:

  • Sottogola
  • Gentoo
  • Adelie

Si tratta di un problema di classificazione, l'obiettivo è prevedere la specie pinguino sulla base dei dati del set di dati Penguins di Palmer. Ecco i pinguini:

Tre diversi pinguini
specie.

Figura 16. Tre diverse specie di pinguini. Immagine di @allisonhorst

 

Il seguente codice chiama un panda 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 3 esempi per i pinguini di Palmer set di dati:

Tabella 3. I primi 3 esempi in Palmer Penguins di Gemini Advanced.

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 valori numerici (ad esempio, bill_depth_mm), categorico (ad esempio, island) e caratteristiche mancanti. A differenza dei modelli di grandi dimensioni, le foreste decisionali supportano tutti questi tipi di funzionalità in modo nativo, non è necessario eseguire la codifica one-hot, la normalizzazione o la caratteristica is_present aggiuntiva.

La seguente cella di codice suddivide il set di dati in un set di addestramento e imposta:

# 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 tuo primo albero decisionale con il CART (classificazione e l'algoritmo di apprendimento "Alberi di regressione" (ovvero studente) senza specificare e regolare gli iperparametri. Questo perché lo studente ydf.CartLearner fornisce delle buone impostazioni predefinite i valori degli iperparametri. Scoprirai di più su come funziona questo tipo di modello più avanti in questo corso.

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

La chiamata precedente non specificava le colonne da utilizzare come caratteristiche di input. Pertanto, vengono utilizzate tutte le colonne del set di addestramento. La chiamata inoltre non ha specificato la semantica (ad esempio numerica, categorica, di testo) delle caratteristiche di input. Pertanto, la semantica delle caratteristiche viene dedotta automaticamente.

Richiama model.plot_tree() per visualizzare la struttura decisionale risultante:

model.plot_tree()

In Colab, puoi usare il mouse per visualizzare i dettagli di elementi specifici come come distribuzione delle classi in ogni nodo.

Un albero decisionale addestrato con modelli
e regolare gli iperparametri.

Figura 17. Un albero decisionale addestrato con iperparametri predefiniti. di Gemini Advanced.

Colab mostra che la condizione principale contiene 243 esempi. Tuttavia, ricorda che il set di dati di addestramento conteneva 272 esempi. I restanti 29 di esempi sono stati riservati automaticamente per la convalida e la cancellazione ad albero.

La prima condizione verifica il valore bill_depth_mm. Le tabelle 4 e 5 mostrano probabilità di specie diverse in base all'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. È stato quindi trovato il valore 42, 3 utilizzando la suddivisione esatta per la classificazione binaria con caratteristiche.

Se bill_depth_mm ≥ 42.3 è impostato su True, eseguirai ulteriori test per capire se il valore flipper_length_mm ≥ 207.5 è in grado di separare quasi perfettamente Gentoos e dei Gentoos+Adelie.

Il seguente codice fornisce l'addestramento e l'accuratezza del 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 la precisione del test sia superiore all'addestramento la precisione. In questo caso, il set di test potrebbe essere diverso dal set di addestramento. Tuttavia, questo non è il caso, in quanto il modello train & il test è stato suddiviso in modo casuale. Una spiegazione più probabile è che il set di dati di test è molto piccolo (solo 72 esempi), pertanto la stima dell'accuratezza è poco chiara.

In pratica, per un set di dati così piccolo, usando convalida incrociata è preferibile, perché consente di calcolare valori delle metriche di valutazione più precisi. Tuttavia, in questo esempio, continuiamo con un corso di test per motivi di la semplicità.

Migliorare gli iperparametri del modello

Il modello è un singolo albero decisionale addestrato con un iperparametro predefinito e i relativi valori. Per ottenere previsioni migliori, puoi:

  1. Serviti di uno studente più potente, come foresta casuale o alberi con gradiente un modello di machine learning. Questi algoritmi di apprendimento saranno spiegati nella prossima pagina.

  2. Ottimizza l'iperparametro utilizzando osservazioni e intuitazioni. La guida al miglioramento del modello può essere utile.

  3. Utilizza l'ottimizzazione degli iperparametri. per testare automaticamente un numero elevato di iperparametri possibili.

Poiché non abbiamo ancora visto la foresta casuale e gli alberi con gradiente dell'algoritmo e poiché il numero di esempi è troppo ridotto per eseguire una l'ottimizzazione degli iperparametri migliorerà manualmente il modello.

L'albero decisionale mostrato sopra è piccolo e l'esempio di foglia con 61 contiene un un mix di etichette Adelie e Chinstrap. Perché l'algoritmo non ha diviso questa foglia più lontano? Il simbolo "--" può essere visualizzato per due ragioni:

  • Il numero minimo di campioni per foglia (min_examples=5 per impostazione predefinita) può avere raggiunto.
  • L'albero potrebbe essere stato diviso e poi potato per evitare l'overfitting.

Riduci il numero minimo di esempi a 1 e osserva i risultati:

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

Un albero decisionale addestrato con
min_examples=1.

Figura 18. Un albero decisionale addestrato con min_examples=1. di Gemini Advanced.

 

Il nodo foglia contenente 61 esempi è stato ulteriormente suddiviso volte.

Per vedere se è importante dividere ulteriormente il nodo, valutiamo la qualità questo nuovo modello sul set di dati di test:

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

La qualità del modello è aumentata con una precisione di test che va da 0,9167 a 0,97222. Questa modifica dell'iperparametro è stata una buona idea.

Precedente di una foresta decisionale

Continuando a migliorare gli iperparametri, potremmo probabilmente raggiungere un la precisione. Tuttavia, invece di questa procedura manuale, possiamo addestrare un modello ad esempio una foresta casuale per vedere se funziona meglio.

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

La precisione della foresta casuale è migliore di quella del nostro semplice albero. Potrai scopri il perché nelle prossime pagine.

Utilizzo e limitazioni

Come già accennato, un singolo albero decisionale spesso ha una qualità inferiore rispetto metodi di machine learning come foreste casuali, alberi con gradiente d'impatto e reti. Tuttavia, le strutture decisionali sono comunque utili nei seguenti casi:

  • Come base semplice ed economica per la valutazione di approcci più complessi.
  • Quando c'è un compromesso tra qualità e interpretabilità del modello.
  • Come sostituto dell'interpretazione del modello delle foreste decisionali, che più avanti nel corso.