R Dahili Bir Modeli Yeniden Kullanma


83

R'de bir model oluştururken, model özelliklerini yeni verilerde yeniden kullanabileceğiniz şekilde nasıl kaydedersiniz? Diyelim ki tarihsel veriler üzerine lojistik bir regresyon oluşturdum, ancak gelecek aya kadar yeni gözlemlerim olmayacak. En iyi yaklaşım nedir?

Düşündüğüm şeyler:

  • Model nesnesini kaydetme ve yeni bir oturuma yükleme
  • Bazı modellerin PMML ile dışa aktarılabildiğini biliyorum, ancak PMML'yi içe aktarma konusunda gerçekten hiçbir şey görmedim

Basitçe, modelinizi yeni bir oturumda kullanmanız gerektiğinde ne yaptığınız hakkında bir fikir edinmeye çalışıyorum.

Şimdiden teşekkürler.


Her zaman bir model formülü "kaydedebilir" ve dataargümanda güncellenmiş verileri sağlayabilirsiniz ... sizi doğru anladığımı varsayarak ...
aL3xa

Hmm, yeniden kullanımla ne demek istiyorsun? Yeni gözlemler için öngörüde bulunmak veya yeni gözlemler artı eskileri kullanmak için modeli güncellemek mi?
Gavin Simpson

@Gavin. Henüz sahip olmadığım ve bir süredir sahip olamadığım veriler üzerinde yeni değerleri tahmin etmek için geliştirdiğim modeli kullanmak istiyorum.
Btibert3

1
@ Bitbert3 Tamam, o zaman cevabımın açılış bölümü ne yapardım. Model nesnesinin diske kaydedilmesi kabul edilebilir olandan daha fazlasıdır, ancak araştırmanızın / modellemenizin yeniden üretilebilir olması için modeli oluşturmak için kullanılan R kodunu / komut dosyasını ilk etapta kaydetmek önemlidir.
Gavin Simpson

Yanıtlar:


144

Yeni gözlemleri tahmin etmek için bir modeli yeniden kullanma

Model hesaplama açısından maliyetli değilse, tüm model oluşturma sürecini gerektiğinde yeniden çalıştırdığım bir R betiğinde belgeleme eğilimindeyim. Model uydurmada rastgele bir öğe varsa, bilinen bir rastgele tohum ayarladığımdan emin olurum.

Model hesaplama açısından maliyetli ise, yine de yukarıdaki gibi bir komut dosyası kullanıyorum, ancak save()into ve rda nesnesini kullanarak model nesnelerini dışarıda bırakıyorum. Daha sonra if()...else, kodun ilgili kısımlarının etrafına sarılmış basit bir cümle kullanarak, kaydedilen nesne varsa, onu yükleyecek veya yoksa modeli yeniden yerleştirecek şekilde komut dosyasını değiştirme eğilimindeyim .

Kaydedilmiş model nesnenizi yüklerken, gerekli paketleri yeniden yüklediğinizden emin olun, ancak sizin durumunuzda logit modeli aracılığıyla uygunsa, glm()R'nin ötesinde yüklenecek ek paketler olmayacaktır.

İşte bir örnek:

> 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 

Bunu otomatikleştirmek istiyorsanız, muhtemelen bir komut dosyasında aşağıdakileri yapardım:

## 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)

Tabii ki, veri oluşturma kodu, gerçek verilerinizi yükleyen kodla değiştirilecektir.

Önceden takılmış bir modeli yeni gözlemlerle güncelleme

Ek yeni gözlemler kullanarak modeli yeniden takmak istiyorsanız. O zaman update()kullanışlı bir işlevdir. Tek yaptığı, güncellenen bir veya daha fazla model argümanıyla modeli yenilemek. Modeli uydurmak için kullanılan verilere yeni gözlemler eklemek istiyorsanız, yeni gözlemleri bağımsız değişkene iletilen veri çerçevesine ekleyin 'data've ardından aşağıdakileri yapın:

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

nerede m1, orijinal, kaydedilmiş model uyum olduğu . ~ .bu durumda araç sol ve sağ taraflarında mevcut tüm değişkenler içerir modeli formülü değişiklikleri, olduğu ~(diğer bir deyişle, modelin formüle hiçbir değişiklik) ve dfbir orijinal modele uymak için kullanılan veri çerçevesi, yeni mevcut gözlemleri içerecek şekilde genişletildi.

İşte çalışan bir örnek:

> 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

Diğerleri formula(), formülü yerleştirilmiş bir modelden çıkaran yorumlarda bahsetti :

> 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)

Bununla birlikte, model uydurma daha karmaşık model uydurma işlevlerinde gibi ek bağımsız değişkenler 'family'veya 'subset'bağımsız değişkenler içeriyorsa . Eğer update()yöntemleri (gibi onlar, birçok ortak uydurma fonksiyonları için hangi modeliniz uydurma fonksiyonu için kullanılabilir glm()), bu ayıklanması ve model formülünü yeniden daha model uyumunu güncellemek için daha basit bir yol sağlar.

Tüm modellemeyi ve gelecek tahminini R'de yapmayı düşünüyorsanız, modeli PMML veya benzeri bir yöntemle soyutlamanın pek bir anlamı yok gibi görünüyor.


1
+1 ve hazırladığım cevaba uyacak şekilde cevaplarınızı düzenlemekten lütfen
direnirseniz

@Joris bir orospu önceden tanıma değil! ;-) +1 updatebenden
Gavin Simpson

1
Bu gerçekten harika bir cevap. Umarım birisi bunun gibi SO [r] yanıtlarını seçer ve bunları öğretici olarak bir araya getirir.
JD Long

1
Mükemmel cevap. Verdiğiniz örnekler için teşekkürler.
nhern121

1
Tam olarak aradığım şey. +1000 yapmak istiyorum ... Teşekkürler
Adjeiinfo

7

Dataframe ve değişkenlerin aynı adını kullanırsanız , kaydedilen modelde işlevi (en azından lm()ve için glm()) kullanabilirsiniz 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)

Bu, herhangi bir veri hazırlığı olmadan doğaldır. Sadece model özellikleri setini yeniden kullanır. Bu arada kontrastları değiştirirseniz, yeni modelin eskisiyle değil, yeni kontrastlarla güncelleneceğini unutmayın.

Bu nedenle, bir komut dosyasının kullanılması çoğu durumda daha iyi cevaptır. Biri, yalnızca veri çerçevesini alan bir kolaylık işlevindeki tüm adımları içerebilir, böylece komut dosyasını kaynak haline getirebilir ve ardından işlevi herhangi bir yeni veri kümesinde kullanabilirsiniz. Bunun için Gavin'in cevabına da bakınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.