预测模型提前一天预测 - 滑动窗口

6

我遇到了一个问题。我正在使用SparkR进行时间序列预测,但是这个场景也可以转移到普通的R环境中。除了使用ARIMA模型外,我还想使用回归模型(如随机森林回归)来预测未来一天的负载情况。我也了解到了滑动窗口方法来评估不同参数组合下不同回归器的性能。为了更好地理解,以下是我的数据集结构示例:

Timestamp              UsageCPU     UsageMemory   Indicator  Delay
2014-01-03 21:50:00    3123            1231          1        123
2014-01-03 22:00:00    5123            2355          1        322
2014-01-03 22:10:00    3121            1233          2        321
2014-01-03 22:20:00    2111            1234          2        211
2014-01-03 22:30:00    1000            2222          2         0 
2014-01-03 22:40:00    4754            1599          1         0

使用任何类型的回归器,下一步是提取特征并将其转换为可读格式,因为这些回归不能读取时间戳:

Year   Month  Day  Hour    Minute    UsageCPU   UsageMemory  Indicator Delay
2014   1      3    21       50        3123        1231          1      123
2014   1      3    22       00        5123        2355          1      322
2014   1      3    22       10        3121        1233          2      321
2114   1      3    22       20        2111        1234          2      211

下一步是为模型创建训练集和测试集。
trainTest <-randomSplit(SparkDF,c(0.7,0.3), seed=42)
train <- trainTest[[1]]
test <- trainTest[[2]]

然后可以创建模型+预测(首先随机森林的设置不相关):
model <- spark.randomForest(train, UsageCPU ~ ., type = "regression", maxDepth = 5, maxBins = 16)
predictions <- predict(model, test)

我知道所有这些步骤,并通过将预测数据与实际数据绘制出来,看起来效果很好。但是这个回归模型不是动态的,这意味着我无法预测未来一天的情况。因为像UsageCPU、UsageMemory等特征不存在,所以我想从历史值预测到下一天。正如在开头提到的,滑动窗口方法可以在这里起作用,但我不确定如何应用它(在整个数据集上,仅在训练或测试集上)。
这个实现来自shabbychef'smbq
 slideMean<-function(x,windowsize=3,slide=2){
 idx1<-seq(1,length(x),by=slide);
 idx1+windowsize->idx2;
 idx2[idx2>(length(x)+1)]<-length(x)+1;
 c(0,cumsum(x))->cx;
 return((cx[idx2]-cx[idx1])/windowsize);
}

最后一个问题涉及窗口大小。我想预测下一天的小时数(00、01、02、03...),但时间戳的间隔为10分钟,所以在我的计算中,窗口的大小应该是144(10*60*24 / 10)。
如果有人能帮忙就太好了。谢谢!
1个回答

2

我也曾在使用神经网络进行时间序列预测时遇到过同样的问题。我尝试了很多模型,最好的一个是滑动窗口结合神经网络的方法。

我还向该领域的其他研究人员进行了确认。通过这个,我们得出结论:如果你想要用单步训练来预测1天(24个时间点)后的结果,那么这对系统的要求将会非常高。我们采取了以下措施:

1. We had a sliding window of 24 hours. e.g lets use [1,2,3] here
2. Then use ML model to predict the [4]. Meaning use value 4 as target. 
# As illustration we had 
x = [1,2,3] 
# then set target as 
y=[4]. 
# We had a function that returns the x=[1,2,3] and y =[4] and
# shift the window in the next training step. 
3.To the:
x =[1,2,3] 
we can add further features that are important to the model. 
x=[1,2,3,feature_x]

4. Then we minimise error and shift the window to have:
 x = [2,3,4,feature_x] and y = [5]. 
5. You could also predict two values ahead. e.g [4,5] .
6. Use a list to collect output and plot
7. Make prediction after the training.

太棒了,谢谢你的回答。只是一些问题需要正确解释,那么这意味着在您的情况下,您有一个数据集表示为1-24小时,并且仅用变量x表示(不是每个小时都有一列),对吗?如果我选择分钟,会更精确吗?因此,我的x值将是x [15,30,45,60,...,1440],而地平线也是1440。但是我不确定y [4]是什么意思。y是我想要预测的目标值(UsageCPU)吗?那么,您的意思是我可以使用上面的滑动窗口函数并将其集成,还是应该按照您描述的重新编码它? - Daniel
如果您的数据大小为14440或更大。我选择了一个窗口大小为24(它包含24个x值)。然后对于第一次迭代,我取窗口大小为24并预测第25个值。第25个值将被假定为我的目标。之后,我移动我的窗口并丢弃窗口中的第一个值,同时添加第25个值,并预测第26个值。 如果您有x [15 ...... 1440],则只能预测第1441个值。然后移动窗口,即删除15,添加1441,并预测1442。像这样,您可以预测许多时间步长。 - smile
为了让事情更清晰。无论你选择分钟还是小时都没关系。目标是我在目标(UsageCPU)上定义一个窗口。然后UsageCPU = [1,2,3,4] 窗口大小。然后对于每次迭代,我得到像Usage[1]作为x和Usage[5]作为目标的输入/输出对。这意味着我正在预测未来5个步骤。然后我移动窗口。删除Usage[1],使用Usage[2]然后预测Uage[6]。 现在,在每次迭代中,您可以添加其他信息来帮助预测x值。例如x[1,小时,月份,年份,uageMemory,delay] ---> - smile
再次感谢您的详细解释!希望在R中实现起来很容易。但是有了您的解释,我想我应该可以做到,否则我会在StackOverflow上提问 ;)。 - Daniel
1
我想这正是你所需要的,对吗?这篇文章介绍了如何使用Python将时间序列转换为监督学习问题。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接