2014-07-15 9 views
12

मैंने समय-श्रृंखला डेटा के आधार पर भविष्यवाणी करने के लिए मशीन सीखने का उपयोग करने का प्रयास किया है।समय-श्रृंखला - डेटा विभाजन और मॉडल मूल्यांकन

library(caret) 
    library(ggplot2) 
    library(pls) 
    data(economics) 
    myTimeControl <- trainControl(method = "timeslice", 
            initialWindow = 36, 
            horizon = 12, 
            fixedWindow = TRUE) 

    plsFitTime <- train(unemploy ~ pce + pop + psavert, 
         data = economics, 
         method = "pls", 
         preProc = c("center", "scale"), 
         trControl = myTimeControl) 

मेरे समझ है:

  1. मैं करने के लिए डेटा हो सकता है विभाजित करने की आवश्यकता stackoverflow प्रश्न में से एक में (createTimeSlices function in CARET package in R) मॉडल प्रशिक्षण और पैरामीटर ट्यूनिंग के लिए पार सत्यापन करने के लिए createTimeSlices का उपयोग करने का एक उदाहरण है प्रशिक्षण और परीक्षण सेट।
  2. पैरामीटर ट्यूनिंग के लिए प्रशिक्षण सेट का उपयोग करें।
  3. परीक्षण सेट (आर 2, RMSE, आदि का उपयोग कर)

क्योंकि मेरे डेटा समय श्रृंखला है पर मॉडल प्राप्त मूल्यांकन, मुझे लगता है कि मैं प्रशिक्षण और परीक्षण सेट में डेटा spliting के लिए bootstraping उपयोग नहीं कर सकते। तो, मेरे प्रश्न हैं: क्या मैं सही हूँ? और यदि ऐसा है - मॉडल मूल्यांकन के लिए createTimeSlices का उपयोग कैसे करें?

+1

अगर आप परिभाषित आप "मॉडल मूल्यांकन" क्या मतलब है यह मदद मिलेगी। – topepo

+0

मैंने अपना प्रश्न संपादित कर लिया है। शायद अभी समझना आसान है? –

+1

1. पैकेज 'pls' को स्थापित करने की आवश्यकता है 2. यदि आप केवल नमूने के आदेश (महीने या वर्ष विशेष रूप से नहीं) के बारे में चिंतित हैं, तो आप उन्हें एक संख्यात्मक आईडी दे सकते हैं और आप अभी भी बूटस्ट्रैपिंग 3 का उपयोग कर सकते हैं। एक ग्लम के रूप में सरल कुछ का उपयोग क्यों नहीं करते? –

उत्तर

27

ध्यान दें कि आपके द्वारा पोस्ट किया गया मूल प्रश्न, समय की देखभाल करता है, और आपको समय-समय पर हाथों को बनाने की ज़रूरत नहीं है।

हालांकि, डेटा को विभाजित करने के लिए createTimeSlices का उपयोग करने के लिए और फिर मॉडल का प्रशिक्षण और परीक्षण करने के लिए इसका उपयोग करना है।

चरण 0: डेटा और trainControl की स्थापना: (अपने प्रश्न से)

library(caret) 
library(ggplot2) 
library(pls) 

data(economics) 

चरण 1: डेटा के सूचकांक के लिए timeSlices बनाना:

timeSlices <- createTimeSlices(1:nrow(economics), 
        initialWindow = 36, horizon = 12, fixedWindow = TRUE) 

यह एक सूची बनाता है प्रशिक्षण और परीक्षण समय स्लाइस।

> str(timeSlices,max.level = 1) 
## List of 2 
## $ train:List of 431 
## .. [list output truncated] 
## $ test :List of 431 
## .. [list output truncated] 

समझ में आसानी के लिए, मैं अलग चर में उन्हें बचत कर रहा हूँ:

trainSlices <- timeSlices[[1]] 
testSlices <- timeSlices[[2]] 

चरण 2: के पहले पर प्रशिक्षण trainSlices:

plsFitTime <- train(unemploy ~ pce + pop + psavert, 
        data = economics[trainSlices[[1]],], 
        method = "pls", 
        preProc = c("center", "scale")) 

