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
<- train(fidelida ~ ., data = train, method = "leapSeq",
caret.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:
<- predict(caret.leapSeq, newdata = test)
pred 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()
.
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.↩︎