如何使用Python进行时间序列预测的基线预测

       本文是翻译大神【Jason Brownlee PhD】的文章,很喜欢大神的时间序列系列的文章,原文在这里

       

       建立基线对于任何时间序列预测问题都是必不可少的。

      性能基准可以使您了解所有其他模型在解决问题上的实际效果。

      在本教程中,您将发现如何开发持久性预测,该持久性预测可用于计算Python时间序列数据集的基准性能水平。

       完成本教程后,您将知道:

计算时间序列预测问题的性能基准的重要性。
如何在Python中从头开始开发持久性模型。
如何从持久性模型评估预测并使用它来建立性能基准。
在我的新书中,通过28个循序渐进的教程和完整的python代码,了解如何准备和可视化时间序列数据并开发自回归预测模型。

预测性能基准
 

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

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

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

您打算用来训练和评估模型的数据集。
您打算用来估计技术性能的重采样技术(例如,训练/测试拆分)。
您打算用来评估预测的效果指标(例如均方误差)。
准备好之后,您需要选择一种天真的技术,可以用来进行预测并计算基准性能。

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

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

简单:只需很少或不需要训练或智慧的方法。
快速:一种实现速度快且计算量小的预测方法。
可重复的:一种确定性的方法,意味着在给定相同输入的情况下,它会产生预期的输出。
用于建立基准性能的常用算法是持久性算法。

持续性算法(“朴素”预测)

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

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

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

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

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

        为了具体化,我们将研究如何开发一个持久性模型,并使用它来建立一个简单的单变量时间序列问题的基线性能。 首先,让我们回顾一下洗发水销售数据集。

洗发水销售数据集

      此数据集描述了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

      下面是整个数据集的图,您可以在其中下载数据集并了解更多信息。

        数据集显示增加的趋势,并可能显示一些季节性成分。

       下载数据集并将其以文件名“ 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()

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

持续性算法

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

       我们将本节分为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:持续性算法

        我们可以将持久性模型定义为一个函数,该函数返回作为输入提供的值。例如,如果提供了t-1值为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)

    结果如下所示:

Test MSE: 17730.518

步骤5:完整范例

        最后,绘制一个图以显示训练数据集和来自测试数据集的期望值的偏离预测。从持久性模型预测的图上可以看出,该模型比实际情况落后了1步。 销售数据呈上升趋势,并且逐月出现噪音,这突出表明了持久性技术的局限性。

      完整代码实现如下所示:

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)
# 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))

# 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]

# persistence model
def model_persistence(x):
	return x

# 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)

# plot predictions and expected results
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()

        我们已经看到了针对香波销售问题从头开始开发的持久性模型的示例。持久性算法很幼稚。 它通常被称为幼稚的预测。它不假定要应用的时间序列问题的细节。 这就是为什么它变得如此容易理解,实现和评估如此之快。作为机器学习从业者,它还可以引发大量改进。

发布了532 篇原创文章 · 获赞 1297 · 访问量 334万+

猜你喜欢

转载自blog.csdn.net/Together_CZ/article/details/104817231