时间序列预测基础教程系列(6)_用Python进行时间序列预测的Baseline预测

导读:

什么是基线预测,基线预测有什么用呢?

1、首先将数据按照一定的方法转换为监督学习数据。

2、其次构建一个数据间的对应函数关系,也叫做数据的持久化。这种映射关系的构建往往是基于我们的经验或者对数据的预处理。

3、然后使用训练数据对模型进行训练,得到一个预测模型。再用这个模型对未来数据进行预测。

4、最后将预测值和真实值进行残差比较,得出预测值和真实值之间的差异,或者损失,这就是一个最基本的基线预测。

5、后续我们在此基础之上开发出来的预测模型,得到的残差值都不能比当前这个基线预测差,否则说明我们的预测方法是不靠谱的或者无意义的。

正文:

建立基线对任何时间序列预测问题都至关重要。

性能基线可让您了解所有其他模型对您的问题的实际执行情况。

在本教程中,您将了解如何开发持久性预测,您可以使用该预测来计算使用Python的时间序列数据集的基准性能级别。

完成本教程后,您将了解:

  • 计算时间序列预测问题的绩效基线的重要性。
  • 如何在Python中从头开发持久性模型。
  • 如何从持久性模型评估预测并使用它来建立性能基线。

预测绩效基准

预测性能的基线提供了一个比较点。

它是您问题的所有其他建模技术的参考点。如果模型达到或低于基线的性能,则应该修复或放弃该技术。

用于生成预测以计算基准性能的技术必须易于实现,并且不需要特定于问题的细节。

在为预测问题建立性能基线之前,必须开发测试工具。这包括:

  1. 您打算用于训练和评估模型的数据集
  2. 重采样你打算技术用来估计技术(如训练/测试拆分)的性能。
  3. 您打算用于评估预测的绩效指标(例如均方误差)。

准备好之后,您需要选择一种简单的技术,您可以使用该技术进行预测并计算基准性能。

目标是尽快获得时间序列预测问题的基线性能,以便您可以更好地理解数据集并开发更高级的模型。

用于进行基线预测的良好技术的三个属性是:

  • 简单:一种几乎不需要培训或智力的方法。
  • 快速:一种快速实现且计算微不足道的方法来进行预测。
  • 可重复:一种确定性的方法,意味着它在给定相同输入的情况下产生预期输出。

持久性算法(“简单”预测)

监督机器学习的最常见基线方法是零规则算法。

该算法在分类的情况下预测多数类,或在回归的情况下预测平均结果。这可以用于时间序列,但不考虑时间序列数据集中的序列相关结构。

与时间序列数据集一起使用的等效技术是持久性算法。

持久性算法使用前一时间步(t-1)的值来预测下一时间步(t + 1)的预期结果。

这满足了基线预测的上述三个条件。

为了具体化,我们将研究如何开发持久性模型并使用它来为简单的单变量时间序列问题建立基线性能。首先,我们来看看Shampoo Sales数据集。

洗发水销售数据集

该数据集描述了3年期间每月的洗发水销售数量。

单位是销售计数,有36个观察。原始数据集归功于Makridakis,Wheelwright和Hyndman(1998)。

下面是前5行数据的示例,包括标题行。

"Month","Sales"
"1-01",266.0
"1-02",145.9
"1-03",183.1
"1-04",119.3
"1-05",180.3

下面是从数据市场获取的整个数据集的图表,您可以在其中下载数据集并了解有关它的更多信息。

时间序列预测基础教程系列(6)_用Python进行时间序列预测的Baseline预测_第1张图片

 

                                                              洗发水销售数据集

数据集显示出增长趋势,可能还有一些季节性因素。

下载数据集并将其放在当前工作目录中,文件名为 “ shampoo-sales.csv ”。

以下代码片段将加载Shampoo Sales数据集并绘制时间序列。

from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
 
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
series.plot()
pyplot.show()

运行该示例绘制时间序列,如下所示: 

时间序列预测基础教程系列(6)_用Python进行时间序列预测的Baseline预测_第2张图片

                                                            洗发水销售数据集图

持久性算法

可以在Python中轻松实现持久性模型。

我们将这一部分分为4个步骤:

  1. 将单变量数据集转换为监督学习问题。
  2. 为测试工具建立训练和测试数据集。
  3. 定义持久性模型。
  4. 进行预测并建立基准性能。
  5. 查看完整示例并绘制输出。

我们潜入吧。

第1步:定义监督学习问题

