2013-03-06 2 views
10

lm 클래스의 객체를 '압축'할 수있는 방법이 있나요? 나중에 디스크에 저장하고 나중에 predict.lm과 함께 사용할 수 있도록로드 할 수 있습니까?나중에 예측을 위해 lm() 객체를 압축하는 방법이 있습니까?

저는 저장시 ~ 142MB가되는 작품을 가지고 있습니다. 예측을 믿는 데 어려움이 있습니다. 선형 예측을하기 위해 원래의 관측 값/피팅 값/잔차 등이 모두 필요합니다. 저장된 모델이 작아 지도록 정보를 제거 할 수 있습니까?

NA (fitted.values, residuals 등)의 변수를 설정하려고 시도했지만 저장된 파일 크기에 아무런 영향을 미치지 않는 것으로 보입니다.

+2

[이 (의 정신 http://stackoverflow.com/questions/2929776/how-to-save-a-fitted-r-model-for-later-use?rq= 1) 질문에'model = FALSE'를 설정하려했지만 눈에 띄는 효과가 없었습니다. –

+1

빅 데이터가 문제를 일으키는 경우 'biglm'이 답이 될 수 있습니다. 'biglm' 클래스의 객체는'lm'보다 작고 다른 '큰 데이터'효율성이 있습니다 – mnel

+0

실제로 문제는 메모리에있는 데이터의 크기가 아니며 predict()로 찾던 속도입니다. 기능. 필자의 스크립트는 최종 사용자를위한 예측을하기 위해 RPy2를 통해 호출 된 야간 업데이트 모델을 작성하고있었습니다. 142mb 모델에서는 각 요청을로드하는 데 영원히 걸렸습니다. –

답변

6

biglm을 모델에 맞게 사용할 수 있습니다. biglm 모델 개체가 모델 개체보다 작습니다. predict.biglm을 사용하여 예측 값을 반환하는 newdata 디자인 행렬을 전달할 수있는 함수를 만들 수 있습니다.

또 다른 옵션은을 사용하여 파일을 저장하는 것입니다. 파일 크기는 다소 작아 보이지만 오버 헤드가 적기 때문에 단일 개체가되고 다른 개체를 저장할 수는 없습니다.

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 
4

밝혀졌습니다. 내 문제를 해결했습니다. 다음을 사용 :

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

실질적으로 내 모델의 크기가 줄어 듭니다.

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> 
관련 문제