R에서 모델을 빌드 할 때 새 데이터에서 재사용 할 수 있도록 모델 사양을 어떻게 저장합니까? 과거 데이터에 대한 로지스틱 회귀를 작성했지만 다음 달까지 새로운 관측치가 없다고 가정 해 보겠습니다. 최선의 접근 방법은 무엇입니까?
내가 고려한 사항 :
- 모델 객체 저장 및 새 세션에서로드
- 일부 모델은 PMML로 내보낼 수 있지만 실제로 PMML 가져 오기에 대해 아무것도 보지 못했습니다.
간단히 말해서 새 세션에서 모델을 사용해야 할 때 수행하는 작업을 이해하려고합니다.
미리 감사드립니다.
답변
새로운 관측치를 예측하기 위해 모델 재사용
모델이 계산적으로 비용이 많이 들지 않으면 필요할 때 다시 실행하는 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 또는 이와 유사한 것을 통해 모델을 추상화하는 데는 별 의미가 없어 보입니다.
답변
데이터 프레임과 변수의 동일한 이름을 사용하는 경우 저장된 모델 에서 함수 를 사용할 수 있습니다 (최소한 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의 답변도 참조하십시오.