R로 빌드 된 모델 재사용


82

R에서 모델을 빌드 할 때 새 데이터에서 재사용 할 수 있도록 모델 사양을 어떻게 저장합니까? 과거 데이터에 대한 로지스틱 회귀를 작성했지만 다음 달까지 새로운 관측치가 없다고 가정 해 보겠습니다. 최선의 접근 방법은 무엇입니까?

내가 고려한 사항 :

  • 모델 객체 저장 및 새 세션에서로드
  • 일부 모델은 PMML로 내보낼 수 있지만 실제로 PMML 가져 오기에 대해 아무것도 보지 못했습니다.

간단히 말해서 새 세션에서 모델을 사용해야 할 때 수행하는 작업을 이해하려고합니다.

미리 감사드립니다.


글쎄, 당신은 모델 식 "저장"항상 할 수 있으며, 데이터 업데이트 제공 data... 내가 제대로 이해 가정 ... 인수
aL3xa

흠, 재사용이란 무엇을 의미합니까? 새로운 관측치를 예측하거나 새로운 관측치와 이전 관측치를 사용하도록 모델 적합도를 업데이트 하시겠습니까?
Gavin Simpson

@Gavin. 개발 한 모델을 사용하여 아직 가지고 있지 않은 데이터에 대한 새로운 가치를 예측하고 싶습니다.
Btibert3

1
@ Bitbert3 좋아, 내 대답의 시작 부분은 내가 할 일입니다. 모델 객체를 디스크 에 저장하는 것은 허용되는 것 이상 이지만 연구 / 모델링을 재현 할 수 있도록 처음에 모델을 생성하는 데 사용 된 R 코드 / 스크립트를 저장하는 것이 중요합니다.
Gavin Simpson

답변:


143

새로운 관측치를 예측하기 위해 모델 재사용

모델이 계산적으로 비용이 많이 들지 않으면 필요할 때 다시 실행하는 R 스크립트에 전체 모델 구축 프로세스를 문서화하는 경향이 있습니다. 모델 피팅에 임의의 요소가 포함 된 경우 알려진 임의의 시드를 설정해야합니다.

모델이 계산하는 데 계산 비용이 많이 든다면 위와 같이 여전히 스크립트를 사용하지만 save()into 및 rda 개체를 사용하여 모델 개체를 저장 합니다. 그런 다음 저장된 객체가 있으면로드하거나 그렇지 않은 경우 if()...else코드의 관련 부분을 감싸는 간단한 절을 사용하여 모델을 다시 맞추도록 스크립트를 수정하는 경향이 있습니다.

저장된 모델 객체를로드 할 때 필요한 패키지를 모두 다시로드해야합니다.하지만 귀하의 경우에는 로짓 모델이 적합하다면 glm()R을 넘어서로드 할 추가 패키지가 없습니다.

다음은 그 예입니다.

> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> ## save this model
> save(m1, file = "my_model1.rda")
> 
> ## a month later, new observations are available: 
> newdf <- data.frame(x = rnorm(20))
> ## load the model
> load("my_model1.rda")
> ## predict for the new `x`s in `newdf`
> predict(m1, newdata = newdf)
        1         2         3         4         5         6 
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255 
        7         8         9        10        11        12 
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537 
       13        14        15        16        17        18 
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407 
       19        20 
5.4247548 2.6906722 

이것을 자동화하려면 스크립트에서 다음을 수행 할 것입니다.

## data
df <- data.frame(x = rnorm(20))
df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))

## check if model exists? If not, refit:
if(file.exists("my_model1.rda")) {
    ## load model
    load("my_model1.rda")
} else {
    ## (re)fit the model
    m1 <- lm(y ~ x, data = df)
}

## predict for new observations
## new observations
newdf <- data.frame(x = rnorm(20))
## predict
predict(m1, newdata = newdf)

물론 데이터 생성 코드는 실제 데이터를로드하는 코드로 대체됩니다.

