具有两种季节性模式的预测时间序列

机器算法验证 r 时间序列 预测 有马 多重季节性
2022-04-19 23:44:56

我正在为我的研究解决这个问题。附加的时间序列表示每 5 分钟采样一次的磁盘使用情况。该系列是锯齿模式,因为磁盘使用量不断增加,并且部分磁盘每 24 小时备份一次。因此存在线性趋势和季节性模式。我也看到了每小时的季节性模式,不确定原因。我的目标是使用几天的磁盘使用量并使用 conf 预测平均磁盘使用量。接下来 24 小时的间隔。我目前正在分析 3 天的数据(训练集)来预测接下来 24 小时的数据(测试集)。

以下 R 代码设置数据。

df_diskusage <- read.csv(file='http://people.duke.edu/~hvs2/code/disk_usage.csv', header=TRUE)
timestamp <- df_diskusage$time
usage <- df_diskusage$usage

training_Set_size <- 0.75
training_set_index <- round(length(timestamp)*training_Set_size)
timestamp_train <- timestamp[1:training_set_index]
usage_train <- usage[1:training_set_index]
timestamp_test <- timestamp[-(1:training_set_index)]
usage_test <- usage[-(1:training_set_index)]

timestamp_posix <- as.POSIXct(timestamp, origin='1970-01-01', tz='EST')
timestamp_train_posix <- as.POSIXct(timestamp_train, origin='1970-01-01', tz='EST')
timestamp_test_posix <- as.POSIXct(timestamp_test, origin='1970-01-01', tz='EST')
#Since 12 sample points per hr, freq. = 12. 
usage_train_ts <- ts(usage_train, frequency = 12)
usage_train_xts <- xts(usage_train, order.by = timestamp_train_posix)

usage_test_ts <- ts(usage_test, frequency = 12)
usage_test_xts <- xts(usage_test, order.by = timestamp_test_posix)
test_length <- length(usage_test)

tsdisplay(usage_train_xts)

tsdisplay_original_ts

我一直在尝试 Hyndman 博士的预测指南 (robjhyndman.com/uwafiles/fpp-notes.pdf) 中列出的各种拟合技术,例如 SES、Holt's(和所有变体)和 ARIMA,但预测并不好。可能是因为数据中有两种季节性模式。我想删除每小时的季节性模式,因为我只关心第二天的预测。所以我平均每小时的数据,每天有 24 个数据点,我定义了频率 = 24 的 ts。

getmeans  <- function(Df) {mean(Df$usage)}

timestamp_posix_hours <- cut(timestamp_posix, breaks = "hours")
temp_df <- data.frame(time=timestamp_posix_hours, usage=usage, hour=timestamp_posix_hours)

temp_df_batch <- ddply(temp_df, .(hour), getmeans)
temp_df_batch$hour <- as.POSIXct(temp_df_batch$hour, origin='1970-01-01', tz='EST')
timestamp_hr_posix <- temp_df_batch$hour
	usage_hr <- temp_df_batch$V1
#---------------------
training_hr_set_index <- round(length(timestamp_hr_posix)*training_Set_size)
timestamp_hr_train_posix <- timestamp_hr_posix[1:training_hr_set_index]
timestamp_hr_test_posix <- timestamp_hr_posix[-c(1:training_hr_set_index)]
usage_hr_train <- usage_hr[1:training_hr_set_index]
usage_hr_test <- usage_hr[-c(1:training_hr_set_index)]


usage_hr_train_ts <- ts(usage_hr_train, frequency = 24)
usage_hr_train_xts <- xts(usage_hr_train, order.by = timestamp_hr_train_posix)
usage_hr_test_ts <- ts(usage_hr_test, frequency = 24)
usage_hr_test_xts <- xts(usage_hr_test, order.by = timestamp_hr_test_posix)

test_hr_length <- length(usage_hr_test)

tsdisplay_hr_ts

我使用各种技术评估预测数据集(未来 24 小时)的拟合质量,“具有乘法季节性、阻尼趋势的 Holt-Winters 技术”和“STL + ETS(A,N,N)”提供了最佳拟合。结果在交叉验证中也是一致的。

在这一点上,我有几个问题。1. 什么是消除每小时季节性模式的优雅方法?我平均每小时一个样本,这似乎留下了很多伪影。有任何想法吗?2. 对于 ARIMA,我使用 auto.arima(),我得到 (0,1,1) 是最合适的。为什么它没有选择任何季节性模式?我在哪些设置上出错了?

fit_arima <- auto.arima(usage_hr_train_ts, max.P = 0, max.Q = 0, D = 0)
fit_arima_forecast <- forecast(fit_arima, h = test_hr_length)
plot(fit_arima_forecast)

(编辑于 11/27/2016)在 Hyndman 博士的推荐下,我使用了 TBATS 技术。预测的情节看起来令人鼓舞,但我发现与 Holt-winters 等更简单的模型相当的拟合质量。再加上 TBATS 需要一两分钟的时间来计算,这在我的用例中可能会很糟糕。我更喜欢更快的模型,即使结果不太准确。

我想追求去除每小时季节性模式的技术,所以我只能追求“每日”季节性模式。一种方法是每小时估算一次数据点(如上所示)。预测结果相当有希望,但任何其他建议都会很棒。

另一个想法是平滑数据以消除每小时的季节性模式,因此我可以将数据直接提供给 Holt-winters(预测中的 hw()),频率 = 288,但不支持如此高的频率。还有其他想法吗?

2个回答

您有一个多季节时间序列,其季节性长度为这是为 TBATS 方法设计的数据类型。1212×24=288

usage_train_ts <- msts(usage_train, seasonal.periods=c(12,288))
fit <- tbats(usage_train_ts)
fc <- forecast(fit)
plot(fc)

此处提供 TBATS 模型的详细信息:http ://robjhyndman.com/papers/complex-seasonality/

请查看用于异常值检测的稳健时间序列回归,因为该问题/问题与您的问题相似,因为有两个赛季在发挥作用。您每小时有 12 个读数,每天 24 小时有 3 天或总共 864 个值。

我可能会建议您为 24 小时中的每一小时构建一个模型(步骤 1)。只有三个读数,我认为三个值的简单平均值)将是第二天每小时值的良好基线预测。然后,我将为每小时 12 个读数中的每一个开发一个传递函数 (ARMAX) 模型,使用每小时总数作为 X 变量,并使用步骤 1 中的 24 个预测小时值。像往常一样,应该识别异常值/水平偏移/时间趋势以及为这 12 个模型(步骤 2)中的每一个模型定制的 ARIMA 结构,其中 Y 的 72 个历史值和 X 的 3 个不同值。然后可以使用步骤 1 中的每小时预测来计算这 12 个时隙中的每一个的预测。