Ricerca nel sito web

Come valutare i modelli di potenziamento del gradiente con XGBoost in Python


L'obiettivo dello sviluppo di un modello predittivo è sviluppare un modello accurato sui dati invisibili.

Ciò può essere ottenuto utilizzando tecniche statistiche in cui il set di dati di addestramento viene utilizzato attentamente per stimare le prestazioni del modello su dati nuovi e invisibili.

In questo tutorial scoprirai come valutare le prestazioni dei tuoi modelli di potenziamento del gradiente con XGBoost in Python.

Dopo aver completato questo tutorial, lo saprai.

  • Come valutare le prestazioni dei tuoi modelli XGBoost utilizzando set di dati di training e test.
  • Come valutare le prestazioni dei tuoi modelli XGBoost utilizzando la convalida incrociata k-fold.

Avvia il tuo progetto con il mio nuovo libro XGBoost With Python, che include tutorial passo passo e i file codice sorgente Python per tutti gli esempi .

Cominciamo.

  • Aggiornamento gennaio 2017: aggiornato per riflettere le modifiche nella versione 0.18.1 dell'API scikit-learn.
  • Aggiornamento marzo/2018: aggiunto un collegamento alternativo per scaricare il set di dati poiché l'originale sembra essere stato rimosso.

Valuta i modelli XGBoost con set di training e test

Il metodo più semplice che possiamo utilizzare per valutare le prestazioni di un algoritmo di machine learning è utilizzare diversi set di dati di training e test.

Possiamo prendere il nostro set di dati originale e dividerlo in due parti. Addestra l'algoritmo nella prima parte, quindi fai previsioni nella seconda parte e valuta le previsioni rispetto ai risultati attesi.

La dimensione della suddivisione può dipendere dalle dimensioni e dalle specifiche del set di dati, sebbene sia comune utilizzare il 67% dei dati per l'addestramento e il restante 33% per i test.

Questa tecnica di valutazione dell'algoritmo è veloce. È ideale per set di dati di grandi dimensioni (milioni di record) in cui è evidente che entrambe le suddivisioni dei dati sono rappresentative del problema sottostante. A causa della velocità, è utile utilizzare questo approccio quando l'algoritmo che stai analizzando è lento da addestrare.

Uno svantaggio di questa tecnica è che può avere una varianza elevata. Ciò significa che le differenze nel set di dati di training e test possono comportare differenze significative nella stima dell'accuratezza del modello.

Possiamo dividere il set di dati in un set di train e test utilizzando la funzione train_test_split() dalla libreria scikit-learn. Ad esempio, possiamo dividere il set di dati in una suddivisione del 67% e del 33% per i set di training e di test come segue:

# split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)

L'elenco completo dei codici è fornito di seguito utilizzando il set di dati sull'insorgenza del diabete degli indiani Pima, che si presume si trovi nella directory di lavoro corrente.

Scarica il set di dati e inseriscilo nella directory di lavoro corrente.

  • File del set di dati.
  • Dettagli del set di dati.

Un modello XGBoost con configurazione predefinita è adatto al set di dati di addestramento e valutato sul set di dati di test.

# train-test split evaluation of xgboost model
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)
# fit model no training data
model = XGBClassifier()
model.fit(X_train, y_train)
# make predictions for test data
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]
# evaluate predictions
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))

Nota: i risultati possono variare a causa della natura stocastica dell'algoritmo o della procedura di valutazione o delle differenze nella precisione numerica. Considera l'idea di eseguire l'esempio alcune volte e confrontare il risultato medio.

L'esecuzione di questo esempio riassume le prestazioni del modello sul set di test.

Accuracy: 77.95%

Valuta i modelli XGBoost con la convalida incrociata k-Fold

La convalida incrociata è un approccio che è possibile utilizzare per stimare le prestazioni di un algoritmo di machine learning con una varianza inferiore rispetto a una singola suddivisione del set di train-test.

Funziona suddividendo il set di dati in k parti (ad esempio k=5 o k=10). Ogni suddivisione dei dati è chiamata piega. L'algoritmo viene addestrato su k-1 pieghe con una trattenuta e testato sulla piega trattenuta. Ciò viene ripetuto in modo che a ciascuna piega del set di dati venga data la possibilità di essere il set di test trattenuto.

Dopo aver eseguito la convalida incrociata, ti ritroverai con k diversi punteggi di prestazione che puoi riassumere utilizzando una media e una deviazione standard.

Il risultato è una stima più affidabile delle prestazioni dell'algoritmo sui nuovi dati dati i dati di test. È più accurato perché l'algoritmo viene addestrato e valutato più volte su dati diversi.

