发现了一个类似的问题here,但它没有填满。
我的问题分为2:
“slim”我的意思是只有正确的数据量,predict()函数不会失败。我想存储模型因为学习有时需要花费很多时间,例如:
lmFull <- lm(Volume~Girth+Height,data=trees)
lmSlim <- lmFull
lmSlim$fitted.values <- lmSlim$qr$qr <- lmSlim$residuals <- lmSlim$model <- lmSlim$effects <- NULL
pred1 <- predict(lmFull,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
pred2 <- predict(lmSlim,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
identical(pred1,pred2)
[1] True
我以文本形式存储的内容是获取lmSlim对象并将其解析:
lmTxt <- deparse(lmSlim)
lmTxt <- paste0(lmTxt,collapse="")
将其存储在数据库中很容易,但是当我想再次重复使用它时:
lmRst <- eval(parse(text=lmTxt))
class(lmRst)
[1] "lm"
predict(lmRst,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
Error in eval(expr, envir, enclos) : object 'Volume' not found
有什么建议吗?
答案 0 :(得分:1)
我已经解决了这个问题,可能会有一些解决方法,但它确实有效:
# learning and reducing the size of output
lmFull <- lm(Volume~Girth+Height,data=trees)
lmSlim <- lmFull
lmSlim$fitted.values <- lmSlim$qr$qr <- lmSlim$residuals <- lmSlim$model <- lmSlim$effects <- NULL
pred1 <- predict(lmFull,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
pred2 <- predict(lmSlim,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
identical(pred1,pred2)
[1] TRUE
# deparse and collapse into a string
lmTxt <- deparse(lmSlim)
lmTxt <- paste0(lmTxt,collapse="")
# re-parsing
lmParsed <- eval(parse(text=lmTxt))
lmParsed$call <- lmFull$call
lmParsed$terms <- lmFull$terms
lmParsed
pred3 <- predict(lmParsed,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
identical(pred1,pred3)
[1] FALSE
但是...
sum(abs(pred1 - pred3))
[1] 1.634248e-13
as.numeric(object.size(lmParsed) / object.size(lmFull))
[1] 0.3449477
所以我可以忍受它。
答案 1 :(得分:0)
试试这个:
lmTxt <- dput(lmSlim)
lmRst <- eval(lmTxt)
predict(lmRst,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
编辑:正如评论中指出的那样,dput
不会返回字符串。所以这是另一种选择:
save(lmSlim, file='data.txt', ascii=T)
该文件的内容是ascii,因此应该可以将它们写入数据库。要稍后重新加载,只需使用load
命令:
load('data.txt')
答案 2 :(得分:0)
不要将其存储为文本。试试这个:
lmFull <- lm(Volume~Girth+Height,data=trees)
lmSlim <- lmFull
lmSlim$residuals <- NULL
lmSlim$effects <- NULL
lmSlim$fitted.values <- NULL
lmSlim$model <- NULL
lmSlim$qr$qr <- NULL
predict(lmSlim)
#works
predict(lmSlim, newdata=data.frame(Girth=30, Height=20))
#works
object.size(lmFull)
#22960 bytes
object.size(lmSlim)
#7920 bytes