使用随机森林处理时间序列数据集

3
对于时间序列数据集,我想进行一些分析并创建预测模型。通常,我们会将数据(在整个数据集上通过随机抽样)分成训练集和测试集,并使用训练集与 randomForest 函数。同时保留测试部分以检查模型的行为。 然而,有人告诉我对于时间序列数据,无法通过随机抽样来拆分数据。 如果有人能够解释如何将数据分成训练集和测试集供时间序列数据使用,或者是否有其他替代方法可以使用时间序列随机森林,我将不胜感激。 谢谢!
2个回答

2
我们生活在一个只有酷炫科幻电影中才会出现的“未来到过去因果关系”的世界。因此,在建模时间序列时,我们喜欢避免用未来事件解释过去事件。另外,我们也喜欢验证我们的模型是否严格训练于过去事件,并能够解释未来事件。
为了对时间序列T进行建模,使用了RF rolling。对于第t天,值T[t]是目标,而值T[t-k](其中k={1,2,...,h},h为过去的时间范围)将被用来形成特征。对于非平稳时间序列,T被转换为例如相对变化Trel. = (T[t+1]-T[t]) / T[t]。
为了评估性能,我建议检查RF的out-of-bag交叉验证度量。请注意,可能存在一些陷阱,可能会使这个度量过于乐观:
1. 未知的未来到过去污染-滚动方式有误,使用未来事件来解释训练集中相同的未来事件。 2. 非独立采样:如果您要预测的时间间隔比计算相对变化的时间间隔短,则您的样本不是独立的。 3. 可能存在其他我尚不知道的错误。
最终,每个人都可能以某种潜在的方式犯以上错误。要检查这些错误是否发生,您需要使用回测来验证您的模型。其中,每天都由仅在过去事件上严格训练的模型进行预测。
当OOB-CV和回测明显不一致时,这可能是代码中存在错误的提示。
为了进行回测,请对T[t-1到t-traindays]进行rolling。对该训练数据进行建模并预测T[t]。然后将t增加一,t++,并重复此过程。
为了加快速度,您可以仅在每n个t的增量处训练您的模型。

0
读取销售文件
Sales<-read.csv("Sales.csv") 

寻找训练集的长度。
train_len=round(nrow(Sales)*0.8) 
test_len=nrow(Sales)

将数据分成训练集和测试集,在这里我考虑了80-20的切分比例,你可以更改。请确保您的数据按升序排列。
训练集
training<-slice(SubSales,1:train_len) 

测试集
testing<-slice(SubSales,train_len+1:test_len)

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