चरण 3: पर परीक्षण trainSlices का पहला:

pred <- predict(plsFitTime,economics[testSlices[[1]],]) 

चरण 4: प्लॉटिंग:

true <- economics$unemploy[testSlices[[1]]] 

plot(true, col = "red", ylab = "true (red) , pred (blue)", ylim = range(c(pred,true))) 
points(pred, col = "blue") 

फिर आप सभी स्लाइस के लिए ऐसा कर सकते हैं:

for(i in 1:length(trainSlices)){ 
    plsFitTime <- train(unemploy ~ pce + pop + psavert, 
         data = economics[trainSlices[[i]],], 
         method = "pls", 
         preProc = c("center", "scale")) 
    pred <- predict(plsFitTime,economics[testSlices[[i]],]) 


    true <- economics$unemploy[testSlices[[i]]] 
    plot(true, col = "red", ylab = "true (red) , pred (blue)", 
      main = i, ylim = range(c(pred,true))) 
    points(pred, col = "blue") 
} 

जैसा कि पहले उल्लेख, timeSlicing की इस तरह एक कदम में अपने मूल कार्य द्वारा किया जाता है:

> myTimeControl <- trainControl(method = "timeslice", 
+        initialWindow = 36, 
+        horizon = 12, 
+        fixedWindow = TRUE) 
> 
> plsFitTime <- train(unemploy ~ pce + pop + psavert, 
+      data = economics, 
+      method = "pls", 
+      preProc = c("center", "scale"), 
+      trControl = myTimeControl) 
> plsFitTime 
Partial Least Squares 

478 samples 
    5 predictors 

Pre-processing: centered, scaled 
Resampling: Rolling Forecasting Origin Resampling (12 held-out with a fixed window) 

Summary of sample sizes: 36, 36, 36, 36, 36, 36, ... 

Resampling results across tuning parameters: 

    ncomp RMSE Rsquared RMSE SD Rsquared SD 
    1  1080 0.443  796  0.297  
    2  1090 0.43  845  0.295  

RMSE was used to select the optimal model using the smallest value. 
The final value used for the model was ncomp = 1. 

उम्मीद है कि इससे मदद मिलती है !!

+0

तो, अगर मैं कैरेट ट्रेन नियंत्रण का उपयोग कर रहा हूं तो डेटा को प्रशिक्षण और परीक्षण सेट में विभाजित करने की कोई ज़रूरत नहीं है? –

+2

सही। लिपि के लेखक यह भी कहते हैं कि वे अगले रिलीज में इस के दस्तावेज़ीकरण में सुधार करने जा रहे हैं। – Shambho

+0

वास्तव में भयानक प्रतिक्रिया - बहुत धन्यवाद, मैंने बहुत कुछ सीखा! – d8aninja

2

वास्तव में, आप कर सकते हैं!

सबसे पहले, मुझे आपको a scholarly article on the topic दें।

आर में:

पैकेज caret का उपयोग करना, createResample सरल बूटस्ट्रैप नमूने बनाने के लिए इस्तेमाल किया जा सकता और createFolds डेटा का एक सेट से संतुलित पार सत्यापन समूहों उत्पन्न करने के लिए इस्तेमाल किया जा सकता। तो आप शायद createResample का उपयोग करना चाहेंगे। यहाँ इसके उपयोग का एक उदाहरण है:

data(oil) 
createDataPartition(oilType, 2) 

x <- rgamma(50, 3, .5) 
inA <- createDataPartition(x, list = FALSE) 

plot(density(x[inA])) 
rug(x[inA]) 

points(density(x[-inA]), type = "l", col = 4) 
rug(x[-inA], col = 4) 

createResample(oilType, 2) 

createFolds(oilType, 10) 
createFolds(oilType, 5, FALSE) 

createFolds(rnorm(21)) 

createTimeSlices(1:9, 5, 1, fixedWindow = FALSE) 
createTimeSlices(1:9, 5, 1, fixedWindow = TRUE) 
createTimeSlices(1:9, 5, 3, fixedWindow = TRUE) 
createTimeSlices(1:9, 5, 3, fixedWindow = FALSE) 

