我遇到了一个问题。我正在使用SparkR进行时间序列预测,但这个场景也可以转移到普通的R环境中。我不想使用ARIMA模型,而是想使用回归模型,例如随机森林回归等,来预测一天的负载。我还了解到滑动窗口方法可以用来评估不同回归器在不同参数组合下的性能。为了更好地理解,这是我数据集结构的一个例子:
Timestamp UsageCPU UsageMemory Indicator Delay2014-01-03 21:50:00 3123 1231 1 1232014-01-03 22:00:00 5123 2355 1 3222014-01-03 22:10:00 3121 1233 2 3212014-01-03 22:20:00 2111 1234 2 2112014-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 Delay2014 1 3 21 50 3123 1231 1 1232014 1 3 22 00 5123 2355 1 3222014 1 3 22 10 3121 1233 2 3212114 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和mbq:
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)。
如果有人能帮我,那就太好了。谢谢!
回答:
我也在使用神经网络进行时间序列预测时遇到了同样的问题。我实现了许多模型,其中效果最好的模型是滑动窗口结合神经网络。我还从该领域的其他研究人员那里得到了确认。从中我们得出结论,如果你想在一个步骤中预测一天前(24个时间段),训练将对系统提出很高的要求。我们采取了以下步骤:
1. 我们有一个24小时的滑动窗口。例如,让我们在这里使用[1,2,3]。2. 然后使用机器学习模型预测[4]。意味着将值4设为目标。# 作为示例,我们有x = [1,2,3] # 然后将目标设为y=[4]。# 我们有一个函数返回x=[1,2,3]和y =[4]并# 在下一个训练步骤中移动窗口。3. 对x =[1,2,3]我们可以添加对模型重要的其他特征。x=[1,2,3,feature_x]4. 然后我们最小化误差并移动窗口以得到:x = [2,3,4,feature_x]和y = [5]。5. 你也可以预测两个值前。例如[4,5]。6. 使用列表收集输出并绘图7. 在训练后进行预测。