【问题标题】:Forecasting in R - ARIMA, TBATS, UCM, Bayesian Structural time series etcR 中的预测 - ARIMA、TBATS、UCM、贝叶斯结构时间序列等
【发布时间】:2016-08-30 21:19:46
【问题描述】:

我 2 个月大就可以预测概念,但我正在努力自己学习并不断练习。在这里,我试图预测每周产品 在训练数据集上使用不同的预测技术并在测试数据集上测试其准确性。我尝试了不同的技术,如 ARIMA、TBATS、Holts Winter、UCM、贝叶斯结构时间序列等。但无法提高我的准确性。精度似乎很差。不知道我哪里出错了。我也用回归器尝试了 ARIMA,但它又对我没有多大帮助。我不确定我的代码或方法是否错误。谁能指导我提高我的准确性?以下是每周数据集(从 2012 年 12 月 8 日开始)

  [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 周。 可以说,“数据”是我的数据框,“单位”作为我的列名,

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%,我认为这非常糟糕。有人可以指导我提高准确性吗?我将非常感激。 谢谢!

【问题讨论】:

  • 嗨,该数据集是内置数据集之一吗?如果是这样,我建议将其作为脚本的一部分加载,以便您拥有一个其他人可以查看的可重现的代码示例。如果不是,我建议您使用内置数据集进行初步学习,因为您可以将您的预测与其他人能够实现的结果进行比较。

标签: r forecasting


【解决方案1】:

我会推荐一些东西:

1) 如果您使用的是出色的 R forecast 包,我建议您至少尝试全自动预测(参见下面的示例)。

2) 我建议绘制预测值和实际值,以及历史数据,以查看在历史数据的情况下输出是否合理。

3) 我建议阅读由 R forecast 包的一些创建者制作的 free on-line textbook

下面的示例使用来自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)

【讨论】:

  • 感谢 Khalid 的宝贵意见和指导。这真的很有帮助。是的,我提到了预测包并尝试了所有提到的技术。很抱歉没有发布比较图。是的,上面的数据集是内置数据集之一,可以是可重现的代码示例。我唯一关心的是使用上面的数据集,我的测试数据的 MAPE 非常大。我可以在数据中做任何其他技术或一些处理,以便我可以减少我的 MAPE?
  • 嗨,是的,您可能可以采取一些措施来减少 MAPE。例如,MAPE 是一个错误度量,它倾向于比预测不足更严重地惩罚过度预测(例如,如果您预测 0,则 APE 最多可以为 100%)。这意味着如果您返回的预测偏差低于平均值,您可能会获得较低的 MAPE。但这只有在您的目标是低 MAPE 而非无偏预测时才有意义。
猜你喜欢
  • 2020-08-09
  • 2015-05-22
  • 1970-01-01
  • 2014-11-11
  • 2022-10-08
  • 2017-05-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多