आर में निर्मित मॉडल का पुन: उपयोग


82

आर में एक मॉडल का निर्माण करते समय, आप मॉडल विनिर्देशों को कैसे बचाते हैं जैसे कि आप इसे नए डेटा पर पुन: उपयोग कर सकते हैं? मान लीजिए कि मैं ऐतिहासिक डेटा पर एक लॉजिस्टिक प्रतिगमन का निर्माण करता हूं, लेकिन अगले महीने तक नए अवलोकन नहीं होंगे। सबसे अच्छा तरीका क्या है?

चीजें जो मैंने मानी हैं:

  • नए सत्र में मॉडल ऑब्जेक्ट को सहेजना और लोड करना
  • मुझे पता है कि कुछ मॉडल PMML के साथ निर्यात किए जा सकते हैं, लेकिन वास्तव में PMML आयात करने के बारे में कुछ भी नहीं देखा है

बस, मैं यह समझने की कोशिश कर रहा हूं कि नए सत्र में आपको अपने मॉडल का उपयोग करने की आवश्यकता क्या है।

अग्रिम में धन्यवाद।


ठीक है, आप हमेशा एक मॉडल सूत्र को "सेव" कर सकते हैं, और dataतर्क में अद्यतन डेटा प्रदान कर सकते हैं ... यह मानते हुए कि मैंने आपको सही ढंग से समझा ...
aL3xa

हम्म, आपको फिर से उपयोग करने से क्या मतलब है? नई टिप्पणियों के लिए भविष्यवाणी करें या नए अवलोकन का उपयोग करने के लिए मॉडल को अपडेट करें और पुराने वाले?
गेविन सिम्पसन

@Gavin। मैं उस मॉडल का उपयोग करना चाहता हूं जो मैंने डेटा पर नए मूल्यों की भविष्यवाणी करने के लिए विकसित किया है जो मेरे पास अभी तक नहीं है और कुछ समय के लिए नहीं हो सकता है।
बत्तीबर्ट 3

1
@ Bitbert3 ठीक है, तो मेरे उत्तर का शुरुआती भाग वही है जो मैं करूँगा। डिस्क से मॉडल ऑब्जेक्ट को सहेजना स्वीकार्य से अधिक है, लेकिन पहली जगह में मॉडल उत्पन्न करने के लिए उपयोग किए जाने वाले आर कोड / स्क्रिप्ट को सहेजना महत्वपूर्ण है ताकि आपका शोध / मॉडलिंग प्रतिलिपि प्रस्तुत करने योग्य हो।
गैविन सिम्पसन

जवाबों:


144

नई टिप्पणियों के लिए भविष्यवाणी करने के लिए एक मॉडल का पुन: उपयोग करना

यदि मॉडल कम्प्यूटेशनल रूप से महंगा नहीं है, तो मैं एक आर स्क्रिप्ट में पूरी मॉडल निर्माण प्रक्रिया का दस्तावेजीकरण करता हूं जिसे मैं जरूरत पड़ने पर पुन: चलाता हूं। यदि एक यादृच्छिक तत्व मॉडल फिटिंग में शामिल है, तो मैं एक ज्ञात यादृच्छिक बीज सेट करना सुनिश्चित करता हूं।

यदि मॉडल कम्प्यूटेशनल रूप से गणना करने के लिए महंगा है, तो मैं अभी भी ऊपर के रूप में एक स्क्रिप्ट का उपयोग करता हूं, लेकिन मॉडल ऑब्जेक्ट save()को रेडा और आरडीए ऑब्जेक्ट का उपयोग करके बचा सकता हूं । मैं तब स्क्रिप्ट को संशोधित करने के लिए ऐसा करता हूं कि यदि सहेजे गए ऑब्जेक्ट मौजूद हैं, तो इसे लोड करें, या यदि नहीं, तो if()...elseकोड के संबंधित भागों के चारों ओर लिपटे एक साधारण क्लॉज का उपयोग करके, मॉडल को परिष्कृत करें ।

अपने सहेजे गए मॉडल ऑब्जेक्ट को लोड करते समय, किसी भी आवश्यक पैकेज को फिर से लोड करना सुनिश्चित करें, हालांकि आपके मामले में अगर लॉगिट मॉडल के माध्यम से फिट थे, तो glm()आर से परे लोड करने के लिए कोई अतिरिक्त पैकेज नहीं होगा।

यहाँ एक उदाहरण है:

> 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है डेटा मॉडल का उपयोग मूल मॉडल को फिट करने के लिए किया जाता है, जिसमें नए उपलब्ध अवलोकन शामिल हैं।

यहाँ एक काम कर उदाहरण है:

> 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()), तो यह मॉडल फॉर्मूला निकालने और पुन: उपयोग करने की तुलना में किसी मॉडल को फिट करने के लिए एक सरल तरीका प्रदान करता है।

यदि आप आर में सभी मॉडलिंग और भविष्य की भविष्यवाणी करने का इरादा रखते हैं, तो वास्तव में PMML या इसी तरह के माध्यम से मॉडल को अमूर्त करने में कोई मतलब नहीं है।


1
+1 और यदि आप कृपया मेरे उत्तरों को संपादित करने से
रोकेंगे

@ जॉरिस एक कुतिया की पहचान नहीं है! ;-) updateमेरे लिए
गेविन सिम्पसन

1
यह एक बहुत अच्छा जवाब है। मुझे आशा है कि किसी ने SO [r] को इस तरह उत्तर दिया है और उन्हें एक ट्यूटोरियल के रूप में एक साथ रखा है।
जद लॉन्ग

1
बहुत बढ़िया जवाब। आपके द्वारा दिए गए उदाहरणों के लिए धन्यवाद।
nhern121

1
ठीक वही जो मेरे द्वारा खोजा जा रहा था। मैं +1000 करना चाहता हूं ... धन्यवाद
Adjeiinfo

7

आप dataframe और चर का एक ही नाम का उपयोग करते हैं, तो आप (के लिए कम से कम कर सकते हैं 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)

यह डेटा की तैयारी के बिना और इसके बाद से बंद है। यह सिर्फ मॉडल विनिर्देशों सेट का पुन: उपयोग करता है। ध्यान रखें कि यदि आप इस बीच विरोधाभासों को बदलते हैं, तो नया मॉडल नए विरोधाभासों के साथ अपडेट हो जाता है, पुराना नहीं।

इसलिए पटकथा का उपयोग ज्यादातर मामलों में बेहतर जवाब है। एक सुविधा फ़ंक्शन में सभी चरण शामिल हो सकते हैं जो सिर्फ डेटाफ़्रेम लेता है, इसलिए आप स्क्रिप्ट को स्रोत कर सकते हैं और फिर किसी भी नए डेटासेट पर फ़ंक्शन का उपयोग कर सकते हैं। इसके लिए गैविन का जवाब भी देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.