1.问题提出
时间序列是一列关于时间的序列,例如股票数据,在每一个时刻对应一个观察值或者多个观察值。
像这样:
time, measure
正如我们所知大多数机器学习使用监督学习来解决实际问题,如何把这时间序列转换成我们所熟知的监督学习所适应的形式呢,然后用监督学习的方法来解决。
像这样:
X, y
2.滑动窗口(sliding window)用于时间序列
该方法对时间进行重组,大致的意思是前一个时间序列的数值作为下一个时间序列数值的输入,就像马尔科夫定义一样
当前时刻的状况只受上一个时刻的状态的影响。举例子说明
time, measure
- 我们可以看到前一个时间值是输入(X),下一个时间值是我们监督学习问题中的输出(y)。
- 我们可以看到观察之间的顺序被保留,并且在使用该数据集训练监督模型时必须继续保留。
- 我们可以看到,我们没有先前的值可用于预测序列中的第一个值。我们将删除此行,因为我们无法使用它。
- 我们还可以看到,我们没有已知的下一个值来预测序列中的最后一个值。我们也可能希望在训练我们的监督模型时删除此值。
3.具有多变量时间序列数据的滑动窗口
什么是多变量时间序列,就是每次观察到两个或多个变量的数据集。例如:
time, measure1, measure2
我们可以看到第一行和最后两行不能用于训练监督模型。
4.具有多步预测的滑动窗口
- 一步预测:这是预测下一个时间步(t + 1)的地方。
- 多步预测:这是预测两个或更多未来时间步骤的位置。
考虑来自上面第一个滑动窗口示例的相同的单变量时间序列数据集:
time, measure
1, 100
2, 110
3, 108
4, 115
5, 120
我们可以将这个时间序列构建为一个两步预测数据集,用于窗口宽度为1的监督学习,如下所示:
X1, y1, y2
? 100, 110
100, 110, 108
110, 108, 115
108, 115, 120
115, 120, ?
120, ?, ?
具体而言,监督模型仅使用X1来预测y1和y2。
5. 使用Python方法实现转换
主要使用pandas中的shift()方法
from pandas import DataFrame df = DataFrame() df['t'] = [x for x in range(10)] print(df)
输出结果是
t
from pandas import DataFrame df = DataFrame() df['t'] = [x for x in range(10)] df['t-1'] = df['t'].shift(1) print(df)
输出结果
t t-1
from pandas import DataFrame df = DataFrame() df['t'] = [x for x in range(10)] df['t+1'] = df['t'].shift(-1) print(df)
t t+1
0 0 1.0
1 1 2.0
2 2 3.0
3 3 4.0
4 4 5.0
5 5 6.0
6 6 7.0
7 7 8.0
8 8 9.0
9 9 NaN
其实就是对t列进行有限步移动获得t-1或者t+1列
更多知识:https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/