이전에 피팅 된 모델을 새로운 관측치로 업데이트

추가 새 관측치를 사용하여 모델을 다시 적합시키려는 경우. 다음 update()은 유용한 기능입니다. 업데이트 된 모델 인수 중 하나 이상을 사용하여 모델을 다시 맞추기 만하면됩니다. 모델을 맞추는 데 사용되는 데이터에 새 관찰을 포함하려면 인수에 전달 된 데이터 프레임에 새 관찰을 추가 'data'한 후 다음을 수행합니다.

m2 <- update(m1, . ~ ., data = df)

어디에 m1원래 저장된 모형 적합 . ~ .이 경우에도 수단의 왼쪽과 오른쪽 양쪽에 모두 존재하는 변수 포함 모델 식 변경된다 ~(즉, 모델 식을 변경하지 않음)과 df는 IS 원래 모델을 맞추는 데 사용되는 데이터 프레임으로, 새로 사용 가능한 관측치를 포함하도록 확장되었습니다.

다음은 작동하는 예입니다.

> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> m1

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.960        2.222  

> 
> ## new observations
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
> ## add on to df
> df <- rbind(df, newdf)
> 
> ## update model fit
> m2 <- update(m1, . ~ ., data = df)
> m2

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.928        2.187

다른 사람들은 주석 formula()에서 언급했으며 피팅 된 모델에서 공식을 추출합니다.

> formula(m1)
y ~ x
> ## which can be used to set-up a new model call
> ## so an alternative to update() above is:
> m3 <- lm(formula(m1), data = df)

그러나 모델 피팅에와 같은 추가 인수 'family'또는 'subset'더 복잡한 모델 피팅 함수의 인수가 포함되는 경우. update()모델 피팅 함수에 메서드를 사용할 수있는 경우 (예 :과 같은 많은 일반적인 피팅 함수에 사용됨 glm()) 모델 수식을 추출하고 재사용하는 것보다 모델 피팅을 업데이트하는 더 간단한 방법을 제공합니다.

R에서 모든 모델링과 미래 예측을 수행하려는 경우 PMML 또는 이와 유사한 것을 통해 모델을 추상화하는 데는 별 의미가 없어 보입니다.


1
+1 당신이 친절에 맞게 답을 편집에서 저항한다면 어떤에서 내가 준비하고 답변 ... ;-)
요리스 MEYS

@Joris는 암캐를 예지하지 않습니다! ;-) +1 update나를 위해
Gavin Simpson

1
이것은 정말 좋은 대답입니다. 누군가가 이와 같은 SO [r] 답변을 큐레이팅하고 튜토리얼로 함께 모았 으면합니다.
JD Long

1
훌륭한 대답입니다. 당신이 준 예에 감사드립니다.
nhern121

1
내가 찾던 바로 그것. +1000을하고 싶습니다 ... 감사합니다
Adjeiinfo 2015-08-25

7

데이터 프레임과 변수의 동일한 이름을 사용하는 경우 저장된 모델 에서 함수 를 사용할 수 있습니다 (최소한 lm()및에 대해 glm()) update.

Df <- data.frame(X=1:10,Y=(1:10)+rnorm(10))

model <- lm(Y~X,data=Df)
model

Df <- rbind(Df,data.frame(X=2:11,Y=(10:1)+rnorm(10)))

update(model)

이것은 데이터 등을 준비하지 않고 코스를 벗어났습니다. 모델 사양 세트 만 재사용합니다. 그 동안 대비를 변경하면 새 모델이 이전 대비가 아닌 새 대비로 업데이트됩니다.

따라서 대부분의 경우 스크립트를 사용하는 것이 더 나은 대답입니다. 하나는 데이터 프레임 만 취하는 편리한 함수의 모든 단계를 포함 할 수 있으므로 스크립트를 소싱 한 다음 새 데이터 세트에서 함수를 사용할 수 있습니다. 이에 대한 Gavin의 답변도 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.