• Home
  • Chi sono
  • Risorse
  • Contatti
  • Approfondimenti
  • Cerca nel sito

Lorenzo Govoni

Business e Tecnologia

  • Big Data
  • Business
  • Excel
  • Intelligenza Artificiale

Gradient Boosting per problemi di classificazione

Gradient Boosting

La famiglia degli algoritmi Gradient Boosting rientra in una serie di potenti algoritmi che possono essere utilizzati sia per le attività di classificazione che di regressione.

Chiamati anche Gradient Boosting Machine (GBM), sono stati utilizzati in applicazioni come la classificazione del testo, in sperimentazioni per classificare azioni fisiche tramite Elettromiografia (o EMG, una tecnica di medicina elettrodiagnostica per la valutazione e la registrazione dell’attività elettrica prodotta dai muscoli scheletrici, per maggiori informazioni vedi la pagina di Wikipedia), e per mappare con un modello di regressione tali segnali EMG su una mano robotica.

In questa sede vediamo un esempio di come funziona questo tipo di algoritmo per un problema di classificazione.

 

Come funziona il Gradient Boosting?

Nell’articolo precedente abbiamo visto un esempio di funzionamento di questo algoritmo per un problema di regressione.

Di fatto, il Gradient Boosting rappresenta un modello ensemble che si basa su una combinazione di singoli modelli semplici (detti weak learner) che insieme creano un nuovo modello più potente (chiamato strong learner), dove quest’ultimo risulta più efficace dei singoli weak learner presi singolarmente.

In ogni ciclo di allenamento, o iterazione, il weak learner viene costruito e le sue previsioni vengono confrontate con il risultato corretto che ci aspettiamo.

La distanza tra osservazione e previsione rappresenta il tasso di errore del nostro modello.

Questi errori vengono definiti utilizzando una funzione di perdita o loss function. Esistono diverse funzioni di perdita che si possono utilizzare: per i problemi di regressione una tra le più utilizzate è il Squared Error (errore quadratico), mentre per i problemi di classificazione si può utilizzare una trasformazione negativa della log likelihood o funzione di verosimiglianza (per maggiori informazioni vedi il video di StatQuest che spiega l’utilizzo della matematica nel Gradient Boosting).

Lo scopo dell’algoritmo consiste nel ridurre al massimo questa funzione di perdita, tramite uno strumento che viene chiamato “gradiente” (ed è qua che si può comprendere il motivo della prima parte del nome dell’algoritmo), il quale fondamentalmente rappresenta la derivata parziale della funzione di perdita.

In altre parole, il gradiente descrive la pendenza della loss function (di conseguenza possiamo capire che la loss function, indipendentemente da come viene definita, deve essere differenziabile per poter applicare l’algoritmo) e che può essere utilizzato per trovare la direzione in cui modificare i parametri del modello, al fine di ridurre l’errore alla prossima iterazione.

 

Principio di funzionamento

Vediamo ora di vedere come funziona l’algoritmo Gradient Boosting in 8 step, per un problema di classificazione binaria.

Ipotizziamo di voler prevedere se una banconota americana sia vera, quindi autentica, oppure falsa, dato una serie di misure prese da delle fotografie.

Per farlo ci avvaliamo del “Banknote Dataset”, un dataset composto da 4 caratteristiche di input e la variabile target per la classificazione:

  • Varianza: varianza dell’immagine trasformata da Wavelet (valore continuo);
  • Asimmetria: asimmetria dell’immagine trasformata da Wavelet (valore continuo);
  • Curtosi: Curtosi dell’immagine trasformata da Wavelet (valore continuo);
  • Entropia: entropia dell’immagine (valore continuo);
  • Classe: 0 se la banconota risulta essere autentica, 1 se falsificata.

Supponiamo per semplicità di voler prevedere l’autenticità o meno di questi 7 record (facenti parte del set di addestramento):

 

Step 1: Calcola la previsione iniziale tramite il log(odds)

Come primo passo dobbiamo calcolare la funzione log (odds), che come visto dall’articolo della regressione logistica, rappresenta il logaritmo della probabilità di successo / probabilità di fallimento di un certo evento.

Data ad esempio una probabilità dell’evento (p) e la probabilità del non evento (1-p), l’odds rappresenta il rapporto tra questi due fattori:

odds = p/(1-p)

Nel nostro problema, per calcolarla eseguiamo il logaritmo delle classi positive su quelle negative, in questo modo:

Avvalendoci della funzione logistica, possiamo rappresentare il log(odds) in termini di probabilità:

Siccome tale probabilità è superiore a 0,5 possiamo classificare i record del training dataset come immagine non autentica, perché rientranti nella classe 1. Al contrario se avessi ottenuto una probabilità inferiore a 0,5 avremmo classificato i record del training set come immagine autentica, rientranti nella classe 0.

Come valore di soglia si potrebbero usare anche altri valori, per semplicità si è scelto 0,5. Ovviamente è un po’ grossolana come probabilità, in quanto abbiamo anche fotografie di banconote autentiche.

 

Step 2: Calcola i residui

Possiamo calcolare quanto sono scarse le precedenti previsioni calcolando i residui, ossia la differenza tra i valori osservati e quelli previsti.

Quindi 0 o 1 sono i valori osservati, mentre il valore previsto è quello trovato al precedente punto: 0,57143.

Ad esempio per la prima osservazione avremo:

Residuo1 = 0 – 0,57143 = – 0,57143

E così via per gli altri record dell’esempio:

 

Step 3: Costruisci un albero di regressione

Successivamente, costruiamo un albero con l’obiettivo di prevedere i residui. In altre parole, ogni foglia conterrà una previsione sul valore del residuo (non sull’etichetta desiderata).

Se dovessimo calcolare semplicemente l’albero di regressione ci troveremmo in una situazione simile alla seguente:

Il precedente albero, che non calcola i residui, è composto da 2 nodi e 3 foglie. I nodi si riconoscono dalla caratteristica inclusa nella prima riga (Curtosi e Varianza). L’informazione mse indica l’errore quadratico medio (mean squared error, mse), samples il numero di campioni che sono suddivisi nell’albero, e value indica il valore di autenticità della banconota (0 autentica, 1 falsa).

Quest’ultimo attributo è pari a 0 nelle foglie se la banconota è autentica, 1 se è falsa.

A noi però serve il valore dei residui di ogni foglia. Come li calcoliamo?

Semplice: posizionando i valori dei residui trovati al punto precedente all’interno delle foglie cui appartengono. In questo caso però non facciamo la media dei residui se troviamo più valori all’interno come possiamo vedere dal nodo 1 e 2, ma li segniamo uno di fianco all’altro.

In sostanza avremo:

 

Step 4: Calcola il valore finale di ogni foglia

Per ogni foglia dobbiamo trovare un valore finale da utilizzare per calcolare la nuova variabile decisionale.

Non possiamo operare come visto per il Gradient Boosting per problemi di regressione, perché la probabilità iniziale dipende dal log(odds), e le varie foglie derivano da una probabilità. Quindi non possiamo sommarle tra loro per trovare una nuova previsione log(odds) senza una sorta di trasformazione.

Quando si usa il Gradient Boosting per problemi di classificazione, la formula più comune che viene utilizzata per calcolare il valore finale di ogni foglia è la seguente:

A numeratore si sommano tutti i residui per la foglia di interesse, e a denominatore si ha la somma della precedente probabilità prevista per ogni residuo moltiplicata per 1 meno lo stesso valore previsto in precedenza.

Alla prima iterazione la precedente probabilità sarà uguale per tutti i residui. Dalle successive iterazioni tale valore cambierà.

Ad esempio per la prima foglia composta da 3 residui avremo:

Abbiamo così calcolato il valore finale di tutte le foglie dell’albero della prima iterazione.

 

Step 5: Utilizza il learning rate e prevedi la nuova variabile decisionale

