Dividimos los datos en dos partes, una para entrenar el modelo y otra para calcular el error de predicción con datos diferentes de los utilizados para entrenar:
\[ \hat f(x) = \sum _{b=1}^{B} \lambda \hat f_b(x), \quad r_b \rightarrow 0 \] - El parámetro \(\lambda\) controla la velociad del proceso.
## Loaded gbm 2.1.5
set.seed(321)
boost1 = gbm(consumo ~ ., data = datos_train, distribution = "gaussian",
n.trees = 5000, interaction.depth = 4)
## var rel.inf
## peso peso 31.3580874
## cc cc 30.3814004
## cv cv 19.3792893
## ano ano 11.4855761
## acel acel 5.9314782
## origen origen 0.8644751
## cilindros cilindros 0.5996935
y_train = datos_train$consumo
yp_train_boost1 = predict(boost1, newdata = datos_train, n.trees = 5000)
( MSE_train_boost1 = mean((y_train - yp_train_boost1)^2) )
## [1] 0.01935361
Es lógico, ya que los modelos con boosting verifican que \(r_i \rightarrow 0\).
y_test = datos_test$consumo
yp_test_boost1 = predict(boost1, newdata = datos_test, n.trees = 5000)
( MSE_test_boost1 = mean((y_test - yp_test_boost1)^2) )
## [1] 2.078316
Que es superior al obtenido con bagging y random forest.
Se puede modificar el parámetro \(\lambda\), que por defecto es 0.001
boost2 = gbm(consumo ~ ., data = datos_train, distribution = "gaussian",
n.trees = 5000, interaction.depth = 4, shrinkage = 0.2)
yp_train_boost2 = predict(boost2, newdata = datos_train, n.trees = 5000)
( MSE_train_boost2 = mean((y_train - yp_train_boost2)^2) )
## [1] 0.0102184
yp_test_boost2 = predict(boost2, newdata = datos_test, n.trees = 5000)
( MSE_test_boost2 = mean((y_test - yp_test_boost2)^2) )
## [1] 2.554347