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

Lorenzo Govoni

Business e Tecnologia

  • Big Data
  • Business
  • Excel
  • Intelligenza Artificiale

XGBoost in python per problemi di regressione

XGBoost in python

L’algoritmo XGBoost è diventato uno strumento molto potente e molto popolare nell’apprendimento automatico. Questa libreria contiene a sua volta una varietà di funzioni e metodi, che di solito vengono forniti con il proprio set di iperparametri.

Essi vengono combinati insieme in un unico pacchetto. Possiamo modellare varie attività di classificazione, o regressione utilizzando alberi e funzioni lineari, applicando diversi schemi di regolarizzazione e settando molti parametri per risolvere questi problemi in modo efficace.

Prima di vedere un esempio di come usare l’XGBoost in python, vediamo alcuni di questi parametri fondamentali. Se non hai mai sentito parlare di questo algoritmo, o non hai idea di cosa sia, prima di continuare ti consiglio di leggere questo post.

 

Parametri XGBoost

I parametri generali sono stati divisi in 3 categorie dagli autori di XGBoost. Abbiamo:

  1. Parametri generali: definiscono una guida al funzionamento generale. Ci aiutano a definire che tipo di modello utilizzare (se alberi decisionali o funzioni lineari. Nel primo caso, il modello sarà costituito da un insieme di alberi. Nel secondo, avremo una somma ponderata delle funzioni lineari).

  2. Parametri booster: illustrano come dobbiamo costruire il modello scelto al punto 1 ad ogni iterazione (definito booster). Sono i parametri che approfondiremo in questo articolo prima di vedere un esempio.

  3. Parametri dell’attività di apprendimento: aiutano a definire la funzione loss e i parametri di valutazione dell’algoritmo a seconda della variabile target da prevedere. Alcune delle opzioni disponibili includono regressione, regressione logistica, binaria e multi classificazione. Questa opzione consente di applicare i modelli XGBoost a diversi tipi di casi d’uso.

    Il valore predefinito per problemi di regressione è “reg: squarederror” (precedentemente chiamato “reg: linear”); mentre per quelli di classificazione è “binary:logistic”, ossia la regressione logistica per la classificazione binaria.

Tengo a precisare che l’obiettivo è indipendente dalla scelta del booster. Gli alberi decisionali non sono solo in grado di eseguire compiti di classificazione, ma anche di prevedere variabili continue con una certa granularità per l’intervallo di input dei dati utilizzato nell’addestramento.

Pertanto, l’obiettivo è sempre determinato dall’attività di modellazione a portata di mano, mentre le due scelte booster comuni possono essere valide per lo stesso problema.

Parametri Booster

In questa sede prenderò in considerazione solo il booster di alberi (gbtree), in quanto maggiormente utilizzato. Tra i parametri più utilizzati da questo modello abbiamo:

Eta

Rappresenta il Learning rate. Assume un’impostazione predefinita pari 0,3, anche se spesso vengono utilizzati valori più bassi inclusi nel range 0,01-0,2.

Il parametro ETA controlla il tasso di apprendimento. Corrisponde al restringimento dei pesi associati alle funzioni dopo ogni round: in altre parole definisce la quantità di “correzione” che facciamo ad ogni passaggio.

In pratica, avere un eta più basso rende il nostro modello più robusto al sovradimensionamento, quindi, di solito, più basso è il tasso di apprendimento, e meglio è. Ma con un eta più basso, abbiamo bisogno di più iterazioni, che richiedono più tempo per adattare il modello ai dati, a volte solo per miglioramenti marginali.

Gamma

Un nodo viene diviso solo quando la divisione risultante dà una riduzione positiva della funzione di perdita. Gamma specifica la riduzione di perdita minima richiesta per effettuare una divisione.

Rende l’algoritmo conservativo. I valori possono variare in base alla funzione di perdita e devono essere regolati caso per caso.

Infatti, non c’è un valore predefinito per gamma, che può cambiare a seconda del tipo di dati da analizzare e dagli altri parametri impostati (per maggiori informazioni vedi questo articolo).

Max Depth

