文章转自 男票的博客 哈哈哈!
Together_CZ的博客
种一棵树,最好的时间是十年前,其次是现在
有问题问我 ==
完成本教程后,您将知道:
计算时间序列预测问题的性能基准的重要性。
如何在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()
形成图像如下:
-
持续性算法
-
步骤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()