BSTS मॉडल (R में) की भविष्यवाणियां पूरी तरह से विफल हो रही हैं


15

बेयसियन स्ट्रक्चरल टाइम सीरीज़ मॉडल के बारे में इस ब्लॉग पोस्ट को पढ़ने के बाद , मैं इसे एक समस्या के संदर्भ में लागू करना चाहता था जिसे मैंने पहले आईआईएमए के लिए इस्तेमाल किया था।

मेरे पास कुछ ज्ञात (लेकिन शोर) मौसमी घटकों के साथ कुछ डेटा हैं - निश्चित रूप से इसके लिए एक वार्षिक, मासिक और साप्ताहिक घटक हैं, और विशेष दिनों (जैसे संघीय या धार्मिक छुट्टियों) के कारण कुछ प्रभाव भी हैं।

मैंने इसे bstsलागू करने के लिए पैकेज का उपयोग किया है और जहां तक ​​मैं बता सकता हूं कि मैंने कुछ भी गलत नहीं किया है, हालांकि घटक और भविष्यवाणी बस वह नहीं दिखते हैं जिसकी मुझे उम्मीद थी। यह मेरे लिए स्पष्ट नहीं है यदि मेरा कार्यान्वयन गलत है, अधूरा है या कुछ अन्य समस्या है।

पूर्णकालिक श्रृंखला इस तरह दिखती है:

पूरा डाटा

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

library(bsts)

predict_length = 90
training_cut_date <- '2015-05-01'
test_cut_date <- as.Date(training_cut_date) + predict_length

df = read.csv('input.tsv', sep ='\t')

df$date <- as.Date(as.character(df$date),format="%Y-%m-%d")
df_train = df[df$date < training_cut_date,]

yts <- xts(log10(df_train$count), order.by=df_train$date)

ss <- AddLocalLinearTrend(list(), yts)
ss <- AddSeasonal(ss, yts, nseasons = 7)
ss <- AddSeasonal(ss, yts, nseasons = 12)
ss <- AddNamedHolidays(ss, named.holidays = NamedHolidays(), yts)

model <- bsts(yts, state.specification = ss, niter = 500, seed=2016)

मॉडल उचित लगता है:

मॉडल प्लॉट

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

burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))

शुद्ध भविष्यवाणी इस तरह दिखती है:

शुद्ध भविष्यवाणी

