Il problema è duplice. i)train
non significa solo adattarsi un modello tramite glm()
, si bootstrap quel modello, quindi, anche con le impostazioni predefinite, train()
farà 25 campioni di bootstrap, che, insieme con il problema ii) è il (o a) l'origine del problema e ii)train()
chiama semplicemente la funzione glm()
con i valori predefiniti. E quelle di default sono per memorizzare il frame del modello (argomento model = TRUE
di ?glm
), che include una copia dei dati nello stile del frame del modello. L'oggetto restituito da train()
memorizza già una copia dei dati in $trainingData
e l'oggetto "glm"
in $finalModel
ha anche una copia dei dati effettivi.
A questo punto, semplicemente eseguendo glm()
usando train()
sarà produrre 25 copie della completamente espanso model.frame
e i dati originali, che saranno tutti bisogno di essere contenuto in memoria durante il processo di ricampionamento - se questi sono detenuti simultaneamente o consecutivamente non è immediatamente chiaro da una rapida occhiata al codice mentre il ricampionamento avviene in una chiamata lapply()
. Ci saranno anche 25 copie dei dati grezzi.
Al termine del ricampionamento, l'oggetto restituito conterrà 2 copie dei dati grezzi e una copia completa di model.frame
. Se i tuoi dati di allenamento sono ampi rispetto alla RAM disponibile o contengono molti fattori da espandere nello model.frame
, potresti facilmente utilizzare enormi quantità di memoria semplicemente trasportando copie dei dati in giro.
Se si aggiunge model = FALSE
alla chiamata del treno, ciò potrebbe fare la differenza. Ecco un piccolo esempio utilizzando i dati clotting
in ?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)
poi
> 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
Quindi c'è una differenza di dimensione nell'uso oggetto e memoria restituita durante l'allenamento sarà inferiore. Quanto inferiore dipenderà dal fatto che le parti interne di train()
conservino tutte le copie di model.frame
in memoria durante il processo di ricampionamento.
L'oggetto restituito da train()
è anche significativamente maggiore di quello restituito da glm()
- come indicato da @DWin nei commenti, di seguito.
Per ulteriori informazioni, esaminare il codice più da vicino o inviare a Max Kuhn, manutentore del numero di caret, per informazioni sulle opzioni per ridurre il footprint di memoria.
Fare attenzione a fare un piccolo esempio riproducibile per gli altri da provare? –