XGBoost dans R : un exemple étape par étape



Le boosting est une technique d’apprentissage automatique qui s’est avérée capable de produire des modèles avec une grande précision prédictive.

L’un des moyens les plus courants de mettre en œuvre le boosting dans la pratique consiste à utiliser XGBoost , abréviation de « boosting de gradient extrême ».

Ce didacticiel fournit un exemple étape par étape de la façon d’utiliser XGBoost pour adapter un modèle amélioré dans R.

Étape 1 : Chargez les packages nécessaires

Tout d’abord, nous allons charger les bibliothèques nécessaires.

library(xgboost) #for fitting the xgboost model
library(caret)   #for general data preparation and model fitting

Étape 2 : Charger les données

Pour cet exemple, nous adapterons un modèle de régression amélioré à l’ensemble de données Boston du package MASS .

Cet ensemble de données contient 13 variables prédictives que nous utiliserons pour prédire une variable de réponse appelée mdev , qui représente la valeur médiane des maisons dans différents secteurs de recensement autour de 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 ...

Nous pouvons voir que l’ensemble de données contient 506 observations et 14 variables au total.

Étape 3 : préparer les données

Ensuite, nous utiliserons la fonction createDataPartition() du package caret pour diviser l’ensemble de données d’origine en un ensemble d’entraînement et de test.

Pour cet exemple, nous choisirons d’utiliser 80 % de l’ensemble de données d’origine dans le cadre de l’ensemble d’entraînement.

Notez que le package xgboost utilise également des données matricielles, nous utiliserons donc la fonction data.matrix() pour contenir nos variables prédictives.

#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)

Étape 4 : Ajuster le modèle

Ensuite, nous ajusterons le modèle XGBoost en utilisant la fonction xgb.train() , qui affiche le RMSE (erreur quadratique moyenne) d’entraînement et de test pour chaque cycle de boosting.

Notez que nous avons choisi d’utiliser 70 tours pour cet exemple, mais pour des ensembles de données beaucoup plus volumineux, il n’est pas rare d’utiliser des centaines, voire des milliers de tours. Gardez simplement à l’esprit que plus il y a de tours, plus la durée d’exécution est longue.

Notez également que l’argument max.degree spécifie la profondeur de développement des arbres de décision individuels. Nous choisissons généralement ce nombre assez bas, comme 2 ou 3, afin de faire pousser des arbres plus petits. Il a été démontré que cette approche tend à produire des modèles plus précis.

#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 

D’après le résultat, nous pouvons voir que le RMSE minimum de test est atteint à 56 tours. Au-delà de ce point, le RMSE du test commence à augmenter, ce qui indique que nous surajustons les données d’entraînement .

Ainsi, nous définirons notre modèle XGBoost final pour utiliser 56 tours :

#define final model
final = xgboost(data = xgb_train, max.depth = 3, nrounds = 56, verbose = 0)

Remarque : L’argument verbose = 0 indique à R de ne pas afficher l’erreur d’entraînement et de test pour chaque tour.

Étape 5 : Utiliser le modèle pour faire des prédictions

Enfin, nous pouvons utiliser le modèle final amélioré pour faire des prédictions sur la valeur médiane des maisons de Boston dans l’ensemble de tests.

Nous calculerons ensuite les mesures de précision suivantes pour le modèle :

  • MSE : erreur quadratique moyenne
  • MAE : erreur absolue moyenne
  • RMSE : erreur quadratique moyenne
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’erreur quadratique moyenne s’avère être 3,674457 . Cela représente la différence moyenne entre la prédiction faite pour les valeurs médianes des maisons et les valeurs réelles des maisons observées dans l’ensemble de test.

Si nous le souhaitons, nous pourrions comparer ce RMSE à d’autres modèles comme la régression linéaire multiple , la régression de crête , la régression en composantes principales , etc. pour voir quel modèle produit les prédictions les plus précises.

Vous pouvez trouver le code R complet utilisé dans cet exemple ici .

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *