2014-02-20 2 views
7

lm()을 2 개의 예측 변수가있는 50M + 관측치가있는 큰 데이터 세트에 실행하고 싶습니다. 분석은 데이터 저장을위한 10GB 만있는 원격 서버에서 실행됩니다. 데이터에서 샘플링 된 10K 관측치에서 'lm() '을 테스트했으며 결과 객체의 크기는 2GB +였습니다.클래스 "lm"의 객체 크기를 최소화하는 방법 predict()에 전달되는 것을 손상시키지 않고

나는 ONLY 모델 (summary(lm_object))의 요약 통계를 생산하고 (predict(lm_object)를) 예측을 할 lm()에서 반환 된 클래스 "LM"의 목적을해야합니다.

model, x, y, qrlm 인 일부 실험을 수행했습니다. 내가 FALSE에 그들 모두를 설정하면 나는

library(MASS) 
fit1=lm(medv~lstat,data=Boston) 
size1 <- object.size(fit1) 
print(size1, units = "Kb") 
# 127.4 Kb bytes 
fit2=lm(medv~lstat,data=Boston,model=F,x=F,y=F,qr=F) 
size2 <- object.size(fit2) 
print(size2, units = "Kb") 
# 78.5 Kb Kb bytes 
- ((as.integer(size1) - as.integer(size2))/as.integer(size1)) * 100 
# -38.37994 

하지만

summary(fit2) 
# Error in qr.lm(object) : lm object does not have a proper 'qr' component. 
# Rank zero or should not have used lm(.., qr=FALSE). 
predict(fit2,data=Boston) 
# Error in qr.lm(object) : lm object does not have a proper 'qr' component. 
# Rank zero or should not have used lm(.., qr=FALSE). 

가 분명히 나는 ​​기본 객체와 비교하면 9 %로 객체의 크기를 줄일 수 qr=TRUE을 유지할 필요가 38 %로 크기를 줄일

fit3=lm(medv~lstat,data=Boston,model=F,x=F,y=F,qr=T) 
size3 <- object.size(fit3) 
print(size3, units = "Kb") 
# 115.8 Kb 
- ((as.integer(size1) - as.integer(size3))/as.integer(size1)) * 100 
# -9.142752 

어떻게 메모리와 저장에 불필요한 많은 정보를 덤핑없이 최소로 "LM"개체의 크기를 가지고 있습니까?

+0

+1 흥미로운 질문입니다. 아직 각 옵션을 직접 사용하지 않으려하지 않으셨습니까? 그런데 TRUE와 FALSE를 쓰는 것이 더 안전합니다. 나중에 이름을 잊어 버리고 변수를 만들 수 있습니다. – Frank

+2

답변을 찾을 수 있으리라 확신합니다. http://stackoverflow.com/questions/15260429/is-there-a-way-to-compress-an-lm-class-for-later-prediction/15260950#15260950 또는 거기에 링크되어있는 질문들 중 하나 – mnel

+1

단지 l00만이 1 천만 개의 관측치를 사용하여 2GB 객체가 될 수있는 것을 보지 못했습니다.데이터 집합에 몇 개의 열이 있습니까? –

답변

0

저는 같은 문제도 다루려고합니다. 내가 사용하는 다른 것들에 대해 완벽하지 않지만 예측 작동, 당신은 기본적으로 LM에 QR 슬롯의 QR 슬롯을 수행 할 수 있습니다

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 

as.numeric((object.size(lmFull) - object.size(lmSlim))/object.size(lmFull)) 
[1] 0.6550523 
4

링크는 여기에있다 GLM 객체에 대한 (관련 답변을 제공합니다 매우 출력물과 비슷하다).

http://www.win-vector.com/blog/2014/05/trimming-the-fat-from-glm-models-in-r/

기본적 만 GLM 출력의 매우 작은 부분이고, 계수 부를 사용하여 예측한다. 아래 (링크에서 복사) 함수는 예측에 사용되지 않는 정보를 자릅니다.

하지만주의해야합니다. 트리밍 후에는 요약 (적합) 또는 기타 요약 함수로 사용할 수 없으므로 해당 함수가 필요로하는 것보다 더 많은 것을 필요로합니다.

cleanModel1 = function(cm) { 
    # just in case we forgot to set 
    # y=FALSE and model=FALSE 
    cm$y = c() 
    cm$model = c() 

    cm$residuals = c() 
    cm$fitted.values = c() 
    cm$effects = c() 
    cm$qr = c() 
    cm$linear.predictors = c() 
    cm$weights = c() 
    cm$prior.weights = c() 
    cm$data = c() 
    cm 
} 
+0

이 기사는 99.7 %의 감소 (작은 모델의 경우)에서 99.985 %의 감소 (큰 경우)를 주장합니다. 또한,'summary (fit2)'를하고 모델을 트리밍하기 전에 텍스트 파일에 저장하십시오. – smci

+0

최근에 테스트 한 결과 출력 객체의 요소 또는 하위 요소를 더 축소 할 수 있으며 각 요소 중 하나만 비워 두어 결과가 predict()에 여전히 사용되면 결과를 사용하면됩니다. 다른 한편으로, 객체의 유일한 유용한 부분은 $ coefficient에 맞습니다. 부트 스트랩 연습에서 모델을 1000 번 다시 장착하고 예측 계수 만 저장하면 1000mm 결과 개체를 저장하는 것보다 훨씬 많은 메모리를 절약 할 수 있습니다. – xappppp

0

xappp의 답은 좋지만 전체적인 이야기는 아닙니다. 당신에 대해 뭔가를 할 수있는 거대한 환경 변수도있다 (참조 : https://blogs.oracle.com/R/entry/is_the_size_of_your를)

중 하나가 xappp의 기능

 e <- attr(cm$terms, ".Environment") 
    parent.env(e) <- emptyenv() 
    rm(list=ls(envir=e), envir=e) 

이 추가 또는 적은 데이터를 감소하지만 여전히 요약을 사용할 수 있습니다이 버전을 사용 ()

 cleanModel1 = function(cm) { 
     # just in case we forgot to set 
     # y=FALSE and model=FALSE 
     cm$y = c() 
     cm$model = c() 

     e <- attr(cm$terms, ".Environment") 
     parent.env(e) <- emptyenv() 
     rm(list=ls(envir=e), envir=e) 
     cm 
     }