【问题标题】:Is there a way to 'compress' an lm() object for later prediction?有没有办法“压缩”一个 lm() 对象以供以后预测?
【发布时间】:2013-02-22 00:23:16
【问题描述】:

有没有办法“压缩”一个 lm 类的对象,以便我可以将它保存到磁盘并稍后加载它以供 predict.lm 使用?

我有一个 lm 对象,保存后最终约为 142mb,我很难相信 predict.lm 需要所有原始观测值/拟合值/残差等来进行线性预测。我可以删除信息以使保存的模型更小吗?

我尝试将一些变量(fitted.values、residuals 等)设置为 NA,但似乎对保存的文件大小没有影响。

【问题讨论】:

  • 另外,本着this问题的精神,我尝试设置model=FALSE,但没有明显效果。
  • 如果大数据导致您的问题,那么biglm 可能就是答案。 biglm类的对象小于lm,还有其他big data效率
  • 实际上问题不在于内存中数据的大小,而在于我使用 predict() 函数寻找的速度。我的脚本正在创建一个每晚更新的模型,该模型通过 RPy2 调用以对最终用户进行预测。使用 142mb 模型,加载每个请求需要很长时间。
  • 对象是如何保存的?我很难相信它们已经被连载了。
  • 只使用 R 的内置 save() 函数。我会将 lm 对象保存到变量中并将其保存到磁盘。之后,RPy2 加载对象,然后使用用户输入进行线性预测

标签: r memory compression


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    有几点:

    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> 
    

    【讨论】:

      【解决方案3】:

      原来我解决了自己的问题。使用以下内容:

      model<-lm(form,data=ct,model=FALSE,x=FALSE,y=FALSE)
      

      大大减小了模型的大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 2022-11-22
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        相关资源
        最近更新 更多