将随机森林用于时间序列数据集
Using Random Forest for time series dataset
对于时间序列数据集,我想做一些分析并创建预测模型。通常,我们会将数据(通过在整个数据集中随机抽样)拆分为训练集和测试集,并使用带有 randomForest 函数的训练集。并保留测试部分以检查模型的行为。
但是,有人告诉我,对于时间序列数据,不能通过随机抽样来拆分数据。
如果有人解释如何将数据拆分为时间序列数据的训练和测试,我将不胜感激。或者如果有任何替代方法来做时间序列随机森林。
问候
我们生活在一个 "future-to-past-causality" 只出现在酷炫科幻电影中的世界。因此,在对时间序列建模时,我们希望避免用未来事件来解释过去事件。此外,我们想验证我们的模型,严格根据过去的事件训练,可以解释未来的事件。
使用 RF 滚动对时间序列 T 进行建模。对于第 t 天,值 T[t] 是目标,值 T[t-k] 其中 k= {1,2,...,h},其中 h 是过去 horizon 将被使用形成特征。对于非平稳时间序列,T 被转换为例如相对改变Trel。 = (T[t+1]-T[t]) / T[t].
为了评估性能,我建议检查 RF 的 out-of-bag 交叉验证度量。请注意,有一些陷阱可能会使该措施过于乐观:
过去污染的未知未来 - 不知何故滚动是错误的,模型使用未来事件来解释训练集中的相同未来。
Non-independent 采样:如果您要提前预测的时间间隔短于计算相对变化的时间间隔,则您的样本不是独立的。
可能还有其他我不知道的错误
最后,每个人都可能以某种潜在的方式犯以上错误。要检查没有发生这种情况,您需要通过回溯测试来验证您的模型。每天都由仅根据过去事件严格训练的模型进行预测。
当 OOB-CV 和回溯测试完全不一致时,这可能是代码中某些错误的提示。
要进行回测,请在 T[t-1 到 t-traindays] 上滚动。对此训练数据建模并预测 T[t]。然后将 t 加一,t++,然后重复。
为了加快速度,您可以只训练一次模型,也可以在每第 n 个 t 增量时训练模型。
读取销售文件
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)
对于时间序列数据集,我想做一些分析并创建预测模型。通常,我们会将数据(通过在整个数据集中随机抽样)拆分为训练集和测试集,并使用带有 randomForest 函数的训练集。并保留测试部分以检查模型的行为。
但是,有人告诉我,对于时间序列数据,不能通过随机抽样来拆分数据。
如果有人解释如何将数据拆分为时间序列数据的训练和测试,我将不胜感激。或者如果有任何替代方法来做时间序列随机森林。 问候
我们生活在一个 "future-to-past-causality" 只出现在酷炫科幻电影中的世界。因此,在对时间序列建模时,我们希望避免用未来事件来解释过去事件。此外,我们想验证我们的模型,严格根据过去的事件训练,可以解释未来的事件。
使用 RF 滚动对时间序列 T 进行建模。对于第 t 天,值 T[t] 是目标,值 T[t-k] 其中 k= {1,2,...,h},其中 h 是过去 horizon 将被使用形成特征。对于非平稳时间序列,T 被转换为例如相对改变Trel。 = (T[t+1]-T[t]) / T[t].
为了评估性能,我建议检查 RF 的 out-of-bag 交叉验证度量。请注意,有一些陷阱可能会使该措施过于乐观:
过去污染的未知未来 - 不知何故滚动是错误的,模型使用未来事件来解释训练集中的相同未来。
Non-independent 采样:如果您要提前预测的时间间隔短于计算相对变化的时间间隔,则您的样本不是独立的。
可能还有其他我不知道的错误
最后,每个人都可能以某种潜在的方式犯以上错误。要检查没有发生这种情况,您需要通过回溯测试来验证您的模型。每天都由仅根据过去事件严格训练的模型进行预测。
当 OOB-CV 和回溯测试完全不一致时,这可能是代码中某些错误的提示。
要进行回测,请在 T[t-1 到 t-traindays] 上滚动。对此训练数据建模并预测 T[t]。然后将 t 加一,t++,然后重复。
为了加快速度,您可以只训练一次模型,也可以在每第 n 个 t 增量时训练模型。
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)