Alberi decisionali con gradiente potenziato

Come il bagging e il boosting, il gradient boosting è una metodologia applicata in aggiunta un altro algoritmo di machine learning. Informale, l'incremento del gradiente comporta due tipi di modelli:

  • un valore "debole" di machine learning, che in genere è un albero decisionale.
  • un livello "forte" composto da più modelli di machine learning deboli di grandi dimensioni.

Nell'incremento del gradiente, in ogni passaggio viene addestrato un nuovo modello debole per prevedere "errore" del modello forte attuale (che è chiamato pseudo risposta). Descriveremo "errore" in un secondo momento. Per il momento, supponiamo che tu abbia "errore" la differenza tra la previsione e un'etichetta regressiva. Il modello debole (ovvero l'"errore") è quindi aggiunto al modello forte con un segno negativo per ridurre l'errore un modello efficace.

L'incremento del gradiente è iterativo. Ogni iterazione richiama la seguente formula:

\[ F_{i+1} = F_i - f_i \]

dove:

  • $F_i$ è il modello più efficace nel passaggio $i$.
  • $f_i$ è il modello debole nel passaggio $i$.

Questa operazione si ripete fino a quando non viene soddisfatto un criterio di interruzione, ad esempio un numero numero di iterazioni o se il modello (forte) inizia a superare l'overfitting, misurato su una un set di dati di convalida separato.

Vediamo l'incremento del gradiente su un semplice set di dati di regressione dove:

  • L'obiettivo è prevedere $y$ da $x$.
  • Il modello strong è inizializzato come costante zero: $F_0(x) = 0$.
di Gemini Advanced.
# Simplified example of regressive gradient boosting.

y = ... # the labels
x = ... # the features

strong_model = []
strong_predictions = np.zeros_like(y) # Initially, the strong model is empty.

for i in range(num_iters):

    # Error of the strong model
    error = strong_predictions - y

    # The weak model is a decision tree (see CART chapter)
    # without pruning and a maximum depth of 3.
    weak_model = tfdf.keras.CartModel(
        task=tfdf.keras.Task.REGRESSION,
        validation_ratio=0.0,
        max_depth=3)
    weak_model.fit(x=x, y=error)

    strong_model.append(weak_model)

    weak_predictions = weak_model.predict(x)[:,0]

    strong_predictions -= weak_predictions

Applichiamo questo codice al seguente set di dati:

Un grafico empirico per una caratteristica, x, e la sua etichetta, y. La trama è
serie di seno un po' attenuato
tra le onde.

Figura 25. Un set di dati sintetico regressivo con una caratteristica numerica. di Gemini Advanced.

 

Ecco tre grafici dopo la prima iterazione dell'incremento del gradiente algoritmo:

Tre diagrammi. Il primo grafico mostra la previsione del modello forte, che è
la retta della pendenza pari a 0 e l'intercetta sull'asse y pari a 0. Il secondo grafico mostra l'errore
il modello forte, che è una serie di onde sinusoidali. Il terzo grafico mostra
della previsione del modello debole, che è un insieme quadrato
tra le onde.

Figura 26. Tre grafici dopo la prima iterazione. di Gemini Advanced.

 

Nota quanto segue in merito ai grafici nella Figura 26:

  • Il primo grafico mostra le previsioni del modello forte, che attualmente è sempre 0.
  • Il secondo grafico mostra l'errore, ovvero l'etichetta del modello debole.
  • Il terzo grafico mostra il modello debole.

Il primo modello debole è l'apprendimento di una rappresentazione approssimativa dell'etichetta e, per lo più, si concentra sulla parte sinistra dello spazio delle caratteristiche (la parte con la maggiore variazione, e quindi il massimo dell'errore per il modello sempre errato).

Di seguito sono riportati gli stessi grafici per un'altra iterazione dell'algoritmo:

Tre diagrammi. Il primo grafico mostra la previsione del modello forte, che è
un inverso del grafico della previsione del modello debole rispetto alla precedente
Figura. Il secondo grafico mostra l'errore del modello forte, che rappresenta un errore
insieme di onde sinusoidali. Il terzo grafico mostra la previsione del modello debole, che
è un paio di quadrati
tra le onde.

Figura 27. Tre grafici dopo la seconda iterazione. di Gemini Advanced.

 

Nota quanto segue in merito ai grafici nella Figura 27:

  • Il modello "Strong" ora contiene la previsione del modello debole. nell'iterazione precedente.
  • Il nuovo errore del modello forte è leggermente inferiore.
  • La nuova previsione del modello debole si concentra ora sulla parte giusta del delle caratteristiche di Google.

Eseguiamo l'algoritmo per altre 8 iterazioni:

I grafici mostrano che il modello forte si avvicina gradualmente ai dati di fatto
mentre la previsione del modello debole diventa gradualmente
indebolimento.

Figura 28. Tre grafici dopo la terza e la decima iterazione. di Gemini Advanced.

 

Nella Figura 28, nota che la previsione di un modello solido inizia ad assomigliare il grafico del set di dati.

Queste figure illustrano l'algoritmo di potenziamento del gradiente utilizzando gli alberi decisionali come studenti deboli. Questa combinazione è chiamata alberi decisionali ad alto gradiente.

I grafici precedenti suggeriscono l'essenza dell'aumento del gradiente. Tuttavia, questo nell'esempio mancano le seguenti due operazioni reali:

  • Restringimento
  • Ottimizzazione dei valori foglia con un passaggio del metodo di Newton
di Gemini Advanced.

Restringimento

Il modello debole $f_i$ viene moltiplicato per un valore piccolo $\nu$ (ad esempio, $\nu = 0,1$) prima di essere aggiunti al modello forte $F_i$. Questo piccolo valore viene chiamato lo shrinkage. In altre parole, invece di ogni iterazione che utilizza il seguente formula:

\[ F_{i+1} = F_i - f_i \]

Ogni iterazione utilizza la seguente formula:

\[ F_{i+1} = F_i - \nu f_i \]

La riduzione nell'incremento del gradiente è analoga al tasso di apprendimento nelle reti neurali. La riduzione controlla la velocità di apprendimento del modello forte, aiutandoti a limitare l'overfitting. In altre parole, un valore di shrinkage più vicino a 0,0 riduce ulteriormente l'overfitting rispetto a un valore di restringimento più vicino a 1,0.

Nel codice riportato sopra, la riduzione sarebbe implementata come segue:

shrinkage = 0.1   # 0.1 is a common shrinkage value.
strong_predictions -= shrinkage * weak_predictions