第一步是加载数据集并创建滞后表示。也就是说,鉴于在t-1处的观察,预测在t + 1处的观察。

# Create lagged dataset
values = DataFrame(series.values)
dataframe = concat([values.shift(1), values], axis=1)
dataframe.columns = ['t-1', 't+1']
print(dataframe.head(5))

此代码段创建数据集并打印新数据集的前5行。 

我们可以看到第一行(索引0)将不得不被丢弃,因为在第一次观察之前没有用于进行预测的观察。

从监督学习的角度来看,t-1列是输入变量,或X,而t + 1列是输出变量,或y。

     t-1    t+1
0    NaN  266.0
1  266.0  145.9
2  145.9  183.1
3  183.1  119.3
4  119.3  180.3 

第2步:训练和测试集

下一步是将数据集分成训练集和测试集。

我们将保留前66%的“培训”观察结果,其余34%用于评估。在拆分期间,我们小心地排除具有NaN值的第一行数据。

在这种情况下不需要培训; 这只是习惯。然后将每个列车和测试装置分成输入和输出变量。

# split into train and test sets
X = dataframe.values
train_size = int(len(X) * 0.66)
train, test = X[1:train_size], X[train_size:]
train_X, train_y = train[:,0], train[:,1]
test_X, test_y = test[:,0], test[:,1]

 

第3步:持久性算法

我们可以将持久性模型定义为一个返回作为输入提供的值的函数。

例如,如果提供了t6值为266.0,那么这将作为预测返回,而实际的实际值或期望值恰好是145.9(取自滞后数据集中的第一个可用行)。

# persistence model

def model_persistence(x):

return x 

第4步:制作并评估预测

现在我们可以在测试数据集上评估此模型。

我们使用前向验证方法执行此操作。

不需要模型训练或再训练,因此实质上,我们逐步逐步测试数据集时间并获得预测。

一旦对训练数据集中的每个时间步进行预测,就将它们与预期值进行比较,并计算均方误差(MSE)分数。

# walk-forward validation
predictions = list()
for x in test_X:
yhat = model_persistence(x)
predictions.append(yhat)
test_score = mean_squared_error(test_y, predictions)
print('Test MSE: %.3f' % test_score)

在这种情况下,测试数据集的误差超过17,730。 

Test MSE: 17730.518


第5步:完成示例

最后,绘制一个图来显示训练数据集和来自测试数据集的预期值的偏差预测。

从持久性模型预测的情节来看,很明显该模型落后于现实一步。销售数据中出现了上升趋势和月度噪音,突显了持久性技术的局限性。

时间序列预测基础教程系列(6)_用Python进行时间序列预测的Baseline预测_第3张图片

                                                             洗发水销售持久性模型

下面列出了完整的示例。

from pandas import read_csv
from pandas import datetime
from pandas import DataFrame
from pandas import concat
from matplotlib import pyplot
from sklearn.metrics import mean_squared_error

def parser(x):
	return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
# 构建以个监督学习结构,滞后数据表
values = DataFrame(series.values)
dataframe = concat([values.shift(1), values], axis=1)
dataframe.columns = ['t-1', 't+1']
print(dataframe.head(5))

# 将数据分割为训练集和测试集
X = dataframe.values
train_size = int(len(X) * 0.66)
train, test = X[1:train_size], X[train_size:]
train_X, train_y = train[:,0], train[:,1]
test_X, test_y = test[:,0], test[:,1]

# 持久性模型,这里的映射模型是简单的对应关系
def model_persistence(x):
	return x

# 用model_persistence函数模拟预测模型,对预测结果和真实值做残差比较,检验结果
predictions = list()
for x in test_X:
	yhat = model_persistence(x)
	predictions.append(yhat)
test_score = mean_squared_error(test_y, predictions)
print('Test MSE: %.3f' % test_score)

# 画出结果
pyplot.plot(train_y)
pyplot.plot([None for i in train_y] + [x for x in test_y])
pyplot.plot([None for i in train_y] + [x for x in predictions])
pyplot.show()


我们已经看到了从头开始为Shampoo Sales问题开发的持久性模型的示例。 

持久性算法很幼稚。它通常被称为简单的预测

它没有假设应用它的时间序列问题的具体细节。这使得它易于理解,如此快速地实施和评估。

作为机器学习从业者,它也可以激发大量的改进。

记下来。这很有用,因为这些想法可以成为特征工程工作中的输入特征,或者可以在以后的集合工作中组合的简单模型。

你可能感兴趣的:(基于机器学习的时间序列预测,时间序列预测基础教程(统计学))