Ответ 1
Проблема состоит из двух раз. i) train
не просто подходит для модели с помощью glm()
, она будет загружать эту модель, поэтому даже с настройками по умолчанию train()
будет выполнять 25 выборок начальной загрузки, что в сочетании с проблемой ii) является (или) источником вашей проблемы, а ii) train()
просто вызывает функцию glm()
со значениями по умолчанию. И эти значения по умолчанию предназначены для хранения кадра модели (аргумент model = TRUE
of ?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 в комментариях ниже.
Чтобы продолжить, изучите код более подробно или напишите Max Kuhn, сопровождающему карету, чтобы узнать о вариантах уменьшения объема памяти.