建立基线对于任何时间序列预测问题都是至关重要的。
性能基准让您了解所有其他模型如何在您的问题上实际执行。
在本教程中,您将了解如何开发持久性预测,以便用Python计算时间序列数据集的性能基准级别。
完成本教程后,您将知道:Python学习交流群:1004391443
- 计算时间序列预测问题的性能基线的重要性。
- 如何在Python中从头开发一个持久化模型。
- 如何评估来自持久性模型的预测,并用它来建立性能基准。
让我们开始吧。
此配图与本文无关
预测基准性能(Forecast Performance Baseline)
预测基准性能给我们提供了一个比较点。
这是您的问题的所有其他建模技术的参考点。如果一个模型达到或低于基线的性能,该技术应该被固定或放弃。
用于生成预测以计算基线性能的技术必须易于实施,并且针对特定问题的细节尚未实现。
在为预测问题建立性能基准之前,您必须开发一个测试工具。这包括:
- 您打算用来训练和评估模型的数据集。
- 您打算用来估计技术性能的重采样技术(如,训练/测试分离)。
- 您打算用于评估预测的性能指标(例如均方误差)。
准备好之后,您需要选择一个朴素的方法,您可以使用此方法进行预测并计算基准性能。
目标是尽可能快地获得时间序列预测问题的基线性能,以便您更好地了解数据集并开发更高级的模型。
制定基线预测的好技术的三个属性是:
- 简单:只需要很少或根本不需要训练和智力的方法。
- 快速:一种快速执行的方法,在计算上可以做出预测。
- 可重复:一种确定性的方法,意味着它在给定相同的输入的情况下产生预期的输出。
用于建立基准性能的常用算法是持久性算法。
持久性算法("朴素"预测)
监督机器学习最常见的基线方法是零规则算法。
该算法在分类时可以预测大多数类别,或者在回归时可以预测平均结果。这可以用于时间序列,但不可以用于时间序列数据集中与序列相关的结构。
与时间序列数据集一起使用的等效技术是持久性算法。
持久性算法使用前一时间步(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
以下是从Data Market获取的整个数据集的图表,您可以下载数据集并了解更多信息。
洗发水销售数据集
数据集呈现增长趋势,当然可能还有一些季节性因素。
下载数据集并将其放在当前工作目录中,文件名为 " 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中轻松实现。
我们将这个部分分成4个步骤:
- 将单变量数据集转换为监督学习问题。
- 建立测试设备的训练和测试数据集。
- 定义持久性模型。
- 进行预测并建立基准性能。
- 查看完整的示例并绘制输出。
让我们来具体实施下把
第一步:定义监督学习问题
第一步是加载数据集并创建一个滞后表示。也就是说,给定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)
在这种情况下,测试数据集的均方差超过17730。
Test MSE: 17730.518
第5步:完成示例
最后,在同一个图中绘制测试数据集合的预期值曲线、训练数据集的数据曲线和不一致的预测图。
从持久性模型预测的情节来看,这个模型显然是落后于现实的一步。销售数字有上升的趋势并且会受累月的干扰数据影响,凸显了持久性技术的局限性。
洗发水销售持久性模型
完整的例子如下所示。
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_erro 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()
我们已经学习了从头开发一个针对洗发水销售问题的持久性模型的例子。
持久性算法是朴素的。它通常被称为朴素的预测(naive forecast)。
它并不假定它所适用的时间序列问题的具体情况。这使得理解变得容易,实施和评估也变得很快。
作为一名机器学习的,也可以进行大量的改进。
请吧这些改进的想法都记下来。这是非常有用的,因为这些想法可以成为特征工程工作中的输入特征,或者可以在后来的合成工作中组合成简单的模型。
结论
在本教程中,您了解到了如何建立Python时间序列预测问题的基准性能。
具体来说,你了解到:
- 建立一个基线和你可以使用的持久化算法的重要性。
- 如何从头开始在Python中实现持久化算法。
- 如何评估持久化算法的预测并将其用作基准。