Проблема в два раза. i) train
не просто соответствует модели через glm()
, она будет загружать эту модель, поэтому даже при значениях по умолчанию train()
сделает 25 загрузочных выборок который вместе с проблемой ii) является (или a ) источником вашей проблемы, а ii) train()
просто вызывает функцию glm()
с его по умолчанию. И эти значения по умолчанию - хранить фрейм модели (аргумент model = TRUE
из ?glm
), который включает в себя копию данных в стиле фрейма модели. Объект, возвращаемый train()
, уже хранит копию данных в $trainingData
, а объект "glm"
в $finalModel
также имеет копию фактических данных.
На этом этапе при простом запуске glm()
с использованием train()
будет получено 25 копий полностью развернутых model.frame
и исходных данных, которые необходимо будет хранить в памяти во время процесс повторной выборки - неважно, проводятся ли они одновременно или последовательно, не сразу понятно из быстрого просмотра кода, поскольку повторная выборка происходит при вызове lapply()
. Также будет 25 копий необработанных данных.
После завершения повторной выборки возвращаемый объект будет содержать 2 копии необработанных данных и полную копию model.frame
. Если ваши тренировочные данные велики по сравнению с доступной оперативной памятью или содержат много факторов, которые необходимо расширить в model.frame
, то вы могли бы легко использовать огромные объемы памяти, просто перенося копии данных вокруг.
Если вы добавите model = FALSE
к вашему поездному вызову, это может иметь значение. Вот небольшой пример использования данных 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)
тогда
> 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
Таким образом, есть разница в размере возвращаемого объекта, и использование памяти во время обучения будет меньше. Насколько ниже будет зависеть от того, будут ли внутренние компоненты train()
хранить все копии model.frame
в памяти во время процесса повторной выборки.
Объект, возвращаемый train()
, также значительно больше, чем возвращаемый glm()
- как упомянуто @DWin в комментариях ниже.
Чтобы пойти дальше, изучите код более внимательно или напишите Максу Куну, сопровождающему caret , по электронной почте, чтобы узнать о возможностях уменьшить объем используемой памяти.