有没有一种方法可以“压缩” lm() 对象以便于以后进行预测?

12
有没有一种方法可以“压缩”lm类的对象,以便我可以将其保存到磁盘上,并在以后与predict.lm一起使用时加载它?
我有一个lm对象,保存后大约为142mb,我很难相信predict.lm需要所有原始观测值/拟合值/残差等来进行线性预测。我能否删除信息以使保存的模型更小?
我尝试将一些变量(fitted.values,residuals等)设置为NA,但似乎对保存的文件大小没有影响。

2
此外,为了响应这个问题的精神,我尝试设置model=FALSE,但没有明显的效果。 - Nick Evans
1
如果大数据是导致问题的原因,那么biglm可能是解决方案。 biglm类对象比lm更小,并且具有其他big data效率。 - mnel
实际上问题不在于内存中数据的大小,而是我在predict()函数中寻找的速度。我的脚本创建了一个每晚更新的模型,通过RPy2调用该模型为最终用户进行预测。使用142mb的模型,每个请求加载时间都非常长。 - Nick Evans
对象是如何保存的?我很难相信它们已经被序列化了。 - mnel
只需使用R内置的save()函数。我会将lm对象保存到变量中并保存到磁盘中。之后,RPy2会加载该对象,然后使用用户输入进行线性预测。 - Nick Evans
3个回答

6
你可以使用 biglm 对模型进行拟合,biglm 模型对象比 lm 模型对象更小。你可以使用 predict.biglm 创建一个函数,并将新的数据设计矩阵传递给该函数,该函数返回预测值。
另一个选项是使用 saveRDS 来保存文件,这些文件似乎更小,因为它们具有较少的开销,只是单个对象,而不像 save 可以保存多个对象。
 library(biglm)
 m <- lm(log(Volume)~log(Girth)+log(Height), trees)
 mm <- lm(log(Volume)~log(Girth)+log(Height), trees, model = FALSE, x =FALSE, y = FALSE)
 bm <- biglm(log(Volume)~log(Girth)+log(Height), trees)
 pred <- predict(bm, make.function = TRUE)
 save(m, file = 'm.rdata')
 save(mm, file = 'mm.rdata')
 save(bm, file = 'bm.rdata')
 save(pred, file = 'pred.rdata')
 saveRDS(m, file = 'm.rds')
 saveRDS(mm, file = 'mm.rds')
 saveRDS(bm, file = 'bm.rds')
 saveRDS(pred, file = 'pred.rds')

 file.info(paste(rep(c('m','mm','bm','pred'),each=2) ,c('.rdata','.rds'),sep=''))
#             size isdir mode mtime               ctime               atime               exe
#  m.rdata    2806 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:24:23 2013-03-07 11:29:30  no
#  m.rds      2798 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:29:30 2013-03-07 11:29:30  no
#  mm.rdata   2113 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:24:28 2013-03-07 11:29:30  no
#  mm.rds     2102 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:29:30 2013-03-07 11:29:30  no
#  bm.rdata    592 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:24:34 2013-03-07 11:29:30  no
#  bm.rds      583 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:29:30 2013-03-07 11:29:30  no
#  pred.rdata 1007 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:24:40 2013-03-07 11:29:30  no
#  pred.rds    995 FALSE  666 2013-03-07 11:29:30 2013-03-07 11:27:30 2013-03-07 11:29:30  no

6
一些事情:
  1. 这个问题实际上是一个重复的问题。

  2. 从狭义上讲,就像另一个问题中已经回答的那样,model=FALSE

  3. 从广义上讲,predict(fit, newdata)实际上只是进行矩阵向量乘法,因此您可以保存仅预测向量并将其与矩阵相乘。

  4. 还有其他可用于拟合的函数。下面是来自RcppArmadillo的fastLm()的示例,它也更快。

请参见下面的说明。
R> library(RcppArmadillo)
Loading required package: Rcpp
R> flm <- fastLm(Volume ~ Girth, data=trees)
R> predict(flm, newdata=trees[1:5,])             ## can predict as with lm()
[1]  5.10315  6.62291  7.63608 16.24803 17.26120
R> object.size(flm)                              ## tiny object size ...
3608 bytes
R> stdlm <- lm(Volume ~ Girth, data=trees)
R> object.size(stdlm)                            ## ... compared to what lm() has
20264 bytes
R> stdlm <- lm(Volume ~ Girth, data=trees, model=FALSE)
R> object.size(stdlm)                            ## ... even when model=FALSE
15424 bytes
R> 

4
原来我自己解决了问题。使用以下内容:
model<-lm(form,data=ct,model=FALSE,x=FALSE,y=FALSE)

我成功地将模型的大小大幅缩小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接