Max_depth è il numero massimo di nodi consentiti dalla radice alla foglia più lontana di un albero. Di default questo valore è settato a sei.

Gli alberi più profondi possono modellare relazioni più complesse aggiungendo più nodi, ma man mano che approfondiamo, le divisioni diventano meno rilevanti e talvolta sono solo dovute al rumore, causando un eccesso di adattamento del modello.

Min_child_weight

È il peso minimo (o il numero di campioni se ognuno di essi ha un peso di 1) richiesto per creare un nuovo nodo nella struttura. Un min_child_weight più piccolo consente all’algoritmo di creare nodi foglia che corrispondono a un minor numero di campioni, consentendo in tal modo alberi più complessi, ma ancora più probabilità di adattarsi eccessivamente.

Max_delta_step

Rappresenta il passo massimo che viene consentito a ogni valore di output per ogni foglia. Se il valore è impostato su 0, significa che non ci sono vincoli. Se è impostato su un valore positivo, può aiutare a rendere il passaggio di aggiornamento più conservativo.

Di solito questo parametro non è necessario, ma potrebbe aiutare nella regressione logistica quando la classe è estremamente squilibrata. Impostarlo su un valore compreso tra 1 e 10 potrebbe aiutare a controllare l’aggiornamento.

Subsample

Subsample corrisponde alla frazione di osservazioni (per intenderci le righe del set di dati) da utilizzare per addestrare ciascun albero. Per impostazione predefinita, è impostato su 1, il che significa che vengono considerate tutte le righe.

Impostarlo a 0.5 significa considerare solo metà di esse.

Colsample_bytree

Corrisponde alla frazione di caratteristiche (le colonne) da utilizzare per addestrare ciascun albero. Per impostazione predefinita, è impostato su 1, il che significa che utilizzeremo tutte le funzionalità del dataset.

Questo parametro, insieme al precedente, controlla il campionamento del set di dati che viene eseguito ad ogni round dell’algoritmo.

Invece di utilizzare ogni volta l’intero set di training, possiamo costruire un albero su dati leggermente diversi ad ogni passo, il che rende meno probabile il sovradimensionamento di un singolo campione o caratteristica.

Colsample_bylevel

Rappresenta la frazione di caratteristiche (selezionate casualmente) che verranno utilizzate in ciascun nodo per addestrare ciascun albero.

Per impostazione predefinita, è impostato su 1, il che significa che utilizzeremo tutte le funzionalità.

Reg_alpha

Rappresenta il termine di regolarizzazione L1 (Regressione Lasso). Di default è settato a 0.

Può essere utilizzato in caso elevata dimensionalità in modo che l’algoritmo funzioni più velocemente quando implementato.

Reg_lambda

Rappresenta il termine di regolarizzazione L2 (Regressione Ridge). Di default è settato a 1. Quando aumentato, rende il modello più conservativo, perché ne riduce la varianza del modello stesso.

 

Esempio di XGBoost in Python

Vediamo ora un esempio di applicazione della libreria XGBoost in Python. Tratteremo di un problema di regressione, il cui dataset lo puoi trovare a questo link. 

Il problema tratta un set di dati composto da 53 funzionalità che descrivono un post su Facebook: il numero di mi piace sulla pagina in cui è stato pubblicato, la categoria della pagina, l’ora e il giorno in cui è stato pubblicato, ecc.

L’ultima colonna, la cinquantaquattresima, è il target: il numero di commenti che il post ha ricevuto. L’obiettivo di questo esempio è di provare a prevedere il numero di commenti che un nuovo post riceverà in base a tutte le caratteristiche fornite.

Esistono 5 varianti del dataset di training, qui si è scelta la numero 2 (la risoluzione della prima versione sempre tramite algoritmo XGBoost in python, invece la puoi trovare a quest’altro link, dove viene mostrato un altro metodo di risoluzione).

Nell’esempio proposto sono stati aggiunti i nomi delle caratteristiche e della variabile target, in quanto non presenti dal file scaricato.

 

Installare la libreria XGBoost in Python

Prima di iniziare dobbiamo installare la libreria XGBoost, in quanto inizialmente non è presente in Anaconda (uno degli ambienti di lavoro in python più utilizzati per il machine learning).

