6.6 Selección del modelo mediante remuestreo

De igual forma, los métodos de selección de variables descritos en la Sección 6.3 dependen (en mayor o menor medida) de la validez de las hipótesis estructurales. Por este motivo se podría pensar en emplear alguno de los procedimientos descritos en la Sección 1.3. Por ejemplo, podríamos considerar como hiperparámetros la inclusión no de cada una de las posibles variables explicativas y realizar la selección de variables (la complejidad del modelo) mediante remuestreo. Sin embargo esto puede presentar dificultades computacionales.

Otra posibilidad es emplear remuestreo para escoger entre distintos procedimientos de selección o para escoger el número de predictores incluidos en el modelo. En este caso, el procedimiento de selección debería realizarse también en cada uno de los conjuntos de entrenamiento utilizados en la validación.

Esto último puede hacerse fácilmente con el paquete caret. Por ejemplo, este paquete implementa métodos de selección basados en el paquete leaps, considerando el número máximo de predictores nvmax como hiperparámetro y empleando búsqueda: hacia atrás ("leapBackward"), hacia adelante ("leapForward") y por pasos ("leapSeq").

library(caret)
modelLookup("leapSeq")
##     model parameter                        label forReg forClass probModel
## 1 leapSeq     nvmax Maximum Number of Predictors   TRUE    FALSE     FALSE
caret.leapSeq <- train(fidelida ~ ., data = train, method = "leapSeq",
                   trControl = trainControl(method = "cv", number = 10),
                   tuneGrid = data.frame(nvmax = 1:6))
caret.leapSeq
## Linear Regression with Stepwise Selection 
## 
## 160 samples
##  13 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 144, 143, 145, 144, 144, 143, ... 
## Resampling results across tuning parameters:
## 
##   nvmax  RMSE      Rsquared   MAE     
##   1      6.585282  0.4344609  5.354280
##   2      6.378169  0.4586041  5.077810
##   3      6.364526  0.4611045  5.085980
##   4      4.407117  0.7505874  3.387448
##   5      4.446449  0.7525050  3.366581
##   6      4.652626  0.7247463  3.553985
## 
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was nvmax = 4.
# summary(caret.leapSeq$finalModel)
with(caret.leapSeq, coef(finalModel, bestTune$nvmax))
## (Intercept)    calidadp         web      precio    velocida 
##  -5.3610807   3.4712306   1.2471721   0.4190875   7.4382584

Una vez seleccionado el modelo final36, estudiaríamos la eficiencia de las predicciones en la muestra de test:

pred <- predict(caret.leapSeq, newdata = test)
accuracy(pred, obs)
##         me       rmse        mae        mpe       mape  r.squared 
##  0.2886512  4.1741220  3.2946370 -0.3413883  5.9590279  0.8292294

Además, en el caso de ajustes de modelos de este tipo, puede resultar de interés realizar un preprocesado de los datos para eliminar predictores correlados o con varianza próxima a cero, estableciendo por ejemplo preProc = c("nzv", "corr") en la llamada a la función train().


  1. Se podrían haber entrenado distintos métodos de selección de predictores y comparar los resultados (en las mismas muestras de validación) para escoger el modelo final.↩︎