La scelta di k deve consentire che la dimensione di ciascuna partizione di test sia sufficientemente grande da costituire un campione ragionevole del problema, consentendo al tempo stesso un numero sufficiente di ripetizioni della valutazione del train-test dell'algoritmo per fornire una stima corretta delle prestazioni dell'algoritmo su dati invisibili . Per set di dati di dimensioni modeste nell'ordine di migliaia o decine di migliaia di osservazioni, sono comuni valori k di 3, 5 e 10.

Possiamo utilizzare il supporto di convalida incrociata k-fold fornito in scikit-learn. Per prima cosa dobbiamo creare l'oggetto KFold specificando il numero di pieghe e la dimensione del dataset. Possiamo quindi utilizzare questo schema con il set di dati specifico. La funzione cross_val_score() di scikit-learn ci consente di valutare un modello utilizzando lo schema di convalida incrociata e restituisce un elenco dei punteggi per ciascun modello addestrato su ciascuna piega.

kfold = KFold(n_splits=10, random_state=7)
results = cross_val_score(model, X, Y, cv=kfold)

L'elenco completo del codice per la valutazione di un modello XGBoost con convalida incrociata k-fold è fornito di seguito per completezza.

# k-fold cross validation evaluation of xgboost model
from numpy import loadtxt
import xgboost
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# CV model
model = xgboost.XGBClassifier()
kfold = KFold(n_splits=10, random_state=7)
results = cross_val_score(model, X, Y, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

Nota: i risultati possono variare a causa della natura stocastica dell'algoritmo o della procedura di valutazione o delle differenze nella precisione numerica. Considera l'idea di eseguire l'esempio alcune volte e confrontare il risultato medio.

L'esecuzione di questo esempio riepiloga le prestazioni della configurazione del modello predefinito sul set di dati, inclusa l'accuratezza della classificazione della media e della deviazione standard.

Accuracy: 76.69% (7.11%)

Se disponi di molte classi per un problema di modellazione predittiva di tipo classificazione o se le classi sono sbilanciate (ci sono molte più istanze per una classe rispetto a un'altra), può essere una buona idea creare pieghe stratificate quando si esegue la convalida incrociata.

Ciò ha l'effetto di applicare la stessa distribuzione delle classi in ogni ripiegamento dell'intero set di dati di addestramento durante l'esecuzione della valutazione di convalida incrociata. La libreria scikit-learn fornisce questa funzionalità nella classe StratifiedKFold.

Di seguito è riportato lo stesso esempio modificato per utilizzare la convalida incrociata stratificata per valutare un modello XGBoost.

# stratified k-fold cross validation evaluation of xgboost model
from numpy import loadtxt
import xgboost
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# CV model
model = xgboost.XGBClassifier()
kfold = StratifiedKFold(n_splits=10, random_state=7)
results = cross_val_score(model, X, Y, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

Nota: i risultati possono variare a causa della natura stocastica dell'algoritmo o della procedura di valutazione o delle differenze nella precisione numerica. Considera l'idea di eseguire l'esempio alcune volte e confrontare il risultato medio.

L'esecuzione di questo esempio produce il seguente output.

Accuracy: 76.95% (5.88%)

Quali tecniche utilizzare e quando

  • In generale, la convalida incrociata k-fold è il gold standard per valutare le prestazioni di un algoritmo di machine learning su dati invisibili con k impostato su 3, 5 o 10.
  • Utilizzare la convalida incrociata stratificata per applicare le distribuzioni delle classi quando è presente un numero elevato di classi o uno squilibrio nelle istanze per ciascuna classe.
  • L'utilizzo di una suddivisione treno/test è utile per la velocità quando si utilizza un algoritmo lento e produce stime delle prestazioni con distorsione inferiore quando si utilizzano set di dati di grandi dimensioni.

Il miglior consiglio è sperimentare e trovare una tecnica per il tuo problema che sia veloce e produca stime ragionevoli delle prestazioni che puoi utilizzare per prendere decisioni.

In caso di dubbio, utilizzare la convalida incrociata 10 volte per i problemi di regressione e la convalida incrociata 10 volte stratificata per i problemi di classificazione.

Riepilogo

In questo tutorial, hai scoperto come valutare i tuoi modelli XGBoost stimando la loro probabile prestazione su dati invisibili.

Nello specifico, hai imparato:

  • Come suddividere il set di dati in sottoinsiemi di training e test per l'addestramento e la valutazione delle prestazioni del modello.
  • Come creare modelli k XGBoost su diversi sottoinsiemi del set di dati e calcolare la media dei punteggi per ottenere una stima più affidabile delle prestazioni del modello.
  • Euristica per aiutarti a scegliere tra la suddivisione del train-test e la convalida incrociata k-fold per il tuo problema.

Hai qualche domanda su come valutare le prestazioni dei modelli XGBoost o su questo post? Poni le tue domande nei commenti qui sotto e farò del mio meglio per rispondere.

Articoli correlati