Per farlo apriamo il prompt di Anaconda, digitando Anaconda Prompt dalla barra di ricerca.

Digitare il seguente comando:

conda install -c anaconda py-xgboost

Alla richiesta di conferma digitare y (per Yes).

Dopodichè per verificare che l’installazione della libreria XGBoost in python è andata a buon fine, digitiamo python dal promt di Anaconda.

E digitiamo il comando: import xgboost as xgb

Se non otteniamo errori, l’installazione della libreria è andata a buon fine.

Importare le librerie

Siamo pronti per importare le librerie necessarie all’esecuzione dell’algoritmo.

Tra di esse abbiamo:

  • Pandas: la libreria fondamentale per eseguire l’analisi dei dati e importare i set di dati;
  • Train_Test_Split: per suddividere il dataset in set di addestramento e set di test;
  • Xgboost: la libreria per poter utilizzare l’algoritmo XGBoost in python;
  • Plot_importance: la funzione per rappresentare l’importanza delle caratteristiche su un grafico;
  • GridSearchCV: una delle classi di sklearn che permette di trovare i migliori parametri di uno stimatore;
  • Le metriche MAE e Explained_variance_score: la prima esprime il valore medio assoluto, la seconda la varianza spiegata ottenuta dal problema di regressione.

 

Caricare il dataset

Carichiamo il dataset, utilizzando il metodo read_csv (siccome il file è salvato in tale formato). I due puntini stanno ad indicare che si deve indicare il percorso corretto dove è salvato il file:

Visualizziamo il dataset importato:

Vediamo anche quante righe appartengono al nostro set di dati importato:

Tutte le caratteristiche sono di tipo intero o float, e non esistono dati mancanti. Non vengono tanto meno eseguite attività di preprocessamento, perché non necessarie al nostro scopo.

 

Test train split

Al fine di valutare le prestazioni del modello, dobbiamo addestrarlo su un campione di dati e testarlo su un altro. Possiamo farlo facilmente con la funzione train_test_split di scikit-learn. Innanzitutto, estraiamo le caratteristiche (X) e la variabile target (y) dal set di dati:

Dopodichè conserviamo il 70% del set di dati per l’addestramento e il 30% per i test:

 

Costruire il modello

Arrivati a questo punto non ci resta che costruire il modello XGBoost.

Per il momento non passiamo nessun parametro al modello (se non l’obiettivo di ‘reg:squarederror’, che indica la funzione di perdita da utilizzare), ma lo faremo in una seconda fase, per vedere le differenze. Ci avvaliamo della classe XGBRegressor per costruire il modello (per un problema di classificazione allo stesso modo avremmo utilizzato la classe XGBClassifier):

Adattiamo ora l’XGBRegressor ai dati di addestramento:

E vediamo i parametri utilizzati di default:

Vediamo le dieci caratteristiche che sono state utilizzate maggiormente come suddivisione degli alberi dall’algoritmo con il metodo plot_importance():

Eseguiamo la previsione sul set di test, arrotondata all’intero ed estrapoliamo il valore assoluto per sistemare qualche previsione negativa, e valutiamo i risultati:

Come risultato si è deciso di guardare l’explained variance score, o il risultato della spiegazione della varianza e l’errore medio assoluto.

Il primo viene utilizzato per misurare la discrepanza tra un modello e i dati effettivi. In altre parole, è la parte della varianza totale del modello che è spiegata da fattori che sono effettivamente presenti e non sono dovuti alla varianza degli errori. Può assumere un valore tra 0 e 1 e più alto è, meglio è.

Il secondo, come afferma il suo nome, rappresenta la media assoluta degli errori e al contrario del precedente è migliore per valori più prossimi allo zero.

 

Miglioramento dei parametri dell’XGBoost

Proviamo ora ad effettuare un’ottimizzazione dei parametri in modo da puntare ad ottenere migliori risultati. È bene considerare che questa attività a seconda di quanto si sta cercando di ottenere, può aumentare i tempi di risoluzione anche di non poco dell’algoritmo.

