2013-03-06 3 views
10

Gibt es eine Möglichkeit, ein Objekt der Klasse lm zu "komprimieren", so dass ich es auf der Festplatte speichern und später zur Verwendung mit predict.lm laden kann?Gibt es eine Möglichkeit, ein lm() - Objekt zur späteren Vorhersage zu "komprimieren"?

Ich habe ein lm-Objekt, das beim Speichern ~ 142mb wird, und ich habe eine harte Zeit zu glauben, dass predict.lm alle ursprünglichen Beobachtungen/angepasste Werte/Residuen usw. benötigt, um eine lineare Vorhersage zu treffen. Kann ich Informationen entfernen, sodass das gespeicherte Modell kleiner ist?

Ich habe versucht, einige der Variablen (passte.Values, Residuen usw.) auf NA zu setzen, aber es scheint keine Auswirkung auf die gespeicherte Dateigröße zu haben.

+2

Auch im Geist der [diese] (http://stackoverflow.com/questions/2929776/how-to-save-a-fitted-r-model-for-later-use?rq= 1) Frage, ich habe versucht, "Modell = FALSE", aber das hatte keine spürbare Wirkung. –

+1

Wenn große Daten Ihr Problem verursachen, dann kann 'biglm' die Antwort sein. Ein Objekt der Klasse 'biglm' ist kleiner als' lm', und es gibt andere 'big data' Effizienzen. – mnel

+0

Eigentlich ist das Problem nicht die Größe der Daten im Speicher, es ist die Geschwindigkeit, die ich mit der Vorhersage() gesucht habe. Funktion. Mein Skript erstellte ein nächtlich aktualisiertes Modell, das über RPy2 aufgerufen wurde, um Vorhersagen für Endbenutzer zu treffen. Mit dem 142 MB-Modell dauerte es ewig, um jede Anfrage zu laden. –

Antwort

6

Sie können biglm verwenden, um Ihre Modelle anzupassen, ein biglm Modellobjekt ist kleiner als ein LM-Modellobjekt. Sie können predict.biglm verwenden, um eine Funktion zu erstellen, der Sie die Newdata-Entwurfsmatrix übergeben können, die die vorhergesagten Werte zurückgibt.

Eine andere Option ist saveRDS zu verwenden, um die Dateien zu speichern, die etwas kleiner zu sein scheinen, da sie weniger Aufwand haben, ein einzelnes Objekt, nicht wie Speichern, das mehrere Objekte speichern kann.

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

Stellt sich heraus, dass ich mein eigenes Problem gelöst habe. Verwenden Sie Folgendes:

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

reduziert die Größe meines Modells erheblich.

6

Ein paar Dinge:

  1. Diese Frage ist wirklich ein Duplikat.

  2. Im engeren Sinne model=FALSE wie bereits in einer anderen Frage beantwortet wurde.

  3. Im weiteren Sinne, tut predict(fit, newdata) wirklich nur eine Matrix-Vektor-Multiplikation, so dass Sie nur den Vektor der Prognosen und multiplizieren sie mit einer Matrix retten können.

  4. Es gibt alternative Anpassungsfunktionen. Unten ist ein Beispiel von fastLm() in RcppArmadillo, die auch passiert, schneller zu sein.

Siehe unten für eine Illustration.

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> 
Verwandte Themen