traincontrol forest cross r machine-learning package r-caret

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:

  1. optimiza alpha y lambda dentro de tuneGrid que proporcionaste usando técnicas de remuestreo;

  2. reajusta el modelo, ahora en todo el conjunto de entrenamiento, con alpha óptima ;

  3. predice todo el conjunto de entrenamiento con lambdaOpt encontrado en 1. y en el resto de la secuencia de lambdas en tuneGrid.