声明:
创建一个baseline总是时间序列预测的关键一步。一个baseline可以帮助我们了解模型的好坏。本文将会创建一个基本的时间序列预测模型——persistence模型,该模型的预测可以作为一个baseline。
通过本文,你将学到:
baseline的作用在于比较,我们通常将预测结果好于baseline的模型保留并舍弃结果差的。一个合理的baseline应该来自一个简单模型,并且不会过多的考虑数据细节方面的特征。
首先,确定数据集、如何划分训练集和测试集、模型评估方法(如MSE)。然后,尽可能选择一个简单的模型快速计算baseline。这个简单的模型应满足一下基本要素:
下面介绍最常用的建立baseline的模型——persistence模型。
监督学习中最常用的获得baseline的方法是Zero Rule。该方法在分类问题中,总是输出出现次数最多的类;在回归问题中,总是输出平均值。
对于时间序列预测,应该考虑序列中的自相关性,找到更好的计算baseline的方法。
persistence方法用t-1时刻的数据预测t时刻的数据。下面,我们来实现该方法。这里用到的数据集是Shampoo Sales Dataset.
该数据集是3年里洗发水的月销量,有36个观测值,具体如下:
"Month","Sales"
"1-01",266.0
"1-02",145.9
"1-03",183.1
"1-04",119.3
"1-05",180.3
通过洗发水的销量图发现,销量上涨的趋势明显,且有季节性波动。
我们将分一下几步实现Persistence预测:
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)
# Create lagged dataset
values = DataFrame(series.values)
dataframe = concat([values.shift[1], values], axis=1)
dataframe.columns = ['t-1', 't']
print(dataframe.head())
'''输出
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
'''
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_persestence(x):
return x
预测方法为walk-forward。直接预测是将预测值作为下一步预测的输入;walk-forward用测试集中的真实值作为下一步预测的输入。
# 用真实的t-1时刻的值预测t时刻的值
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
'''
# 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()