2013-03-06 12 views
10

Esiste un modo per 'comprimere' un oggetto della classe LM, in modo che possa salvarlo sul disco e caricarlo in seguito per l'utilizzo con predict.lm?C'è un modo per "comprimere" un oggetto lm() per la previsione successiva?

Ho un oggetto lm che risulta essere ~ 142mb al momento del salvataggio, e ho difficoltà a credere che predict.lm abbia bisogno di tutte le osservazioni originali/valori adattati/residui ecc. Per fare una previsione lineare. Posso rimuovere le informazioni in modo che il modello salvato sia più piccolo?

ho provato a fissare alcune delle variabili (fitted.values, residui, ecc) per NA, ma sembra non avere alcun effetto sulle dimensioni del file salvato.

+2

Inoltre, nello spirito di [questo] (http://stackoverflow.com/questions/2929776/how-to-save-a-fitted-r-model-for-later-use?rq= 1) domanda, ho provato a impostare 'model = FALSE' ma non ha avuto alcun effetto notevole. –

+1

Se i big data stanno causando il tuo problema allora 'biglm' potrebbe essere la risposta. Un oggetto della classe 'biglm' è più piccolo di' lm', e ci sono altri 'efficienze grandi data' – mnel

+0

In realtà il problema non è la dimensione dei dati in memoria, è la velocità che cercavo con la previsione() funzione. Il mio script stava creando un modello aggiornato di notte che veniva chiamato tramite RPy2 per fare previsioni per gli utenti finali. Con il modello 142mb, ci voleva del tempo per caricare ogni richiesta. –

risposta

6

È possibile utilizzare biglm per adattarsi ai modelli, un oggetto modello biglm è minore di un oggetto modello lm. È possibile utilizzare predict.biglm per creare una funzione a cui è possibile passare la matrice di design newdata, che restituisce i valori previsti.

Un'altra opzione è utilizzare saveRDS per salvare i file, che sembrano essere leggermente più piccoli, in quanto hanno meno overhead, essendo un singolo oggetto, non come il salvataggio che può salvare più oggetti.

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

Risulta ho risolto il mio problema. Utilizzando il seguente:

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

ha ridotto notevolmente le dimensioni del mio modello.

6

Un paio di cose:

  1. Questa domanda è davvero un duplicato.

  2. in senso stretto model=FALSE come è stato già risposto in un'altra domanda.

  3. In un senso più ampio, predict(fit, newdata) in realtà solo fa una moltiplicazione matrice-vettore in modo si potrebbe risparmiare solo il vettore di previsioni e moltiplicarlo con una matrice.

  4. Ci sono funzioni di montaggio alternative. Di seguito è riportato un esempio da fastLm() in RcppArmadillo che risulta essere anche più veloce.

Vedere sotto per un'illustrazione.

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> 
Problemi correlati