Definiamo i parametri dell’XGBoost in un dizionario chiamato parameters, dove cerchiamo di ottenere il miglior learning rate (tra 0,01, 0,05 e 0,1), la miglior massima profondità (tra 5, 7 e 10), il valore del peso minimo dei figli (tra 4 e 6):

Ora definiamo la classe gridsearchcv in una variabile xgb_grid. Essa ci permette di confrontare i vari parametri definiti e ci consegna la miglior combinazione degli stessi.

Ad essa passiamo il regressore xgb1 definito in precedenza, il parametro appena creato, il cv score pari a 2 per assegnare la strategia kfold (la cross validation che permette di costruire un modello più robusto), il numero di job da utilizzare contemporaneamente all’esecuzione dello stesso e il parametro verbose per indicare che vogliamo messaggi durante la risoluzione.

Per maggiori informazioni vedere la pagina di sklearn in merito.

Utilizziamo il metodo fit per ottenere i migliori parametri tra quelli precedentemente assegnati. Viene adattato sia il set di train che il set di test.

Ad essi diamo un limite di stop dell’algoritmo di 10 round: se la metrica rmse non migliora dopo 10 iterazioni l’algoritmo si ferma, per evitare overfitting, e insieme ad essa teniamo in considerazione anche la metrica mae visto che l’abbiamo precedentemente calcolata.

L’addestramento con i parametri così definiti impiega circa 10 minuti. Dopodichè, possiamo visualizzare i risultati ottenuti:

Prevediamo ora, come fatto in precedenza, il set di test con i parametri appena trovati.

E stampiamo i risultati dell’explained variance score e dell’errore medio assoluto:

La varianza spiegata risulta leggermente migliorata anche se di poco (ciò è un bene perché maggiore è, e meglio è), al contrario abbiamo anche ridotto il valore medio assoluto portandolo a meno di 4 a differenza di prima.

Poi è possibile salvare un file csv (submission.csv) dove vengono mostrati i risultati delle previsioni confrontati con quelli della variabile target per il set di test:

Ad esempio, visualizziamo infine cosa otteniamo dalle prime 5 previsioni:

Nelle prime cinque variabili visualizzate non abbiamo nessun errore di previsione.

 

Conclusione

In questo articolo abbiamo visto un esempio di come utilizzare l’XGBoost in python, dopo aver elencato alcuni parametri fondamentali dell’algoritmo.

Implementare l’algoritmo non è di per sè difficile, lo è piuttosto trovare i parametri ottimali che permettono di ottenere le massime prestazioni dal modello. Nell’esempio proposto in 10 minuti di adattamento dei parametri si è migliorato entrambe le metriche: il risultato della varianza spiegata e l’errore medio assoluto.

L’ampiezza del dataset, il numero di iperparametri che si vuole ottimizzare contemporaneamente, nonchè i processori di calcolo utilizzati sono solo alcuni fattori che influenzano anche di molto le tempistiche impiegate ad ottenere un risultato.

Tenerne a mente in fase di creazione ed esecuzione del modello può davvero fare la differenza nell’ottimizzazione dei parametri dell’algoritmo XGBoost.

Lascio alcuni link di approfondimento, per chi volesse avere maggiori informazioni:

  • Parametri dell’eXtreme Gradient Boosting; 
  • Python API; 
  • Come installare la libreria dell’Extreme Gradient Boostin per Anaconda; 
  • Varianza spiegata; 
  • Cos’è un booster lineare; 
  • Parametro min_child_weight; 
  • Parametro subsample, colsample_bytree e colsample_bylevel.
  • Cos’è l’algoritmo XGBoost?
    Cos’è l’algoritmo XGBoost?
  • Tre tecniche di regolarizzazione: Ridge, Lasso ed Elastic Net
    Tre tecniche di regolarizzazione: Ridge, Lasso ed…
  • Python e le librerie principali per il machine learning
    Python e le librerie principali per il machine learning
  • L’Overfitting e l’Underfitting nel machine learning
    L’Overfitting e l’Underfitting nel machine learning
Share
Pin
Share
Tweet

Intelligenza Artificiale Ensemble Learning, Machine Learning

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

Copyright © 2021 · Lorenzo Govoni - Privacy Policy