使用随机森林进行多个时间序列预测(在 Python 中)

数据挖掘 时间序列 随机森林 预报
2021-10-11 22:42:27

我对RandomForest的时间序列预测感兴趣。基本方法是使用滚动窗口并使用窗口内的数据点作为 RandomForest 回归的特征,我们在窗口内的值上回归窗口之后的下一个值。只是简单的自回归模型(有滞后),但使用随机森林而不是线性回归。

问题:

如果我有多个时间序列(多个时间序列),如何在 RF 回归中传递它们?

例如:给定两个时间序列是的1()是的2(),结果时间序列为z()我有兴趣预测z()基于组合是的1是的2.

我需要的是为每个使用滚动窗口是的1是的2,然后将窗口内的这些值从两个时间序列输入到 RF 回归中,以预测 z().

问题:

如何将来自两个滚动窗口的数据合并到 RF 回归的输入中?

1个回答

随机森林(以及大多数监督学习模型)接受一个向量 X=(X1,...Xķ) 每次观察并尝试正确预测输出 是的. 所以你需要将你的训练数据转换成这种格式。以下pandas基于 - 的功能将有所帮助:

import pandas as pd

def table2lags(table, max_lag, min_lag=0, separator='_'):
    """ Given a dataframe, return a dataframe with different lags of all its columns """
    values=[]
    for i in range(min_lag, max_lag + 1):
        values.append(table.shift(i).copy())
        values[-1].columns = [c + separator + str(i) for c in table.columns]
    return pd.concat(values, axis=1)

例如,下面的代码:

df = pd.DataFrame({'y1':[1,2,3,4,5], 'y2':[10,20,40,50,30], 'z': [1,4,9,16,25]})
x = table2lags(df[['y1', 'y2']], 2)
print(x)

会产生输出

   y1_0  y1_1  y1_2  y2_0  y2_1  y2_2
0   1.0   NaN   NaN  10.0   NaN   NaN
1   2.0   1.0   NaN  20.0  10.0   NaN
2   3.0   2.0   1.0  40.0  20.0  10.0
3   4.0   3.0   2.0  50.0  40.0  20.0
4   5.0   4.0   3.0  30.0  50.0  40.0

前两行缺少值,因为滞后 1 和 2 在它们上未定义。你可以用你认为合适的填充它们,或者干脆省略它们。

当你有矩阵 X例如,您可以将其提供给scikit-learn回归器:

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor().fit(x[2:], df['z'][2:])

最后,一个忠告。如果您不仅使用原始滞后值作为特征,而且使用它们的不同聚合:均值、其他线性组合(例如 ewm)、分位数等,那么您的模型可能会得到很大改进。在线性模型中包含额外的线性组合是没有用的,但是对于树基于模型的它可以提供很大帮助。