Xgboost in r: een stapsgewijs voorbeeld
Boosting is een machine learning-techniek waarvan is aangetoond dat deze modellen oplevert met een hoge voorspellende nauwkeurigheid.
Een van de meest voorkomende manieren om boosting in de praktijk te implementeren is door XGBoost te gebruiken, een afkorting van „extreme gradiënt boosting“.
Deze tutorial biedt een stapsgewijs voorbeeld van hoe u XGBoost kunt gebruiken om een verbeterd model in R te passen.
Stap 1: Laad de benodigde pakketten
Eerst zullen we de benodigde bibliotheken laden.
library (xgboost) #for fitting the xgboost model library (caret) #for general data preparation and model fitting
Stap 2: Gegevens laden
Voor dit voorbeeld zullen we een verbeterd regressiemodel aanpassen aan de Boston- dataset uit het MASS- pakket.
Deze dataset bevat 13 voorspellende variabelen die we zullen gebruiken om een responsvariabele met de naam mdev te voorspellen, die de mediaanwaarde van huizen in verschillende volkstellingen rond Boston vertegenwoordigt.
#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 ...
We kunnen zien dat de dataset in totaal 506 waarnemingen en 14 variabelen bevat.
Stap 3: Bereid de gegevens voor
Vervolgens zullen we de functie createDataPartition() uit het caret-pakket gebruiken om de originele dataset op te splitsen in een trainings- en testset.
Voor dit voorbeeld kiezen we ervoor om 80% van de originele dataset te gebruiken als onderdeel van de trainingsset.
Merk op dat het xgboost-pakket ook matrixgegevens gebruikt, dus we zullen de functie data.matrix() gebruiken om onze voorspellende variabelen vast te houden.
#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)
Stap 4: Pas het model aan
Vervolgens zullen we het XGBoost-model afstemmen met behulp van de functie xgb.train() , die de trainings- en test-RMSE (gemiddelde kwadratische fout) voor elke boostcyclus weergeeft.
Merk op dat we ervoor hebben gekozen om voor dit voorbeeld 70 ronden te gebruiken, maar voor veel grotere datasets is het niet ongebruikelijk om honderden of zelfs duizenden ronden te gebruiken. Houd er rekening mee dat hoe meer rondes, hoe langer de looptijd.
Merk ook op dat het max.degree- argument de ontwikkelingsdiepte van individuele beslissingsbomen specificeert. Meestal kiezen we dit aantal vrij laag, bijvoorbeeld 2 of 3, om kleinere bomen te laten groeien. Het is aangetoond dat deze aanpak de neiging heeft om nauwkeurigere modellen te produceren.
#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
Uit het resultaat kunnen we zien dat de minimale test-RMSE wordt behaald na 56 ronden. Voorbij dit punt begint de test-RMSE te stijgen, wat aangeeft dat we de trainingsgegevens overmatig aanpassen .
We zullen ons uiteindelijke XGBoost-model dus instellen op 56 ronden:
#define final model
final = xgboost(data = xgb_train, max.depth = 3 , nrounds = 56 , verbose = 0 )
Opmerking: het uitgebreide=0- argument vertelt R dat hij de trainings- en testfout voor elke ronde niet moet weergeven.
Stap 5: Gebruik het model om voorspellingen te doen
Ten slotte kunnen we het uiteindelijke verbeterde model gebruiken om voorspellingen te doen over de mediaanwaarde van huizen in Boston in de testset.
Vervolgens berekenen we de volgende nauwkeurigheidsgegevens voor het model:
- MSE: gemiddelde kwadratische fout
- MAE: gemiddelde absolute fout
- RMSE: wortelgemiddelde kwadratische fout
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
De gemiddelde kwadratische fout blijkt 3,674457 te zijn. Dit vertegenwoordigt het gemiddelde verschil tussen de voorspelling gedaan voor de mediane woningwaarden en de daadwerkelijke woningwaarden waargenomen in de testset.
Als we willen, kunnen we deze RMSE vergelijken met andere modellen, zoals meervoudige lineaire regressie , nokregressie , hoofdcomponentregressie , enz. om te zien welk model de meest nauwkeurige voorspellingen oplevert.
De volledige R-code die in dit voorbeeld wordt gebruikt, vindt u hier .