应用机器学习的任何预测任务与这四个策略。
文章目录
- 1、简介
- 1.1定义预测任务
- 1.2准备预测数据
- 1.3多步预测策略
-
-
- 1.3.1多输出模型
- 1.3.2直接策略
- 1.3.3递归策略
- 1.3.4DirRec 策略
-
- 2、流感趋势示例
-
-
- 2.1多输出模型
- 2.2直接策略
-
1、简介
在第二课和第三课中,我们将预测视为一个简单的回归问题,所有的特征都是从一个输入,即时间索引,衍生出来的。我们可以通过生成我们想要的趋势和季节性特征,轻松地对未来的任何时间进行预测。
但是,当我们在第四课中添加了滞后特征时,问题的性质就发生了变化。滞后特征要求在进行预测时,滞后的目标值是已知的。滞后 1 的特征将时间序列向前移动 1 步,这意味着你可以预测未来的 1 步,但不能预测 2 步。
在第四课中,我们只是假设我们可以一直生成滞后特征,直到我们想要预测的期间(换句话说,每个预测都是向前一步)。然而,现实世界的预测通常需要更多的信息,所以在这一课中,我们将学习如何针对各种情况进行预测。
1.1定义预测任务
在设计预测模型之前,有两件事情需要确定:
- 在进行预测时,有哪些信息是可用的(特征),以及,
- 你需要预测值的时间段(目标)。
预测起点是你进行预测的时间。实际上,你可以将预测起点视为你有训练数据的最后一个时间,用于预测正在预测的时间。起点之前的所有内容都可以用来创建特征。
预测范围是你进行预测的时间。我们通常用预测范围内的时间步数来描述一个预测:例如,“1 步”预测或“5 步”预测。预测范围描述了目标。
一个三步预测范围,有两步的提前时间,使用四个滞后特征。该图表示了一行训练数据的内容,也就是一个预测的数据。
起点和范围之间的时间是预测的提前时间(或有时称为延迟)。预测的提前时间由起点到范围的步数来描述:例如,“1 步前”或“3 步前”的预测。在实践中,由于数据获取或处理的延迟,可能需要一个预测从起点开始多步前进行。
1.2准备预测数据
为了用机器学习算法进行时间序列预测,我们需要将序列转换为一个可以用于这些算法的数据框。(当然,除非你只使用确定性的特征,如趋势和季节性。)
我们在第四课中看到了这个过程的前半部分,当时我们用滞后值创建了一个特征集。后半部分是准备目标值。我们如何做这个取决于预测任务的不同。
数据框中的每一行代表一个单独的预测。行的时间索引是预测范围内的第一个时间,但我们将整个范围内的值都安排在同一行中。对于多步预测,这意味着我们需要一个模型能够产生多个输出,每一步一个。
In [1]:
import numpy as np
import pandas as pd
N = 20
ts = pd.Series(
np.arange(N),
index=pd.period_range(start='2010', freq='A', periods=N, name='Year'),
dtype=pd.Int8Dtype,
)
# Lag features
X = pd.DataFrame({
'y_lag_2': ts.shift(2),
'y_lag_3': ts.shift(3),
'y_lag_4': ts.shift(4),
'y_lag_5': ts.shift(5),
'y_lag_6': ts.shift(6),
})
# Multistep targets
y = pd.DataFrame({
'y_step_3': ts.shift(-2),
'y_step_2': ts.shift(-1),
'y_step_1': ts,
})
data = pd.concat({
'Targets': y, 'Features': X}, axis=1)
data.head(10).style.set_properties(['Targets'], **{
'background-color': 'LavenderBlush'}) \
.set_properties(['Features'], **{
'background-color':