El problema es doble. i)train
no sólo encajan un modelo a través de glm()
, será bootstrap que el modelo, lo que incluso con los valores predeterminados, train()
hará 25 muestras de arranque, que, junto con el problema de ii) es la (o un) fuente de su problema, y ii)train()
simplemente llama a la función glm()
con sus valores predeterminados. Y esos valores predeterminados son para almacenar el marco del modelo (argumento model = TRUE
de ?glm
), que incluye una copia de los datos en el estilo de marco del modelo. El objeto devuelto por train()
ya almacena una copia de los datos en $trainingData
, y el objeto "glm"
en $finalModel
también tiene una copia de los datos reales.
En este punto, simplemente ejecutando glm()
usando train()
será producir 25 copias de la completamente expandida model.frame
y los datos originales, que todos necesitaremos que tendrá lugar en la memoria durante el proceso de remuestreo - si éstas se llevan a cabo al mismo tiempo o consecutivamente no se ve inmediatamente después de un vistazo rápido al código ya que el remuestreo ocurre en una llamada lapply()
. También habrá 25 copias de los datos sin procesar.
Una vez que finaliza el remuestreo, el objeto devuelto contendrá 2 copias de los datos brutos y una copia completa de model.frame
. Si sus datos de entrenamiento son grandes en relación con la RAM disponible o contiene muchos factores para expandir en el model.frame
, entonces podría estar usando grandes cantidades de memoria simplemente llevando consigo copias de los datos.
Si agrega model = FALSE
a su llamada de tren, eso puede hacer la diferencia. He aquí un pequeño ejemplo utilizando los datos de clotting
?glm
:
clotting <- data.frame(u = c(5,10,15,20,30,40,60,80,100),
lot1 = c(118,58,42,35,27,25,21,19,18),
lot2 = c(69,35,26,21,18,16,13,12,12))
require(caret)
continuación
> m1 <- train(lot1 ~ log(u), data=clotting, family = Gamma, method = "glm",
+ model = TRUE)
Fitting: parameter=none
Aggregating results
Fitting model on full training set
> m2 <- train(lot1 ~ log(u), data=clotting, family = Gamma, method = "glm",
+ model = FALSE)
Fitting: parameter=none
Aggregating results
Fitting model on full training set
> object.size(m1)
121832 bytes
> object.size(m2)
116456 bytes
> ## ordinary glm() call:
> m3 <- glm(lot1 ~ log(u), data=clotting, family = Gamma)
> object.size(m3)
47272 bytes
> m4 <- glm(lot1 ~ log(u), data=clotting, family = Gamma, model = FALSE)
> object.size(m4)
42152 bytes
lo que hay una diferencia de tamaño en el uso de objetos y memoria devuelta durante el entrenamiento será menor. Cuánto más bajo dependerá de si las partes internas de train()
guardan todas las copias del model.frame
en la memoria durante el proceso de remuestreo.
El objeto devuelto por train()
también es significativamente más grande que el devuelto por glm()
- como se menciona por @DWin en los comentarios, a continuación.
Para llevar esto más lejos, o estudie el código más de cerca, o envíe un correo electrónico a Max Kuhn, el mantenedor de caret, para consultar las opciones para reducir la huella de memoria.
¿Desea hacer un pequeño ejemplo reproducible para que otros lo intenten? –