2016-08-30 5 views
0

Мне 2 месяца до концепций прогнозирования, но я стараюсь учиться и продолжать практиковать. Здесь я пытаюсь предсказать недельный продукт с использованием различных методов прогнозирования в наборе обучающих данных и проверке его точности в наборе тестовых данных. Я пробовал разные методы, такие как ARIMA, TBATS, Holts Winter, UCM, байесовские структурные временные ряды и т. Д. Но не смог улучшить мою точность. Точность кажется очень плохой. Не знаю, где я ошибаюсь. Я также попробовал ARIMA с регрессором, но опять-таки это не очень помогает мне. Я не уверен, что мои коды или мой подход ошибочны. Может ли кто-нибудь помочь мне улучшить мою точность? Ниже еженедельный набор данных (начинается с 8-го декабря, 2012)Прогнозирование в R - ARIMA, TBATS, UCM, байесовские структурные временные ряды и т. Д.

[1] 74 76 78 63 58 58 57 56 85 73 71 91 85 
[14] 79 101 74 86 98 131 90 127 116 320 145 121 148 
[27] 112 141 153 118 151 151 152 90 147 123 266 99 110 
[40] 146 134 76 81 100 80 323 15 22 14 13 19 56 
[53] 78 79 70 79 24 26 31 35 45 33 41 41 61 
[66] 91 83 76 57 68 87 82 105 76 107 116 105 124 
[79] 127 149 124 120 111 122 134 87 80 81 89 40 63 
[92] 112 85 131 97 51 65 74 70 47 62 60 49 47 
[105] 56 64 57 58 45 56 60 49 82 49 61 71 61 
[118] 92 90 75 69 114 79 144 121 133 132 114 124 152 
[131] 125 112 128 124 152 95 64 59 91 132 146 120 196 
[144] 212 115 125 66 68 78 83 74 300 46 98 86 95 
[157] 61 73 89 56 81 60 58 101 482 55 124 72 57 
[170] 51 82 55 68 105 153 113 105 85 34 77 95 96 
[183] 97 94 81 104 76 97 65 42 18 11 

Я рассмотрел мой период обучения, как 178 недель и тестирование в 14 недель. Позволяет сказать, «данные» мой dataframe с «единицы», как мой ColName,

series <- ts(data, start=2012+342/365.25, frequency = 365.25/7) 
kk  <- 178 
seas  <- 365.25/7 
st  <- tsp(series)[1] + (1/seas)*(kk-1) 
training <- window(series, end = st) 
testing <- window(series, start = st + 1/52.17857, end = st+14/52.17857) 

train1 <- training[,"units"] 
test1 <- testing[,"units"] 

##ARIMA 
farima <- forecast(auto.arima(train1),h=14) 
acc_arima <- accuracy(farima$mean,test1) 

##TBATS 
fTBATS <- forecast(tbats(train1,seasonal.periods=c(4,7,12,52)), h=14) 
acc_TBATS <- accuracy(fTBATS$mean,test1) 

##struTs 
fstruTs <- forecast(StructTS(train1), h=14) 
acc_struTs <- accuracy(fstruTs$mean,test1) 

##UCM 
forUCM  <- ucm(formula = train1~0, data = train1, level =  
TRUE, slope = TRUE) 
fUCM  <- predict(forUCM$model, n.ahead = 14) 
acc_struTs <- accuracy(fUCM$fit,test1) 

##Bayesian Structural time series 
ss <- AddLocalLinearTrend(list(), train1) 
ss <- AddSeasonal(ss, train1, nseasons = 52, season.duration = 7) 

model2 <- bsts(train1, state.specification = ss, niter = 500) 
fbsts <- predict(model2, horizon = 14, burn = 100) 
acc_bsts <- accuracy(fbsts$mean,test1) 

Для всех вышеперечисленных методов, мой MAPE выше 100%, что я думаю, что это очень плохо. Может ли кто-нибудь помочь мне улучшить точность? Я буду очень признателен. Спасибо!

+0

Привет, это набор данных одного из встроенных наборов данных? Если это так, я бы рекомендовал загрузить его как часть вашего скрипта, чтобы у вас был воспроизводимый пример кода, который другие могут посмотреть. Если нет, я бы рекомендовал использовать встроенные наборы данных для начального обучения, так как вы можете сравнить свое прогнозирование с тем, что другие смогли достичь. – kabdulla

ответ

1

Я рекомендовал бы несколько вещей:

1) Если вы используете отличный R forecast пакет, я рекомендовал бы по крайней мере, пытается полностью автоматизированный прогноз (смотри примеры ниже).

2) Я бы рекомендовал отображать прогнозные и фактические значения вместе с историческими данными, чтобы убедиться, что результат кажется разумным с учетом исторических данных.

3) Я бы рекомендовал прочитать free on-line textbook, сделанный некоторыми из создателей пакета R forecast.

Приведенный ниже пример использует полностью автоматизированный прогноз временных рядов от пакета forecast и отображает результаты как для набора данных, который вы используете выше, так и для другого общедоступного набора данных.

library(ggplot2) 
library(forecast) 

data <- read.table("./data.txt", quote="\"", comment.char="") 
series <- ts(as.numeric(data), start=2012+342/365.25, frequency = 365.25/7) 

train_length <- 178 
test_length <- length(series) - train_length 
train_end <- time(series)[train_length] 
test_start <- time(series)[train_length+1] 

training <- window(series, end = train_end) 
testing <- window(series, start = test_start) 

## Use default forecast 
fcast <- forecast(training, h=test_length) 
plot(fcast) 
lines(testing, col='red') 
acc_fcast <- accuracy(fcast$mean, testing) 

births <- scan("http://robjhyndman.com/tsdldata/data/nybirths.dat") 
birthstimeseries <- ts(births, frequency=12, start=c(1946,1)) 
train_length <- 150 
test_length <- length(birthstimeseries) - train_length 
train_end <- time(birthstimeseries)[train_length] 
test_start <- time(birthstimeseries)[train_length+1] 

training <- window(birthstimeseries, end = train_end) 
testing <- window(birthstimeseries, start = test_start) 

## Use default forecast 
fcast <- forecast(training, h=test_length) 
plot(fcast) 
lines(testing, col='red') 
acc_births <- accuracy(fcast$mean, testing) 
+0

Спасибо Халиду за ваши ценные материалы и руководство. Это действительно полезно. Да, я упомянул прогнозный пакет и пробовал все упомянутые технологии. Извините за то, что вы не публикуете сравнительные графики. Да, выше набора данных является одним из встроенных наборов данных, которые могут быть воспроизводимым примером кода. Моя единственная забота заключается в использовании выше набора данных, мой MAPE для тестовых данных очень большой. Есть ли какой-либо другой метод или какое-либо лечение, которое я могу сделать в данных, чтобы я мог уменьшить MAPE? – Kiwi

+0

Привет, да, возможно, есть вещи, которые вы могли бы сделать, чтобы уменьшить MAPE. Например, MAPE - это показатель ошибки, который имеет тенденцию наказывать чрезмерные прогнозы более сильно, чем прогнозы (например, если вы прогнозируете «0», APE может быть не более 100%). Это означает, что вы, вероятно, можете достичь более низкого MAPE, если вы вернули прогноз, который был предвзятым ниже среднего. Но это имеет смысл только в том случае, если ваша цель - низкая MAPE, а не непредвзятый прогноз. – kabdulla

 Смежные вопросы

  • Нет связанных вопросов^_^