【发布时间】:2014-08-01 20:34:48
【问题描述】:
我拒绝提供示例代码,因为到目前为止我无法在较小的数据集上复制此示例。我正在使用不同的协变量选择训练几个逻辑回归(本例中为 50 个)并将输出保存为列表。我的训练数据有 +400K 行。
认识到有大量不必要的背景数据存储在 glm 对象中,我的训练脚本涉及以下代码行,旨在尽可能多地去除额外数据并减少内存占用输出对象:
fit[c('residuals', 'fitted.values', 'effects', 'weights', 'prior.weights', 'y', 'linear.predictors', 'data')] <- NULL
fit$qr$qr <- NULL
gc()
起初这似乎工作正常。 R/RStudio 控制台在执行我的代码后告诉我 glms 列表是 9.6Mb:
但是,当我使用 save(logitFire, file = 'logitFire.RData') 保存这个对象时,我发现它的内存占用绝对是巨大的,(磁盘上 1.32GB):
再次,我 100% 认识到不提供玩具示例是不好的形式。我尝试使用 iris 数据集,但无法重现该问题。这似乎是大型数据集的一个特征,但我不确定。有没有专家知道发生了什么?我的下一步,如果我不能使用基本包中的函数来解决这个问题,我将为“leanLogit”和“leanPredict”函数编写我自己的包装器,这些函数只是去掉模型协变量并折腾所有其余的辅助数据。
编辑:澄清一下,我在这个问题中包含的示例脚本嵌入在模型训练例程中,最终生成 glms logitFire 的列表。这不是完整的代码,而是嵌入在更大的脚本中。我将其包含在内,以便读者可以看到我正在剥离的数据对象。
编辑#2:这是一些额外的请求信息。为了尽可能清楚,logitFire 是我使用 glm 在 R 中生成的 50 个逻辑回归模型的列表。我已经在此列表的一个元素(即一个逻辑回归模型)上显示了 str 命令的输出:
> object.size(logitFire)
10113640 bytes
> str(logitFire[[1]])
List of 21
$ coefficients : Named num [1:54] 18.361 -0.592 -1.043 -0.744 0.101 ...
..- attr(*, "names")= chr [1:54] "(Intercept)" "var32" "var33" "var34" ...
$ R : num [1:54, 1:54] -11.3 0 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:54] "(Intercept)" "var32" "var33" "var34" ...
.. ..$ : chr [1:54] "(Intercept)" "var32" "var33" "var34" ...
$ rank : int 53
$ qr :List of 4
..$ rank : int 53
..$ qraux: num [1:54] 1 1 1 1 1 ...
..$ pivot: int [1:54] 1 2 3 4 5 6 7 8 9 10 ...
..$ tol : num 1e-11
..- attr(*, "class")= chr "qr"
$ family :List of 12
..$ family : chr "binomial"
..$ link : chr "logit"
..$ linkfun :function (mu)
..$ linkinv :function (eta)
..$ variance :function (mu)
..$ dev.resids:function (y, mu, wt)
..$ aic :function (y, n, mu, wt, dev)
..$ mu.eta :function (eta)
..$ initialize: expression({ if (NCOL(y) == 1) { if (is.factor(y)) y <- y != levels(y)[1L] n <- rep.int(1, nobs) y[weights == 0] <- 0 if (any(y < 0 | y > 1)) stop("y values must be 0 <= y <= 1") mustart <- (weights * y + 0.5)/(weights + 1) m <- weights * y if (any(abs(m - round(m)) > 0.001)) warning("non-integer #successes in a binomial glm!") } else if (NCOL(y) == 2) { if (any(abs(y - round(y)) > 0.001)) warning("non-integer counts in a binomial glm!") n <- y[, 1] + y[, 2] y <- ifelse(n == 0, 0, y[, 1]/n) weights <- weights * n mustart <- (n * y + 0.5)/(n + 1) } else stop("for the 'binomial' family, y must be a vector of 0 and 1's\nor a 2 column matrix where col 1 is no. successes and col 2 is no. failures") })
..$ validmu :function (mu)
..$ valideta :function (eta)
..$ simulate :function (object, nsim)
..- attr(*, "class")= chr "family"
$ deviance : num 1648
$ aic : num 1754
$ null.deviance: num 1783
$ iter : int 19
$ df.residual : int 49947
$ df.null : int 49999
$ converged : logi TRUE
$ boundary : logi FALSE
$ call : language glm(formula = fire ~ var3 + var1 + var12isNA + var4 + var11 + var13 + var6 + dummy + var9 + var16isNA + var10 + var17 + var8 + var7 + var15isNA + var14isNA, family = binomial(), data = inData, model = FALSE)
$ formula :Class 'formula' length 3 fire ~ var3 + var1 + var12isNA + var4 + var11 + var13 + var6 + dummy + var9 + var16isNA + var10 + var17 + var8 + var7 + var15isNA + var14isNA
.. ..- attr(*, ".Environment")=<environment: 0x7f98f5685ce8>
$ terms :Classes 'terms', 'formula' length 3 fire ~ var3 + var1 + var12isNA + var4 + var11 + var13 + var6 + dummy + var9 + var16isNA + var10 + var17 + var8 + var7 + var15isNA + var14isNA
.. ..- attr(*, "variables")= language list(fire, var3, var1, var12isNA, var4, var11, var13, var6, dummy, var9, var16isNA, var10, var17, var8, var7, var15isNA, var14isNA)
.. ..- attr(*, "factors")= int [1:17, 1:16] 0 1 0 0 0 0 0 0 0 0 ...
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : chr [1:17] "fire" "var3" "var1" "var12isNA" ...
.. .. .. ..$ : chr [1:16] "var3" "var1" "var12isNA" "var4" ...
.. ..- attr(*, "term.labels")= chr [1:16] "var3" "var1" "var12isNA" "var4" ...
.. ..- attr(*, "order")= int [1:16] 1 1 1 1 1 1 1 1 1 1 ...
.. ..- attr(*, "intercept")= int 1
.. ..- attr(*, "response")= int 1
.. ..- attr(*, ".Environment")=<environment: 0x7f98f5685ce8>
.. ..- attr(*, "predvars")= language list(fire, var3, var1, var12isNA, var4, var11, var13, var6, dummy, var9, var16isNA, var10, var17, var8, var7, var15isNA, var14isNA)
.. ..- attr(*, "dataClasses")= Named chr [1:17] "numeric" "factor" "factor" "logical" ...
.. .. ..- attr(*, "names")= chr [1:17] "fire" "var3" "var1" "var12isNA" ...
$ offset : NULL
$ control :List of 3
..$ epsilon: num 1e-08
..$ maxit : num 25
..$ trace : logi FALSE
$ method : chr "glm.fit"
$ contrasts :List of 12
..$ var3 : chr "contr.treatment"
..$ var1 : chr "contr.treatment"
..$ var12isNA: chr "contr.treatment"
..$ var4 : chr "contr.treatment"
..$ var6 : chr "contr.treatment"
..$ dummy : chr "contr.treatment"
..$ var9 : chr "contr.treatment"
..$ var16isNA: chr "contr.treatment"
..$ var8 : chr "contr.treatment"
..$ var7 : chr "contr.treatment"
..$ var15isNA: chr "contr.treatment"
..$ var14isNA: chr "contr.treatment"
$ xlevels :List of 8
..$ var3 : chr [1:7] "1" "2" "3" "4" ...
..$ var1 : chr [1:6] "1" "2" "3" "4" ...
..$ var4 : chr [1:15] "99" "A1" "C1" "D1" ...
..$ var6 : chr [1:4] "A" "B" "C" "Z"
..$ dummy: chr [1:2] "A" "B"
..$ var9 : chr [1:3] "A" "B" "Z"
..$ var8 : chr [1:7] "1" "2" "3" "4" ...
..$ var7 : chr [1:9] "1" "2" "3" "4" ...
- attr(*, "class")= chr [1:2] "glm" "lm"
【问题讨论】:
-
您更改对象-
fit,然后保存logitFire。为什么要fit的 mods 更改logitFire的大小? -
嗨@BondedDust,请参阅上面的编辑。
-
如果没有更好地描述
logitFire,例如object.size(logitFire)和str(logitFire),我认为这个问题无法回答。 -
logitFire(或其元素)是否有一个重要的存储环境? -
我想知道——就像 C 级别的东西?有什么方法可以让我从 R 终端检查出来吗?
标签: r memory-management save persistence logistic-regression