用例:
每天,我们都有每天建立的指标来检查我们的系统是否运行良好。有时,构建这些指标的工作流程中会出现错误,我必须构建一种算法,当出现问题时会提醒我们,以便我们检查问题的来源。
我正在尝试什么:
我对时间序列了解不多。我拥有的数据显示了每周的季节性,并且数量不是恒定的(它正在增长)。见图片: http: //www.blabala.com(我没有足够的代表来发布多张图片)因此,从我读到的内容来看,ARIMA 似乎是一个相关的算法。
我偶然发现了 中的tsoutlier
包R
及其功能locate.outliers.oloop()
和discard.outliers()
,所以我有了以下想法:与其尝试训练我不掌握的东西,不如让算法的自动部分自己训练,并使用它:如果它检测异常值,然后发出警报。
- 第一个问题:这似乎是个好主意还是坏主意?
如果这是一个好方法:
我很难得到运行良好的东西。我探索了两种做事方式:
1)训练整个事情,并自行运行。
cval <- 3
mo2 <- locate.outliers.oloop(TS_train,
arima_train,
maxit.iloop = 100,
maxit.oloop = 100,
cval = cval)
d2<-discard.outliers(mo2,TS_train, method = "bottom-up",
tsmethod.call = arima_train$call,
cval = cval)
OTL <- TS_train[sort(d2$outliers$ind)]
plot(1:length(TS_train), TS_train, type = 'p')
lines(1:length(TS_train), TS_train, col = "grey")
points(sort(d2$outliers$ind), OTL, col = "red")
这并没有给出很好的结果。见图 1。
2)有一个滑动窗口:以第1到60天为训练数据训练算法,评估第61天,滑动一天,以第2到61天为训练数据训练算法,评估第62天,滑动一天,依此类推.
plage <- 60
cval <- 3
ylim <- range(DT$col1) + c(-1,1) * .05 * diff(range(DT$col1))
for( i in (plage + 1):65 ) {
TS_tmp <- ts(DT[(i-plage):i]$col1, frequency = 7)
aa <- auto.arima(TS_tmp)
mo_tmp <- locate.outliers.oloop(TS_tmp, aa,
maxit.iloop = 100, maxit.oloop = 100,
cval = cval)
d_tmp <- discard.outliers(mo_tmp, TS_tmp, method = "bottom-up",
tsmethod.call = aa$call, cval = cval)
Outl <- TS_tmp[sort(d_tmp$outliers$ind)]
print(plot(DT[(i-plage):i]$col1, type = "b", xlim = c(1, nrow(DT)), ylim = ylim))
print(points(sort(d_tmp$outliers$ind), Outl , col = "red"))
}
它似乎表现更差......(见图2)
再说一次,我对时间序列了解不多,也不知道如何评估模型的性能。
我的问题:
这两种方法中的任何一种都是好主意吗?哪个最好?有更好的主意吗?
我正在使用方法 n1 中的 9 个月数据。在方法 n2 中(如果相关),我的训练集中应该包含多少数据?(目前:60 天)
关于如何最好地校准模型的任何建议?