Xgboost in r: un esempio passo passo
Il boosting è una tecnica di machine learning che ha dimostrato di produrre modelli con elevata precisione predittiva.
Uno dei modi più comuni per implementare il potenziamento nella pratica è utilizzare XGBoost , abbreviazione di “extreme gradient boosting”.
Questo tutorial fornisce un esempio passo passo di come utilizzare XGBoost per adattare un modello avanzato in R.
Passaggio 1: caricare i pacchetti necessari
Per prima cosa caricheremo le librerie necessarie.
library (xgboost) #for fitting the xgboost model library (caret) #for general data preparation and model fitting
Passaggio 2: caricare i dati
Per questo esempio, adatteremo un modello di regressione migliorato al set di dati di Boston dal pacchetto MASS .
Questo set di dati contiene 13 variabili predittive che utilizzeremo per prevedere una variabile di risposta denominata mdev , che rappresenta il valore mediano delle case in diverse zone censite intorno a Boston.
#load the data
data = MASS::Boston
#view the structure of the data
str(data)
'data.frame': 506 obs. of 14 variables:
$ crim: num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
$ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
$ indus: num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
$chas: int 0 0 0 0 0 0 0 0 0 0 ...
$ nox: num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
$rm: num 6.58 6.42 7.18 7 7.15 ...
$ age: num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
$ dis: num 4.09 4.97 4.97 6.06 6.06 ...
$rad: int 1 2 2 3 3 3 5 5 5 5 ...
$ tax: num 296 242 242 222 222 222 311 311 311 311 ...
$ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
$ black: num 397 397 393 395 397 ...
$ lstat: num 4.98 9.14 4.03 2.94 5.33 ...
$ medv: num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
Possiamo vedere che il set di dati contiene 506 osservazioni e 14 variabili in totale.
Passaggio 3: preparare i dati
Successivamente, utilizzeremo la funzione createDataPartition() dal pacchetto caret per dividere il set di dati originale in un set di training e test.
Per questo esempio, sceglieremo di utilizzare l’80% del set di dati originale come parte del set di addestramento.
Tieni presente che anche il pacchetto xgboost utilizza dati di matrice, quindi utilizzeremo la funzione data.matrix() per contenere le nostre variabili predittive.
#make this example reproducible
set.seed(0)
#split into training (80%) and testing set (20%)
parts = createDataPartition(data$medv, p = .8 , list = F )
train = data[parts, ]
test = data[-parts, ]
#define predictor and response variables in training set
train_x = data. matrix (train[, -13])
train_y = train[,13]
#define predictor and response variables in testing set
test_x = data. matrix (test[, -13])
test_y = test[, 13]
#define final training and testing sets
xgb_train = xgb. DMatrix (data = train_x, label = train_y)
xgb_test = xgb. DMatrix (data = test_x, label = test_y)
Passaggio 4: regolare il modello
Successivamente, ottimizzeremo il modello XGBoost utilizzando la funzione xgb.train() , che visualizza l’RMSE (errore quadratico medio) di addestramento e test per ciascun ciclo di potenziamento.
Tieni presente che per questo esempio abbiamo scelto di utilizzare 70 cicli, ma per set di dati molto più grandi non è raro utilizzare centinaia o addirittura migliaia di cicli. Tieni presente che maggiore è il numero di giri, maggiore è la durata.
Si noti inoltre che l’argomento max.degree specifica la profondità di sviluppo dei singoli alberi decisionali. Di solito scegliamo questo numero piuttosto basso, come 2 o 3, per far crescere alberi più piccoli. È stato dimostrato che questo approccio tende a produrre modelli più accurati.
#define watchlist
watchlist = list(train=xgb_train, test=xgb_test)
#fit XGBoost model and display training and testing data at each round
model = xgb.train(data = xgb_train, max.depth = 3 , watchlist=watchlist, nrounds = 70 )
[1] train-rmse:10.167523 test-rmse:10.839775
[2] train-rmse:7.521903 test-rmse:8.329679
[3] train-rmse:5.702393 test-rmse:6.691415
[4] train-rmse:4.463687 test-rmse:5.631310
[5] train-rmse:3.666278 test-rmse:4.878750
[6] train-rmse:3.159799 test-rmse:4.485698
[7] train-rmse:2.855133 test-rmse:4.230533
[8] train-rmse:2.603367 test-rmse:4.099881
[9] train-rmse:2.445718 test-rmse:4.084360
[10] train-rmse:2.327318 test-rmse:3.993562
[11] train-rmse:2.267629 test-rmse:3.944454
[12] train-rmse:2.189527 test-rmse:3.930808
[13] train-rmse:2.119130 test-rmse:3.865036
[14] train-rmse:2.086450 test-rmse:3.875088
[15] train-rmse:2.038356 test-rmse:3.881442
[16] train-rmse:2.010995 test-rmse:3.883322
[17] train-rmse:1.949505 test-rmse:3.844382
[18] train-rmse:1.911711 test-rmse:3.809830
[19] train-rmse:1.888488 test-rmse:3.809830
[20] train-rmse:1.832443 test-rmse:3.758502
[21] train-rmse:1.816150 test-rmse:3.770216
[22] train-rmse:1.801369 test-rmse:3.770474
[23] train-rmse:1.788891 test-rmse:3.766608
[24] train-rmse:1.751795 test-rmse:3.749583
[25] train-rmse:1.713306 test-rmse:3.720173
[26] train-rmse:1.672227 test-rmse:3.675086
[27] train-rmse:1.648323 test-rmse:3.675977
[28] train-rmse:1.609927 test-rmse:3.745338
[29] train-rmse:1.594891 test-rmse:3.756049
[30] train-rmse:1.578573 test-rmse:3.760104
[31] train-rmse:1.559810 test-rmse:3.727940
[32] train-rmse:1.547852 test-rmse:3.731702
[33] train-rmse:1.534589 test-rmse:3.729761
[34] train-rmse:1.520566 test-rmse:3.742681
[35] train-rmse:1.495155 test-rmse:3.732993
[36] train-rmse:1.467939 test-rmse:3.738329
[37] train-rmse:1.446343 test-rmse:3.713748
[38] train-rmse:1.435368 test-rmse:3.709469
[39] train-rmse:1.401356 test-rmse:3.710637
[40] train-rmse:1.390318 test-rmse:3.709461
[41] train-rmse:1.372635 test-rmse:3.708049
[42] train-rmse:1.367977 test-rmse:3.707429
[43] train-rmse:1.359531 test-rmse:3.711663
[44] train-rmse:1.335347 test-rmse:3.709101
[45] train-rmse:1.331750 test-rmse:3.712490
[46] train-rmse:1.313087 test-rmse:3.722981
[47] train-rmse:1.284392 test-rmse:3.712840
[48] train-rmse:1.257714 test-rmse:3.697482
[49] train-rmse:1.248218 test-rmse:3.700167
[50] train-rmse:1.243377 test-rmse:3.697914
[51] train-rmse:1.231956 test-rmse:3.695797
[52] train-rmse:1.219341 test-rmse:3.696277
[53] train-rmse:1.207413 test-rmse:3.691465
[54] train-rmse:1.197197 test-rmse:3.692108
[55] train-rmse:1.171748 test-rmse:3.683577
[56] train-rmse:1.156332 test-rmse:3.674458
[57] train-rmse:1.147686 test-rmse:3.686367
[58] train-rmse:1.143572 test-rmse:3.686375
[59] train-rmse:1.129780 test-rmse:3.679791
[60] train-rmse:1.111257 test-rmse:3.679022
[61] train-rmse:1.093541 test-rmse:3.699670
[62] train-rmse:1.083934 test-rmse:3.708187
[63] train-rmse:1.067109 test-rmse:3.712538
[64] train-rmse:1.053887 test-rmse:3.722480
[65] train-rmse:1.042127 test-rmse:3.720720
[66] train-rmse:1.031617 test-rmse:3.721224
[67] train-rmse:1.016274 test-rmse:3.699549
[68] train-rmse:1.008184 test-rmse:3.709522
[69] train-rmse:0.999220 test-rmse:3.708000
[70] train-rmse:0.985907 test-rmse:3.705192
Dal risultato, possiamo vedere che l’RMSE minimo del test viene raggiunto a 56 round. Oltre questo punto, l’RMSE del test inizia ad aumentare, indicando che stiamo adattando eccessivamente i dati di addestramento .
Quindi, imposteremo il nostro modello XGBoost finale per utilizzare 56 round:
#define final model
final = xgboost(data = xgb_train, max.depth = 3 , nrounds = 56 , verbose = 0 )
Nota: l’argomento verbose=0 indica a R di non visualizzare l’errore di addestramento e test per ogni round.
Passaggio 5: utilizzare il modello per fare previsioni
Infine, possiamo utilizzare il modello finale migliorato per fare previsioni sul valore mediano delle case di Boston nel set di test.
Calcoleremo quindi le seguenti metriche di precisione per il modello:
- MSE: errore quadratico medio
- MAE: errore medio assoluto
- RMSE: errore quadratico medio
mean((test_y - pred_y)^2) #mse
caret::MAE(test_y, pred_y) #mae
caret::RMSE(test_y, pred_y) #rmse
[1] 13.50164
[1] 2.409426
[1] 3.674457
L’errore quadratico medio risulta essere 3.674457 . Ciò rappresenta la differenza media tra la previsione fatta per i valori medi delle case e i valori effettivi delle case osservati nel set di test.
Se vogliamo, potremmo confrontare questo RMSE con altri modelli come la regressione lineare multipla , la regressione di cresta , la regressione delle componenti principali , ecc. per vedere quale modello produce le previsioni più accurate.
Puoi trovare il codice R completo utilizzato in questo esempio qui .