forest - Los valores lambda del modelo final glmnet del tren de retención no son los especificados
install caret r (1)
Estaba usando el paquete caret
para sintonizar un modelo de regresión logística glmnet. Mientras que el valor lambda
de la mejor tonalidad es uno de los valores que especifiqué en tuneGrid
, los valores lambda
del modelo final son totalmente diferentes:
require(caret)
set.seed(1)
x <- matrix(runif(1000), nrow = 100)
y <- factor(rbinom(100, 1, 0.5))
lambda.seq <- exp(seq(log(1e-5), log(1e0), length.out = 20))
model <- train(x, y,
method ="glmnet",
family = "binomial",
tuneGrid = expand.grid(alpha = 1,
lambda = lambda.seq))
model$bestTune
# alpha lambda
# 13 1 0.0143845
model$finalModel$lambdaOpt
# [1] 0.0143845
model$finalModel$lambda
# [1] 0.1236344527 0.1126511087 0.1026434947 0.0935249295 0.0852164325 0.0776460395
# [7] 0.0707481794 0.0644631061 0.0587363814 0.0535184032 0.0487639757 0.0444319185
# [13] 0.0404847094 0.0368881594 0.0336111170 0.0306251980 0.0279045398 0.0254255774
# [19] 0.0231668392 0.0211087610 0.0192335169 0.0175248642 0.0159680036 0.0145494502
# [25] 0.0132569171 0.0120792091 0.0110061255 0.0100283716 0.0091374787 0.0083257303
# [31] 0.0075860954 0.0069121676 0.0062981097 0.0057386030 0.0052288013 0.0047642890
# [37] 0.0043410427 0.0039553964 0.0036040099 0.0032838396 0.0029921123 0.0027263013
# [43] 0.0024841042 0.0022634233 0.0020623470 0.0018791337 0.0017121967 0.0015600899
# [49] 0.0014214958 0.0012952140 0.0011801508 0.0010753094 0.0009797819 0.0008927408
model$finalModel$lambdaOpt %in% lambda.seq
# [1] TRUE
El valor óptimo del modelo final de lambda
tampoco está en la lista de lambda
que el mismo modelo supuestamente utilizó:
model$finalModel$lambdaOpt %in% model$finalModel$lambda
# [1] FALSE
¿Qué explica estas discrepancias en lambda
?
El modelo final es básicamente un reacondicionamiento con todo su conjunto de datos DESPUÉS de que alpha
y lambda
fueron optimizados usando técnicas de remuestreo.
Si imprime la model$finalModel$call
, verá que se está realizando la llamada (se ha omitido la estructura x, y para abreviar):
Call: glmnet(x, y, family = "binomial", alpha = 1)
Aquí, se establece alpha
(si había establecido una secuencia, sería la alpha
óptima encontrada), pero no se establece que la lambda especificada se entrene, y por lo tanto se genera una secuencia automática basada en sus datos y se ajusta el modelo. A continuación, predice con el mismo conjunto de entrenamiento con lambdaOpt
(y el resto de la secuencia que proporcionó). Eche un vistazo a la viñeta de glmnet y cómo puede especificar diferentes lambda
después del entrenamiento.
Si escribe:
> names(model$modelInfo)
[1] "label" "library" "type" "parameters" "grid" "loop"
[7] "fit" "predict" "prob" "predictors" "varImp" "levels"
[13] "tags" "sort" "trim"
y luego recorra cada una de esas secciones, puede ver lo train
está haciendo el train
. Puede ver en el model$modelInfo$predict
cómo pronostica en lambdaOpt
y el resto de su secuencia.
Cuando imprimes model$results
obtienes tu lista de lambda
y el rendimiento en el conjunto de entrenamiento completo con cada uno:
alpha lambda Accuracy Kappa AccuracySD KappaSD
1 1 1.000000e-05 0.5698940 0.15166891 0.09061320 0.17133524
2 1 1.832981e-05 0.5698940 0.15166891 0.09061320 0.17133524
3 1 3.359818e-05 0.5698940 0.15166891 0.09061320 0.17133524
4 1 6.158482e-05 0.5698940 0.15166891 0.09061320 0.17133524
5 1 1.128838e-04 0.5698940 0.15166891 0.09061320 0.17133524
6 1 2.069138e-04 0.5698940 0.15166891 0.09061320 0.17133524
7 1 3.792690e-04 0.5698940 0.15166891 0.09061320 0.17133524
8 1 6.951928e-04 0.5698940 0.15166891 0.09061320 0.17133524
9 1 1.274275e-03 0.5675708 0.14690433 0.09071728 0.17085665
10 1 2.335721e-03 0.5643334 0.14059590 0.09153010 0.17204036
11 1 4.281332e-03 0.5629588 0.13822063 0.09403553 0.17715441
12 1 7.847600e-03 0.5694974 0.15221600 0.08791315 0.16433922
13 1 1.438450e-02 0.5700431 0.15448347 0.08864353 0.16509332
14 1 2.636651e-02 0.5695053 0.15189752 0.08113581 0.15184619
15 1 4.832930e-02 0.5635977 0.14112303 0.05833646 0.11617226
16 1 8.858668e-02 0.5305835 0.08983718 0.08116759 0.14752307
17 1 1.623777e-01 0.4800871 0.01124082 0.05827521 0.05715298
18 1 2.976351e-01 0.4725241 0.00000000 0.04488500 0.00000000
19 1 5.455595e-01 0.4725241 0.00000000 0.04488500 0.00000000
20 1 1.000000e+00 0.4725241 0.00000000 0.04488500 0.00000000
Para resumir lo que está sucediendo en caret + glmnet:
optimiza
alpha
ylambda
dentro de tuneGrid que proporcionaste usando técnicas de remuestreo;reajusta el modelo, ahora en todo el conjunto de entrenamiento, con
alpha
óptima ;predice todo el conjunto de entrenamiento con
lambdaOpt
encontrado en 1. y en el resto de la secuencia de lambdas en tuneGrid.