交叉验证时间序列分析


37

我一直在使用R中的插入符号包来建立用于分类和回归的预测模型。Caret提供了一个统一的界面,可以通过交叉验证或引导绑定来调整模型超参数。例如,如果您要建立一个简单的“最近邻居”模型进行分类,则应使用多少个邻居?2?10个?100?Caret通过重新采样数据,尝试不同的参数,然后对结果进行汇总以确定哪个可产生最佳的预测准确性,来帮助您回答这个问题。

我喜欢这种方法,因为它为选择模型超参数提供了一种可靠的方法,并且一旦您选择了最终的超参数,就可以使用分类模型的准确性对模型的“好”程度进行交叉验证。和RMSE用于回归模型。

我现在有一些时间序列数据,可能要使用随机森林来构建回归模型。考虑到数据的性质,有什么好的方法可以评估模型的预测准确性?如果随机森林不能真正应用于时间序列数据,那么为时间序列分析构建准确的集成模型的最佳方法是什么?


我发现这个问题真的很有趣。有什么办法可以我标记一个问题来解决?
mariana soffer,2011年

1
@mariana soffer单击上/下箭头下方的“星形”图标。
Zach


1
@Zach这是一个旧帖子,但我想知道您是否有任何新想法?您是否了解有关顺序模型验证的最新工作?
horaceT

Answers:


10

“经典” k次交叉验证技术基于以下事实:可用数据集中的每个样本都使用(k-1)次来训练模型,而使用1次来测试模型。由于验证“未来”数据上的时间序列模型非常重要,因此这种方法不会对模型的稳定性有所帮助。

许多(大多数)时间序列的一个重要属性是相邻值之间的相关性。正如IrishStat指出的那样,如果您使用以前的读数作为候选模型的自变量,则这种相关性(或缺乏独立性)起着重要作用,这也是k次交叉验证不是一个好主意的另一个原因。

解决此问题的一种方法是对数据进行“过采样”并对其进行解相关。如果去相关过程成功,那么在时间序列上使用交叉验证的问题就会减少。但是,它不会解决使用未来数据验证模型的问题

澄清说明

通过验证未来数据上的模型,我的意思是构建模型,等待在模型构建,测试,微调等过程中无法获得的新数据,并在该数据上进行验证。

通过对数据进行过采样,我的意思是收集时间序列数据的频率要比实际需要的频率高得多。例如:当您真正对小时更改感兴趣时,每5秒采样一次股票价格。在这里,当我说“采样”时,我的意思不是“插值”,“估计”等。如果无法以更高的频率测量数据,则此技术毫无意义。


验证未来数据模型的“经典”方法是什么?“超采样”是什么意思?谢谢!
扎克(Zach)

TppT

@bgbg我面临着非常类似的问题,刚刚找到了您的帖子。您可以引用一些有关时间序列数据过采样和去相关的参考吗?我认为,如果时间序列中的内存足够短(可以显示出适合一个Arima),则可以只获取“不重叠”的样本并进行通常的交叉验证。任何想法表示赞赏。
horaceT

9

http://robjhyndman.com/researchtips/crossvalidation/包含有关时间序列交叉验证的快速提示。关于使用随机森林作为时间序列数据....虽然考虑到该模型是使用自举样本拟合的,但这似乎是一个奇怪的选择,但不确定。当然,可以使用经典的时间序列方法(例如ARIMA),以及像神经网络这样的ML技术(例如pdf示例)。也许一些时间序列专家可以评论ML技术与特定于时间序列的算法相比如何工作。


2
这几乎打在了头上。我试图找出将机器学习技术应用于时间序列分析的方法。
Zach

我以前使用随机森林进行预测已取得成功。退房:biomedcentral.com/1471-2105/15/276
captain_ahab 2014年

6

这是一些交叉验证时间序列模型的示例代码。我在博客中扩展了此代码,并结合了foreach包以加快处理速度,并允许在交叉验证中使用xreg术语。

这是Rob Hyndman博客中代码的副本:

library(fpp) # To load the data set a10
plot(a10, ylab="$ million", xlab="Year", main="Antidiabetic drug sales")
plot(log(a10), ylab="", xlab="Year", main="Log Antidiabetic drug sales")

k <- 60 # minimum data length for fitting a model
n <- length(a10)
mae1 <- mae2 <- mae3 <- matrix(NA,n-k,12)
st <- tsp(a10)[1]+(k-2)/12

for(i in 1:(n-k))
{
  xshort <- window(a10, end=st + i/12)
  xnext <- window(a10, start=st + (i+1)/12, end=st + (i+12)/12)
  fit1 <- tslm(xshort ~ trend + season, lambda=0)
  fcast1 <- forecast(fit1, h=12)
  fit2 <- Arima(xshort, order=c(3,0,1), seasonal=list(order=c(0,1,1), period=12), 
      include.drift=TRUE, lambda=0, method="ML")
  fcast2 <- forecast(fit2, h=12)
  fit3 <- ets(xshort,model="MMM",damped=TRUE)
  fcast3 <- forecast(fit3, h=12)
  mae1[i,1:length(xnext)] <- abs(fcast1[['mean']]-xnext)
  mae2[i,1:length(xnext)] <- abs(fcast2[['mean']]-xnext)
  mae3[i,1:length(xnext)] <- abs(fcast3[['mean']]-xnext)
}

plot(1:12, colMeans(mae1,na.rm=TRUE), type="l", col=2, xlab="horizon", ylab="MAE",
     ylim=c(0.65,1.05))
lines(1:12, colMeans(mae2,na.rm=TRUE), type="l",col=3)
lines(1:12, colMeans(mae3,na.rm=TRUE), type="l",col=4)
legend("topleft",legend=c("LM","ARIMA","ETS"),col=2:4,lty=1)

结果


嗨,扎克。为了检测具有时间序列的回归模型的适当项数,我实现了Hyndman代码的稍有不同的版本。不幸的是,CV错误图显示了几个局部最小值,这使我对如何正确选择项数产生疑问。完整的问题在这里描述。您之前遇到过类似的事情吗?
jroberayalas

5

如果您具有时间序列数据,则可能会遇到“自由度问题”。例如,如果您每小时进行4次观察,然后决定以1分钟为间隔使用241次观察,则您有241次观察,但它们不一定是独立的。当您将这241个值/测量值提交给分析包时,该包可能会期望它们是241个独立的值,因为它会继续执行其特殊的功能。如果您有时间序列数据,则可能必须升级分析。我不知道您所引用的程序,但是就我而言,这是一个合理的猜测(我可能错了!),它的测试(F测试/ T测试...等)可能不适用于您的问题集。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.