本文是翻译大神【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 pyplotdef 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_errordef 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()

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

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

  1. 如何使用 Python 进行时间序列预测?

    建立基线对于任何时间序列预测问题都是至关重要的. 性能基准让您了解所有其他模型如何在您的问题上实际执行. 在本教程中,您将了解如何开发持久性预测,以便用Python计算时间序列数据集的性能基准级别. ...

  2. 用Python进行时间序列分解和预测

    Datawhale推荐 作者:Mohit Sharma,来源:数据派THU 本文约4100字,建议阅读10+分钟 本文介绍了用Python进行时间序列分解的不同方法,以及如何在Python中进行时间序 ...

  3. 独家 | 手把手教你用Python进行时间序列分解和预测

    作者:Mohit Sharma 翻译:王闯(Chuck) 校对:王可汗 本文约4100字,建议阅读10+分钟 本文介绍了用Python进行时间序列分解的不同方法,以及如何在Python中进行时间序列预 ...

  4. 用python做时间序列预测一:初识概念

    用python做时间序列预测一:初识概念 利用时间序列预测方法,我们可以基于历史的情况来预测未来的情况.比如共享单车每日租车数,食堂每日就餐人数等等,都是基于各自历史的情况来预测的. 什么是时间序列? ...

  5. 【Python】时间序列数据分析与预测之Python工具汇总

    本文中总结了十多种时间序列数据分析和预测工具和python库,在我们处理时间序列项目时,可以翻开本文,根据需要选择合适的工具,将会事半功倍! 在处理时间序列项目时,数据科学家或 ML 工程师通常会使用 ...

  6. Python 用ARIMA、GARCH模型预测分析股票市场收益率时间序列

    最近我们被客户要求撰写关于时间序列的研究报告,包括一些图形和统计输出. 相关视频:时间序列分析:ARIMA GARCH模型分析股票价格数据 时间序列分析模型 ARIMA-ARCH GARCH模型分析股 ...

  7. 干货 :手把手教你用Python进行时间序列分解和预测

    作者:Mohit Sharma   翻译:王闯(Chuck)   校对:王可汗 本文约4100字,建议阅读10+分钟 本文介绍了用Python进行时间序列分解的不同方法,以及如何在Python中进行时 ...

  8. Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性...

    全文链接:http://tecdat.cn/?p=26562 该项目包括: 自 2000 年 1 月以来的股票价格数据.我们使用的是 Microsoft 股票. 将时间序列数据转换为分类问题. 使用 ...

  9. python进行数据预测_手把手教你用Python进行时间序列分解和预测

    原标题:手把手教你用Python进行时间序列分解和预测 作者:Mohit Sharma 翻译:数据派THU-王闯(Chuck) 预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃.时间序列 ...

  10. 用python做时间序列预测十:时间序列实践-航司乘客数预测

    本文以航司乘客数预测的例子来组织相关时间序列预测的代码,通过了解本文中的代码,当遇到其它场景的时间序列预测亦可套用. 航司乘客数序列 预测步骤 # 加载时间序列数据 _ts = load_data() ...

最新文章

  1. Linux-鸟菜-6-文件搜索
  2. 深度 | 一条查询SQL的前世今生 —— ClickHouse 源码阅读
  3. [ZJOI2008] 树的统计(树链剖分)
  4. 学习ModSecrity Handbook之摘录
  5. 《深度学习入门》实现三层神经网络前向传播
  6. java字符串与数组比较大小_java-如何将存储在数组中的字符串与简单字符串进行比较?...
  7. 2020年前端如何适应大环境,发展的前途与趋势是怎么样的?
  8. group by 多个字段
  9. Spring初学快速入门
  10. opengl 加载贴图Unknown DIB file format问题
  11. Oracle 集群sysbackup用户登陆随机报错ORA-01017
  12. 瞎聊机器学习——朴素贝叶斯以及拉普拉斯平滑
  13. 权力来自于他人的服从
  14. 基于 Netty 重构 RPC 框架
  15. 图像处理技术:图像切割、标签、贴纸花字,超细开发详解
  16. MOOC清华《面向对象程序设计》第9章:听课感想
  17. 阿里mysql命名规范_MySQL命名、设计及使用规范《MySQL命名、设计及使用规范》
  18. Github优秀作品
  19. SCC会员北京车展围拍超跑 却火了这款华为MateRS保时捷版手机
  20. 逆地理编码-离线版-part2

热门文章

  1. 电脑每次开机都要重新设置时间解决方法
  2. 洛谷 P3397 地毯 【二维差分标记】
  3. 前端工程精粹(二):静态资源管理与模板框架
  4. python类与对象-如何派生内置不可变类型并修其改实例化行为
  5. [BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)
  6. java 定义mysql树形菜单
  7. 工具-管理工具资源集合
  8. Android类参考---Fragment(二)
  9. 基于visual c++之windows核心编程代码分析(35)实践NT服务的框架
  10. [转贴]在C#中应用哈希表(Hashtable)