मूल्यों आप createResample समारोह में देख डेटा और भाग की संख्या बनाने के लिए कर रहे हैं, इस मामले में 2. इसके अतिरिक्त आपके यदि परिणाम एक के रूप में संग्रहित किया जाना चाहिए निर्दिष्ट कर सकते हैं list = TRUE या list = FALSE के साथ सूची।

इसके अतिरिक्त, caret में createTimeSlices नामक एक फ़ंक्शन शामिल है जो इस प्रकार के विभाजन के लिए सूचकांक बना सकता है। बंटवारे के इस प्रकार के लिए

तीन मापदंडों हैं:

  • initialWindow: प्रत्येक प्रशिक्षण सेट नमूने में लगातार मूल्यों की प्रारंभिक संख्या
  • horizon: परीक्षण सेट नमूने में लगातार मानों की संख्या
  • fixedWindow: एक तार्किक: यदि गलत है, प्रशिक्षण सेट हमेशा पहले नमूने से शुरू होता है और प्रशिक्षण सेट आकार डेटा विभाजन पर भिन्न होगा।

उपयोग:

createDataPartition(y, 
        times = 1, 
        p = 0.5, 
        list = TRUE, 
        groups = min(5, length(y))) 
createResample(y, times = 10, list = TRUE) 
createFolds(y, k = 10, list = TRUE, returnTrain = FALSE) 
createMultiFolds(y, k = 10, times = 5) 
createTimeSlices(y, initialWindow, horizon = 1, fixedWindow = TRUE) 

सूत्रों का कहना है:

http://caret.r-forge.r-project.org/splitting.html

http://eranraviv.com/blog/bootstrapping-time-series-r-code/

http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=caret/man/createDataPartition.Rd&d=R_CC

CARET. Relationship between data splitting and trainControl

+0

क्या आप आर में एक उदाहरण दे सकते हैं? –

+0

@ जोटेन निश्चित। उन दो लिंक में उदाहरण हैं लेकिन मैं उन्हें सीधे समाधान में जोड़ दूंगा। –

+0

@ जोटेन असल में, हाँ, मुझे लगता है कि उन्होंने अन्य कार्यों के कोड के साथ नमूना उदाहरण प्रदान किए हैं, फिर चर्चा बनाने पर चर्चा की और परिणाम दिखाया। मुझे आपके लिए एक उदाहरण और सामान्य उपयोग उदाहरण मिला। –

4

शंबो का उत्तर टाइमस्लाइस के साथ कैरेट पैकेज का उपयोग करने का एक अच्छा उदाहरण प्रदान करता है, हालांकि, यह मॉडलिंग तकनीक के मामले में भ्रामक हो सकता है। इसलिए भविष्य के पाठकों को गुमराह न करने के लिए जो टाइम-सीरीज पर भविष्यवाणी मॉडलिंग के लिए कैरेट पैकेज का उपयोग करना चाहते हैं (और यहां मेरा मतलब ऑटोरेशनल मॉडल नहीं है), मैं कुछ चीजों को हाइलाइट करना चाहता हूं।

समय-श्रृंखला डेटा के साथ समस्या यह है कि यदि कोई सावधान नहीं है तो आगे बढ़ने वाली पूर्वाग्रह आसान है।इस मामले में, अर्थशास्त्र डेटा सेट ने अपनी आर्थिक रिपोर्टिंग तिथियों पर डेटा गठबंधन किया है, न कि उनकी रिलीज की तारीख, जो वास्तविक लाइव अनुप्रयोगों में कभी भी मामला नहीं है (आर्थिक डेटा बिंदुओं में अलग-अलग समय टिकटें हैं)। रिहाई की तारीख के मामले में बेरोजगारी डेटा अन्य संकेतकों के पीछे दो महीने हो सकता है, जो तब शंबो के उदाहरण में मॉडल पूर्वाग्रह पेश करेगा।

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

आखिरकार, इस उदाहरण में 12 महीने का क्षितिज एक वास्तविक बहु-अवधि पूर्वानुमान नहीं है क्योंकि हाइंडमैन अपने उदाहरणों में ऐसा करता है।

Hyndman on cross-validation for time-series

संबंधित मुद्दे