Siamo pronti per eseguire una nuova previsione utilizzando i valori finali di foglia appena trovati. Ognuna di essa sarà influenzata da un learning rate (un numero maggiore di 0 e minore o uguale a 1): in questa fase scegliamo un valore pari a 0,25.

La nuova previsione sarà pari a:

Log(odds) = Precedente previsione + learning rate x valore finale foglia

Ciò significa ad esempio per il primo record, rientrante nella foglia numero 1, avremo:

Log(odds) = 0,57143 + 0,25 * (-2,333) = -0,0119

Ora questa log(odds) come visto nel punto 1 va calcolata in termini di probabilità, quindi riutilizziamo la funzione logistica:

Abbiamo ottenuto un nuovo miglioramento perché il primo record appartiene alla classe 0 (banconota autentica) pertanto 0,4970 è minore rispetto a 0,57143.

Riassumiamo nella seguente tabella i risultati ottenuti anche dagli altri record:

La colonna foglia sta ad indicare in che foglia il record è stato classificato dall’albero decisionale creato al punto 3.

 

Step 6: Calcola i nuovi residui

Ora siamo pronti per calcolare i nuovi residui.

0 o 1 rappresentano sempre i valori osservati, mentre il valore previsto è quello trovato al precedente punto: 0,49702 o 0,73281.

Ad esempio per la prima osservazione avremo:

Residuo1 = 0 – 0,49702 = – 0,49702

E così via per gli altri record dell’esempio:

 

Step 7: Ripeti i passaggi da 3 a 6 fino a quando il numero di iterazioni corrisponde al numero specificato dal parametro (ovvero il numero di stimatori)

Ripetendo gli step da 3 a 6 si riducono man mano, ad ogni iterazione i residui, finchè non ci si avvicina al livello di previsione iniziale del problema.

 

Step 8: una volta addestrato, utilizzare tutti gli alberi dell’insieme per effettuare una previsione finale sul valore della variabile target

La previsione finale sarà uguale alla probabilità calcolata nel primo passaggio, oltre a tutti i valori finali di foglia previsti dagli alberi che compongono la foresta moltiplicati per il tasso di apprendimento.

Quindi se si vuole prevedere l’autenticità di una banconota, la cui immagine ha varianza e curtosi minori di 1 si otterrà:

log(odds) finale = 0,57143 + 0,25 * (1,75) + …

Al posto dei puntini ci saranno i valori del learning rate moltiplicati per i valori finali delle foglie trovate dai nuovi alberi di regressione. Questo tante volte, quante sono le iterazioni che si sono ripetute.

Dopodichè la previsione finale si calcola in termini di probabilità:

E se la probabilità finale sarà maggiore di 0,5 la banconota sarà considerata falsa, altrimenti autentica.

Esempio in Python

Vediamo di calcolare in python l’esempio proposto, relativo al Banknote Dataset, utilizzando l’intero dataset.

Il dataset è uno dei dataset standard di machine learning, e che puoi trovare nel repository UCI Machine learning qua.

Composto da 1372 righe, punta a prevedere se una banconota risulta autentica oppure falsa, valutandone da un’immagine la varianza, la curtosi, l’asimmetria e l’entropia.

 

Importare le librerie

Importiamo le librerie necessarie per eseguire l’algoritmo Gradient Boosting. Tra di esse abbiamo Pandas, una delle librerie fondamentali per python nel machine learning.

In aggiunta importiamo:

  • Train Test Split: la funzione per suddividere il dataset in set di addestramento e set di test;
  • GradientBoostingClassifier: la classe che ci permette di creare il modello e utilizzare l’algoritmo Gradient Boosting;
  • Accuracy score, classification report e confusion matrix: le metriche per valutare l’algoritmo.

 

Importare il dataset

Carichiamo il dataset, utilizzando il metodo read_excel (siccome il file è salvato in tale formato). I due puntini stanno ad indicare che si deve indicare il percorso corretto dove è salvato il file, e sheet_name indica il nome del foglio Excel che si vuole caricare:

I dati appena creati li inseriamo in un dataframe di pandas chiamato df e poi li visualizziamo:

Visualizziamo anche il tipo di dato che hanno le caratteristiche e la variabile target:

 

Test Train Split

Essendo tutte le caratteristiche di formato numerico e con valori pressochè vicini tra loro, non ci interessa eseguire tecniche di preprocessamento.

Non ci resta che associare le caratteristiche alla variabile X, e alla y la variabile target:

Dopodichè suddividiamo il dataset in set di dati di test e di allenamento. In questo caso consideriamo il 30% del set di dati come dato di test, mentre l’70% sarà il set di dati di addestramento.

 

Creazione del modello

Siamo pronti per costruire ed adattare il modello.

Definiamo un learning rate pari a 0,05; 0,075; 0,1; 0,25; 0,5; 0,75; 1 e utilizziamo un ciclo for per vedere quale di questi learning rate ci dà i risultati migliori.

Ad ogni iterazione adattiamo ai dati il Gradient Boosting Classifier. Utilizziamo 100 stimatori, alberi a due livelli di profondità al massimo e con almeno 3 foglie.

Digitiamo le seguenti righe di codice:

Per ogni valore di learning rate definito visualizziamo poi l’accuratezza sul set di training e sul set di test:

Uno dei risultati migliori lo abbiamo con un learning rate pari a 0,25. Non scegliamo valori più alti per evitare di ottenere una varianza più alta, e quindi rischi di overfitting più elevati.

Scegliamo quindi il learning rate pari a 0,25 e riadattiamo i dati al modello. Poi eseguiamo una previsione sui dati di test:

 

Valutazione del modello

Non ci resta che valutare l’accuratezza del modello con la previsione eseguita:

Otteniamo un’accuratezza prossima al 100%:

Vediamo i risultati della matrice di confusione:

Che genera solo un errore sui 412 risultati previsti per il set di test:

Infine visualizziamo il report di classificazione:

Possiamo concludere che:

  • Precision: su 216 previsioni positive (0), l’algoritmo Gradient Bosting ha individuato il 100% (216/216) delle istanze come positive. Per le 196 (195+1) istanze negative (1), l’algoritmo ne ha individuato correttamente il 99% (195/196).

  • Recall: per tutte le istanze che erano effettivamente positive, quasi il 100% (216/(216+1)), in quanto tale valore è arrotondato, è stata classificata correttamente per i 0, mentre tale percentuale raggiunge il 100% (195/(195+0)) se si tratta dei no.

  • F1-score: è una media armonica ponderata delle due precedenti metriche, come visto nell’articolo dedicato alla matrice di confusione.

 

Conclusione

In questo articolo abbiamo visto un esempio di funzionamento dell’algoritmo Gradient Boosting per problemi di classificazione. Dopodichè si è eseguito l’algoritmo utilizzando il linguaggio Python.

E’ un algoritmo potente che permette di raggiungere elevati livelli di accuratezza dei modelli che vengono addestrati.

Da deboli weak learner, si è ottenuto un forte strong learner in grado di prevedere quasi il 100% dell’autenticità o meno delle banconote valutandone 4 aspetti da una fotografia (la varianza, la curtosi, l’asimmetria e l’entropia).

Maggiori informazioni in merito a quest’algoritmo li puoi trovare qua:

  • Pdf dell’università di Monaco che ne spiega il funzionamento;
  • Basi del GBM;
  • Breve video sul funzionamento da parte di Coursera. 
  • Algoritmo Gradient Boosting per problemi di regressione
    Algoritmo Gradient Boosting per problemi di regressione
  • Text mining: il processo di estrazione del testo
    Text mining: il processo di estrazione del testo
  • Data Visualization: come rappresentare correttamente i dati
    Data Visualization: come rappresentare correttamente i dati
  • Muovere i primi passi in Jupyter Notebook
    Muovere i primi passi in Jupyter Notebook
Share
Pin1
Share
Tweet

Intelligenza Artificiale Albero Decisionale, Machine Learning

  • Home
  • Archivio
  • Risorse
  • Newsletter
  • Cerca nel sito

Copyright © 2021 · Lorenzo Govoni - Privacy Policy