手记

如何对时间序列预测问题计算基准预测(python)

例程数据下载
建立基准对于时间序列预测问题是及其重要的。
基准效果会告诉你其他模型在解决你的问题的时候的实际效果有多好。
在这个教程中,你会发现如何制作一个persistence预测,用来对时间序列数据计算其基准性能。(基准性能水平)
完成这个教程,你会发现:

  • 在时间序列预测问题中计算基准性能的重要性

  • 如何用scratch开发一个persistence模型

  • 如何评估通过persistence模型得到预测,并用此来建立基准性能

预测基准性能

一个基准预测性能提供了一个比较点。
这是一个衡量所有其他模型技术在解决你的问题时候的参考点,如果模型完成效果等于或者弱于基准,那么该方法应该修正或者放弃。
用来产生一个预测计算基准性能的方法必须是容易执行的而且naive of problem-specific details。
在你能够在预测问题上简历一个基准性能之前,你必须有一个测试工具,由如下三个组成:
1.你打算用来训练和评估模型的数据集
2.你打算用来估计该技术性能的重采样技术
3.你打算用来评估预测的性能测试方法(比如均方误差)
一旦定下之后,你需要选择一个naive技术,使你能够用其进行预测,并计算基准性能。
你的目标是尽可能快的在你的时间序列问题下得到基准性能,使你能够更好的理解数据集并且开发出更先进的模型。
计算基准性能预测好的方法的三个基本策略:
1.简单。一个需要很少或者不需要训练的方法。

2.快速。一个能够快速执行并且能够简单的做出预测
3.可重复的。一个确定的方法。意思就是给定同样的输入,都能产生期望输出。
persistence方法是用来计算基准性能的常用算法。

persistence算法(‘naive’预测)

最常见的有监督机器学习基准方法是“零规则算法”

Persistence Algorithm

我们将这个部分分为四个模块:
1.把单一变量数据集转换成监督学习问题
2.为测试工具建立训练和测试数据集
3.定义persistence模型
4.做出预测并且建立基准性能
5.检查完整的实例并画出输出

step1  定义监督学习问题

第一步就是下载数据并构建其滞后表示。意思就是,给出t-1时刻的观测值,预测下一时刻t+1

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

这一小段程序创建了一个数据集并且输出前五行数据集,我们会发现第一行(index =  0)的数据没有历史观测值来做预测。就监督学习预测过程:t-1列为输入变量表示为X,t+1列为输出变量表示为y。

    t-1    t+1
0    NaN  266.01  266.0  145.92  145.9  183.13  183.1  119.34  119.3  180.3

step2 训练 & 测试集

下一步是将数据集分为训练和测试集。
我们将前66%的数据作为训练集,剩违下的34%数据作为评估用。在数据分离过程中,需要注意第一行的数据有nan这个值。
在这种情况下不需要训练,这只是一种习惯。每个训练以及测试集都被剥离成输入和输出变量对。

# split into train and test setsX = 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]

step3 Persistence算法

我们将persistence模型定义为返回输入值的函数。
举个例子:如果t-1时刻的值为266.0,那么这就被作为persistence模型返回的预测值。而实际的预期值是145.9(来自滞后表示的数据集)

# persistence modeldef model_persistence(x):
    return x

step4 对预测做评估

现在我们可以利用测试集对模型做预测了,我们利用walk-forward验证方法。
不需要再训练模型,因此,我们只需要一步步的利用测试集做预测。测试集中的数据每计算出一个预测值,就将其与期望值作比对,并计算均方误差。

# walk-forward validationpredictions = 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

step5 完整的例程

最后,下图显示了训练数据集和来自测试集的预测值情况。
从persistence模型预测图中看出,模型预测的结果正好比真实值延迟一个时间步。有一个上升趋势和销售数据环比噪音,这凸显了persistence技术的局限性。


Shampoo Sales Persistence Model


完整代码如下:

from pandas import read_csvfrom pandas import datetimefrom pandas import DataFramefrom pandas import concatfrom matplotlib import pyplotfrom sklearn.metrics import mean_squared_errordef parser(x):
    return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv',sep = ';', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)# Create lagged datasetvalues = 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 setsX = 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 modeldef model_persistence(x):
    return x# walk-forward validationpredictions = 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 resultspyplot.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()

我们已经看到了利用香皂销售数据拟合persistence模型的例子。
persistence算法太朴素了,这通常被叫做朴素预测。
这种方法应用到解决时间序列问题预测中时没什么细节。这使得整个过程容易理解并且能够快速的执行和评估。
作为一个机器学习从业者,这还能引发大量的改进,写下来。这是有用的因为其可以作为特征引擎的输入,或者可以利用集成学习的方法集成简单模型。



作者:yuanCruise
链接:https://www.jianshu.com/p/5a21871334c2

0人推荐
随时随地看视频
慕课网APP