问题有两个方面。 i) train 不只是通过glm() 拟合模型,它会引导该模型,所以即使使用默认值,train() 也会进行 25 次引导样本,再加上问题 ii) 是您问题的(或 a)来源,ii) train() 只需调用glm() 具有 其 默认值的函数。这些默认设置是存储模型框架(参数model = TRUE 的?glm),其中包括模型框架样式的数据副本。 train()返回的对象已经存储了$trainingData中的数据副本,$finalModel中的"glm"对象也有实际数据的副本。
此时,简单地使用train() 运行glm() 将生成完全展开的model.frame 的25 个副本和原始数据,这些都需要在运行期间保存在内存中重采样过程 - 由于重采样发生在 lapply() 调用中,因此快速查看代码并不能立即清楚地看到这些是同时进行还是连续保存。还将有 25 个原始数据副本。
重采样完成后,返回的对象将包含原始数据的 2 个副本和model.frame 的完整副本。如果您的训练数据相对于可用 RAM 很大,或者包含许多要在 model.frame 中扩展的因素,那么您很容易使用大量内存,只携带数据的副本。
如果您将model = FALSE 添加到您的火车呼叫中,那可能会有所不同。这是一个使用?glm 中的clotting 数据的小示例:
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 在下面的 cmets 中所提到的。
为了更进一步,要么更仔细地研究代码,要么给 caret 的维护者 Max Kuhn 发送电子邮件,询问减少内存占用的选项。