2013-03-06 13 views
10

Czy istnieje sposób "skompresowania" obiektu klasy lm, aby można go było zapisać na dysku i załadować go później w celu użycia z predict.lm?Czy istnieje sposób kompresowania obiektu lm() w celu późniejszego przewidywania?

Mam obiekt Lm, który kończy się być ~ 142mb po zapisaniu, i trudno mi uwierzyć, że predict.lm potrzebuje wszystkich oryginalnych obserwacji/dopasowanych wartości/pozostałości itp., Aby przewidzieć liniowy. Czy mogę usunąć informacje, aby zapisany model był mniejszy?

Próbowałem ustawić niektóre zmienne (dopasowane. Wartości, reszty, itp.) Na NA, ale wydaje się, że nie mają one wpływu na zapisany rozmiar pliku.

+2

Również w duchu [to], (http://stackoverflow.com/questions/2929776/how-to-save-a-fitted-r-model-for-later-use?rq= 1) pytanie, próbowałem ustawić 'model = FALSE', ale który nie miał zauważalnego efektu. –

+1

Jeśli duże dane powodują Twój problem, może to być "biglm". Obiekt klasy 'biglm' jest mniejszy niż' lm', a istnieją inne 'duże dane' efektywność – mnel

+0

W rzeczywistości problem nie jest wielkości danych w pamięci, jest to szybkość, której szukałem za pomocą funkcji przewidywania() funkcjonować. Mój skrypt tworzył model aktualizowany co noc, który był wywoływany za pośrednictwem RPy2, aby tworzyć prognozy dla użytkowników końcowych. W modelu 142 mb pobieranie każdej prośby trwało wiecznie. –

Odpowiedz

6

Możesz użyć biglm, aby dopasować swoje modele, obiekt modelu biglm jest mniejszy niż obiekt modelu LM. Możesz użyć predict.biglm utworzyć funkcję, do której możesz przekazać matrycę projektowania newdata, która zwraca przewidywane wartości.

Inną opcją jest użycie saveRDS do zapisania plików, które wydają się być nieco mniejsze, ponieważ mają mniej narzutów, jako pojedynczy obiekt, a nie jak zapis, który może zapisać wiele obiektów.

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

Okazało się, że rozwiązałem swój własny problem. Używanie:

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

znacznie zmniejszyło rozmiar mojego modelu.

6

Kilka rzeczy:

  1. To pytanie naprawdę jest duplikatem.

  2. W wąskim znaczeniu: model=FALSE, jak już udzielono odpowiedzi w innym pytaniu.

  3. W szerszym sensie predict(fit, newdata) naprawdę robi mnożenia macierzy wektor więc można zaoszczędzić tylko wektor przewidywaniami i pomnożyć go z matrycy.

  4. Istnieją alternatywne funkcje dopasowania. Poniżej znajduje się przykład z fastLm() w RcppArmadillo, który również jest szybszy.

Zobacz ilustrację poniżej.

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> 
Powiązane problemy