और फिर जब प्रारंभिक वितरण में वापस पहुंचा (प्रशिक्षण के लिए भविष्यवाणी से संक्रमण को दर्शाने वाली बिंदीदार रेखा के साथ, समस्याएं स्पष्ट हैं:

पूर्ण व्याकुलता

मैंने मौसमी रुझानों को जोड़ने की कोशिश की है, मौसमी रुझानों को हटाते हुए, एक एआर शब्द जोड़कर, AddLocalLinearModel को AddGeneralizedLocalLinearTrend और मॉडल को ट्विक करने से संबंधित कई अन्य चीजों को बदल दिया है, लेकिन कुछ भी मुद्दों को हल नहीं किया है और भविष्यवाणियों को अधिक सार्थक बनाया है। कुछ मामलों में दिशा बदल जाती है, इसलिए 0 को छोड़ने के बजाय भविष्यवाणी केवल समय के कार्य के रूप में बढ़ती रहती है। मुझे निश्चित रूप से समझ में नहीं आता है कि मॉडल इस तरह से क्यों टूट रहा है। किसी भी सुझाव बहुत स्वागत होगा।


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

आपकी टिप्पणी के लिए बहुत बहुत धन्यवाद। यदि आपने एक बार देखने का समय दिया है , तो मैंने यहां कच्चा डेटा अपलोड किया है । डेटा 2013 की शुरुआत से लेकर इस साल के अंत तक है। मैंने ARIMA मॉडल के साथ पूर्वानुमान लगाने का भी प्रयास किया है, लेकिन इससे जो भविष्यवाणियाँ हुईं, वे होल्ड-आउट डेटा से मेल नहीं खातीं। डेटा का होल्ड आउट मूल रूप से 2015 या 2016 का कुछ अंश है, जो इस बात पर निर्भर करता है कि मैं कितना प्रशिक्षण डेटा उपयोग करना चाहता था।
एन्थ्र

मुझे इसे डाउनलोड करने में समस्या हो रही है .. कृपया मेरे ईमेल पते पर एक सीएसवी फ़ाइल भेजें
आयरिशस्टैट

जवाबों:


26

स्टीव स्कॉट यहाँ। मैंने bsts पैकेज लिखा है। मेरे पास आपके लिए कुछ सुझाव हैं। सबसे पहले, आपके मौसमी घटक वह नहीं कर रहे हैं जो आपको लगता है कि वे कर रहे हैं। मुझे लगता है कि आपके पास दैनिक डेटा है, क्योंकि आप 7 सीज़न घटक जोड़ने की कोशिश कर रहे हैं, जो सही तरीके से काम करना चाहिए। लेकिन आपने प्रत्येक 12 दिनों में दोहराने के लिए अपने वार्षिक मौसमी घटक को बताया है। दैनिक डेटा के साथ एक मासिक मौसमी घटक प्राप्त करना कठिन है, लेकिन आप इसके द्वारा 52 सप्ताह का मौसमी कर सकते हैं AddSeasonal(..., nseasons = 52, season.duration = 7)

seasonal.durationतर्क मॉडल कितने समय प्रत्येक मौसम के लिए पिछले चाहिए अंक बताता है। nseasonsतर्क यह बताता है कि कैसे कई मौसमों एक चक्र में हैं। एक चक्र में समय बिंदुओं की कुल संख्या है season.duration * nseasons

दूसरा सुझाव यह है कि आप प्रवृत्ति के लिए एक अलग मॉडल के बारे में सोचना चाहते हैं। LocalLinearTrendमॉडल बहुत लचीला है, लेकिन यह लचीलापन दीर्घकालिक पूर्वानुमान में अवांछित विचरण के रूप में दिखा सकते हैं। कुछ अन्य ट्रेंड मॉडल हैं जिनमें थोड़ी अधिक संरचना होती है। GeneralizedLocalLinearTrend(nondescriptive नाम के बारे में क्षमा करें) मान लेता है कि "ढलान" घटक एक यादृच्छिक चलने के बजाय AR1 प्रक्रिया है। अगर मैं भविष्य में बहुत दूर जाना चाहता हूं तो यह मेरा डिफ़ॉल्ट विकल्प है। आपकी अधिकांश सीरीज़ भिन्नता सीज़न से आती प्रतीत होती है, इसलिए आप इसके बजाय AddLocalLevelभी प्रयास कर सकते AddArहैं AddLocalLinearTrend

अंत में, अगर आप अजीबोगरीब पूर्वानुमान लगा रहे हैं, और आप यह पता लगाना चाहते हैं कि मॉडल के किस हिस्से को दोष देना है, plot(model, "components")तो आपके द्वारा अनुरोध किए गए व्यक्तिगत टुकड़ों में विघटित मॉडल को देखने का प्रयास करें।


FYI करें: मुझे अपने डेटा के साथ समान समस्याएं हैं, जो दैनिक भी है। मैंने आपके सभी सुझावों को यहाँ सूचीबद्ध किया है और कोई भी मदद करने वाला नहीं है।
ज़कज

1
@ स्कॉट स्कॉट आपको परेशान करने के लिए क्षमा करें स्टीव, मैं आपसे यह पूछना चाहता हूं: यदि मैं कई बार श्रृंखला के लिए प्रयास कर रहा हूं और मैं एक श्रेणीबद्ध मिश्रित मॉडल ढांचे में हूं, तो क्या मैं आपके पैकेज का उपयोग करके इसे मॉडल कर सकता हूं? वैसे: आपके पैकेज के लिए बहुत-बहुत धन्यवाद!
टॉमसो गुरेरिनी

4

मुझे लगता है कि आप डिफ़ॉल्ट बर्न को भी बदल सकते हैं। जैसा कि मैंने bsts का उपयोग किया है मैंने होल्डआउट अवधि पर MAPE के साथ बर्न और नाइट वैल्यूज़ की एक ग्रिड बनाई। इसके अलावा AddStudentLocalLinearTrend का उपयोग करने का प्रयास करें, यदि आपके डेटा में मॉडल में इस तरह की भिन्नता की अपेक्षा करने के लिए भारी भिन्नता है


1
मेरे मामले में मददगार था जब मेरे पास कुछ डेटा पॉइंट्स (20) थे
स्कैलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.