Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python用广义加性模型GAM进行时间序列分析

Python用广义加性模型GAM进行时间序列分析

作者头像
拓端
发布于 2020-12-14 09:41:04
发布于 2020-12-14 09:41:04
1.9K00
代码可运行
举报
文章被收录于专栏:拓端tecdat拓端tecdat
运行总次数:0
代码可运行

原文:http://tecdat.cn/?p=4130

每当你发现一个与时间对应的趋势时,你就会看到一个时间序列。研究金融市场表现和天气预报的事实上的选择,时间序列是最普遍的分析技术之一,因为它与时间有着不可分割的关系 - 我们总是有兴趣预测未来。

时间相关模型

一种直观的预测方法是参考最近的时间点。今天的股价可能会比昨天的价格更接近五年前的价格。因此,在预测今天的价格时,我们会比最近的价格更重要。过去和现在值之间的这些相关性表明了时间依赖性,它形成了一种流行的时间序列分析技术ARIMA(自回归整合移动平均线)的基础。ARIMA既考虑季节变化又考虑过去的一次性“冲击”以作出未来预测。

但是,ARIMA做出了严格的假设。要使用ARIMA,趋势应该有规律的时期,以及不变的均值和方差。例如,如果我们想分析一个增长的趋势,我们必须首先对趋势进行变换,让其稳定。而且,如果我们缺少数据,ARIMA将无法工作。

我们可以考虑一种替代方法,如神经网络。长期短期记忆(LSTM)网络是一种基于时间依赖性建立模型的神经网络。虽然高度准确,但神经网络缺乏可解释性 - 很难确定导致特定预测的模型。

模型

除了使用类似时间点的值之间的相关性之外,我们可以退后一步对整体趋势进行建模。时间序列可以被看作是个体趋势的总和。

GAM背后的原理与回归相似,不同之处在于代替各个预测因子的求和效应,GAM是平滑函数的总和。函数允许我们对更复杂的模式进行建模,并对它们进行平均,以获得更平滑的平滑曲线。

因为GAM是基于函数而不是变量的,所以它们不受限于回归中的线性假设,即要求预测变量和结果变量以直线移动。此外,与神经网络不同,我们可以分离和研究GAM中各个功能对结果预测的影响。

在本教程中,我们将:

查看如何使用GAM的示例。

了解如何验证时间序列模型。

住在四季地区的人会知道一个事实:冬季的阳光比夏季少。为了弥补这一缺陷,一些国家在夏季的时候将时钟向前移动了一个小时,为夜间户外活动安排了更多的阳光,并有望减少用于家中取暖和照明的能量。夏季推进时钟的做法称为夏令时(DST),并于20世纪初实施。

但是DST的实际好处仍然存在争议。值得注意的是,DST已被证明会扰乱影响工作绩效甚至导致事故的睡眠模式。因此,无论何时何时调整时钟,人们都会被提示质疑DST的基本原理,而维基百科是答案的来源之一。

为了研究DST页面浏览的趋势,我们首先使用Python脚本从维基百科数据库中提取数据。使用了从2008年到2015年的浏览量。接下来,我们使用由Facebook研究人员发布的称为Prophet的GAM包来进行Python中的时间序列分析。该软件包也可在R中找到。

Prophet包是用户友好的,使我们能够指定不同类型的,包括所得到的GAM趋势的功能。有三种主要类型的功能:

总体增长。这可以建模为直线(线性)或稍微弯曲(逻辑)的趋势。在这个分析中,我们使用默认的线性增长模型。

季节性变化。这是使用傅里叶级数模型化的,它只是一种近似周期函数的方法。我们可以指定我们是否预计每周或/和年度趋势存在。

特别活动。除了模拟常规趋势之外,我们还应该考虑一次性事件。这包括任何现象,无论是政策公告还是自然灾害,都会为平滑的趋势增添涟漪。如果我们不考虑不规则事件,GAM可能会将它们误认为是持续事件,其影响将被错误地传播。

Prophet包还要求我们指定先验值,这些值决定了趋势线对数据值变化的敏感程度。较高的灵敏度会导致更多锯齿状的趋势,这可能会影响对未来值的普遍性。当我们验证我们的模型时,可以调整Priors,我们将在本教程后面看到。

现在,我们可以继续适应GAM。图3显示了总体增长,特殊事件和季节性变化的结果函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

compPlot = m.plot_components(forecast)
compPlot.savefig('images/time-components.png', format='png', bbox_inches='tight', dpi=1000)

图3.包含GAM预测DST维基百科文章页面视图的函数。在整体趋势和特殊事件(即'节假日')的前两张图中,X轴标记为'ds',代表'日期戳'。出现重复的年份标签,因为网格线与每年的相同日期不一致。

我们可以看到,DST维基百科文章的整体页面浏览量多年来一直在下降。最后,年度趋势显示,页面浏览量在三月底和十月底发生高峰期。

我们不需要知道包含在GAM中的确切预测函数是很方便的。相反,我们只需要指定一些约束条件,就会自动为我们导出。GAM如何做到这一点?

反拟合算法

为了找到适合数据的最佳趋势线,GAM使用称为反拟合的程序。反拟合是一个迭代地调整GAM中的函数的过程,以便它们产生使预测误差最小化的趋势线。一个简单的例子可以用来说明这个过程。

假设我们有以下数据:

图4.示例数据集,由两个预测变量和一个结果变量组成。

我们的目标是找到适用于预测因子的适当函数,以便我们可以准确预测结果。

首先,我们致力于为预测变量1找到一个函数。一个好的初始猜测可能是将它乘以2:

图5.将“乘以2”函数应用于预测器1的模型的结果。

从图5可以看出,通过对预测变量1应用“乘以2”的函数,我们可以完美地预测50%的结果。但是,还有改进的空间。

接下来,我们致力于为预测变量2找到函数。通过分析拟合预测变量1函数的预测误差,我们可以看到,只要预测变量2具有正值,只需将结果加1即可达到100%的准确度,并且别的什么都不做(即signmoid函数)。

这是一个反拟合过程的要点,总结了以下步骤:

步骤0:为一个预测器定义一个函数并计算出结果的误差。

步骤1:为最能减少错误的下一个预测器推导一个函数。

步骤2:对所有预测变量重复步骤1,并进一步重复循环以在必要时重新评估其功能,直到预测误差不能进一步最小化。

现在我们已经拟合了我们的模型,我们需要对其进行测试:它能够准确预测未来的值吗?

验证时间序列模型

交叉验证是评估模型预测未来价值有效性的首选技术。但是,时间序列模型是交叉验证不起作用的一个例外。

回想一下,交叉验证涉及将数据集分成随机子样本,用于重复训练和测试模型。关键的是,训练样本中使用的数据点必须独立于测试样本中的数据点。但这在时间序列中是不可能的,因为数据点是时间依赖的,所以训练集中的数据仍然会与测试集数据携带基于时间的关联。这需要不同的技术来验证时间序列模型。

我们可以根据时间段对它们进行切片,而不是随着时间对我们的数据点进行采样。如果我们想在未来一年(即预测时间范围)测试模型的预测准确性,我们可以将数据集划分为一年(或更长)的训练集,并使用每个分部预测其下一年的数值。这种技术被称为模拟历史预测。如果我们的预测范围是一年,那么我们应该每半年进行一次模拟预测。图6显示了11个DST维基百科页面浏览量的模拟预测结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

plt.plot_date(df.ds, df.y, fmt='.', ms=1, c='k', label='')
i = 0
for s in range(ns):
plt.fill_between(results.d])
i = i + H
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,
title='Fo

图6. DST维基百科页面浏览的模拟历史预测。

在图6中,预测范围为一年,每个训练部分包含三年的数据。例如,第一个预测频段(红色)使用2008年1月至2010年12月的数据来预测2011年1月 - 2011年12月的观点。我们可以看到,除了前两个模拟预测外,这些模拟预测被异常高的页面活动所误导在2010年,预测通常与实际值重叠。

为了更好地评估模型的准确性,我们可以从所有11个模拟预测中获取平均预测误差,并将其与预测时间范围进行比较,如图7所示。注意,随着我们试图进一步预测未来,误差会如何增加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

errorMeanSmooth = savgol_filter(errorMean, 365, 3)


plt.xlim([1,H])
plt.plot(range(H), errorMeanSmooth, c='k', lw=2)
plt.plot(range(H),
plt.xlabel('Forecas
plt.savefig('images/time-error.png', format='png', bbox_inches='tight', dpi=1000)
plt.show()

图7.预测范围内的预测误差。红线表示11个模拟预测的平均绝对误差,而黑线表示该误差的平滑趋势。

回想一下,我们需要调整的一个参数是先验值,它决定了我们的趋势对数据值变化的敏感程度。一种方法是尝试不同的参数值,并通过如图8所示的图进行比较。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

t.xlabel('Forecast Horizon (days)')
plt.ylabel('Mean Absolute Prediction Error')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,
title='Change Point Prior')
plt.savefig('images/time-errorCompare.png', format='png', bbox_inches='tight', dpi=1000)
plt.show()

图8.比较不同的先前值导致的预测误差。

除了调整先行者之外,我们还可以调整基础增长模型,季节性趋势和特殊事件的设置。对我们的数据进行可视化也有助于我们识别和删除异常值。例如,我们可以通过排除2010年的数据来改进预测,在此期间页面浏览次数非常高。

限制

正如你可能猜测的那样,在时间序列中有更多的训练数据不一定会导致更准确的模型。异常值或快速变化的趋势可能会加剧任何预测工作。更糟糕的是,对时间序列产生永久影响的突然震荡也可能使所有过去的数据无关紧要。

因此,时间序列分析最适合稳定和系统的趋势,我们可以通过可视化来评估趋势。

概要

时间序列分析是一种技术,可以推导出一段时间内的趋势,可用于预测未来的数值。广义相加模型(GAM)通过识别和累加多个函数来实现这一点,从而得到最适合数据的趋势线。

GAM中的函数可以使用反拟合算法来识别,该算法迭代地拟合和调整函数以减少预测误差。

时间序列分析最适合稳定和系统的趋势。


最受欢迎的见解

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数学建模--时间序列分析方法
在数学建模中,时间序列分析是一种重要的方法,用于研究和预测随时间变化的数据序列。这些数据可以是股票价格、气象观测、销售数据、人口统计等。时间序列分析的基本步骤包括处理缺失值、生成时间变量并绘制时间序列图,观察是否存在季节性波动,并根据图形大致判断数据的趋势。
用户11315985
2024/10/16
3840
数学建模--时间序列分析方法
重要的数据分析方法:时间序列分析
时间序列分析是一种重要的数据分析方法,用于处理随时间变化的数据。在Python数据分析中,有许多强大的工具和技术可用于进行时间序列分析。本文将详细介绍Python数据分析中时间序列分析的高级技术点,包括时间序列预处理、模型建立、预测和评估等。
网络技术联盟站
2023/07/03
8990
重要的数据分析方法:时间序列分析
最全总结【时间序列】时间序列的预处理和特征工程
时间序列(Time Series)是按时间顺序排列的一组数据点,通常用于描述和分析随时间变化的现象。时间序列数据在许多领域中都有广泛应用,如金融市场、气象学、经济学、医学等。
机器学习司猫白
2025/01/21
1.1K0
最全总结【时间序列】时间序列的预处理和特征工程
时间序列预测的20个基本概念总结
时间序列数据是有序的。这意味着观察/数据点依赖于以前的观察/数据点。因此,在模型训练期间,数据点顺序不会被打乱。
deephub
2023/08/30
8270
时间序列预测的20个基本概念总结
python用ARIMA模型预测CO2浓度时间序列实现|附代码数据
时间序列为预测未来数据提供了方法。根据先前的值,时间序列可用于预测经济,天气的趋势。时间序列数据的特定属性意味着通常需要专门的统计方法 ( 点击文末“阅读原文”获取完整代码数据 ) 。
拓端
2022/11/11
1.1K0
时间序列预测任务的模型选择最全总结
如果你正在处理时间序列数据,那么就跟云朵君一起学习如何根据预测性能来比较和选择时间序列模型。
数据STUDIO
2023/02/24
5.7K0
时间序列预测任务的模型选择最全总结
python3用ARIMA模型进行时间序列预测
ARIMA是首字母缩写词,代表自动回归移动平均。它是一类模型,可在时间序列数据中捕获一组不同的标准时间结构。
拓端
2022/06/08
1.5K0
python3用ARIMA模型进行时间序列预测
推荐系统中的时间序列分析
在推荐系统中,时间序列分析可以帮助系统理解用户行为随时间变化的模式,从而提供更加个性化和准确的推荐。本文将详细介绍时间序列分析在推荐系统中的应用,包括项目背景、关键技术、实施步骤以及未来的发展方向。文章将通过实例分析和代码部署过程,展示如何将时间序列分析技术有效应用于推荐系统中。推荐系统已成为现代互联网应用的核心组成部分,广泛应用于电子商务、社交媒体、视频流媒体等领域。为了提升推荐的准确性和个性化水平,推荐系统需要处理和分析大量用户行为数据。时间序列分析是理解用户行为模式变化的有效方法,通过对时间序列数据的分析,推荐系统可以捕捉到用户的长期趋势和短期波动,从而优化推荐策略。
数字扫地僧
2024/07/27
4430
机器学习(十一)时间序列模型
AR模型(自回归模型),是统计上一种处理时间序列的方法,用同一变数例如x的之前各期,亦即x1至xt-1来预测本期xt的表现,并假设它们为一线性关系。因为这是从回归分析中的线性回归发展而来,只是不用x预测y,而是用x预测 x(自己);所以叫做自回归。
致Great
2018/10/08
3.9K0
机器学习(十一)时间序列模型
时间序列数据分析与预测之Python工具汇总
在处理时间序列项目时,数据科学家或 ML 工程师通常会使用特定的工具和库。或者他们使用一些众所周知的工具,而这些工具已被证明可以很好地适用与对应的时间序列项目。
数据STUDIO
2022/05/24
2.3K0
时间序列数据分析与预测之Python工具汇总
通过 Python 代码实现时间序列数据的统计学预测模型
Autoregressive Integrated Moving Average model (ARIMA),差分整合移动平均自回归模型。ARIMA(p,d,q)主要包含三项:
deephub
2020/05/09
2.2K0
通过 Python 代码实现时间序列数据的统计学预测模型
基于 Prophet 的时间序列预测
如果你还在为时间序列预测而苦恼,那就一起走进兴奋而又神奇的Prophet世界吧。
腾讯技术工程官方号
2018/01/30
4.7K0
基于 Prophet 的时间序列预测
python用ARIMA模型预测CO2浓度时间序列实现|附代码数据
时间序列为预测未来数据提供了方法。根据先前的值,时间序列可用于预测经济,天气的趋势。时间序列数据的特定属性意味着通常需要专门的统计方法
拓端
2023/03/15
1.4K0
时间序列分析:对非平稳时间序列进行建模
编者按 曾经有位小伙伴在公众号留言提问:如何做时间序列分析?最近C君发现了一篇文章,也许可以解答这个问题,收录在此,以飨读者。本文来自于数据人网。 如果你有数据分析相关的问题,也可以公众号留言提问,说不定C君可以帮你找到答案。发现优质文章,也可以推荐给C君。祝,学习快乐~ 在这篇博客中,我将会简单的介绍一下时间序列分析及其应用。这里,我们将使用匹兹堡大学的教授David Stoffer所开发的R包astsa进行时间序列分析。而与之相关的课本,可以在Time Series Analysis and Its A
CDA数据分析师
2018/02/24
3.9K0
时间序列分析:对非平稳时间序列进行建模
数据分析之时间序列分析
顾名思义,时间序列就是按照时间顺利排列的一组数据序列。时间序列分析就是发现这组数据的变动规律并用于预测的统计技术。该技术有以下三个基本特点:
黄成甲
2018/09/12
2.4K0
数据分析之时间序列分析
2022年10个用于时间序列分析的Python库推荐
去年我们整理了一些用于处理时间序列数据的Python库,现在已经是2022年了,我们看看又有什么新的推荐
deephub
2022/11/11
1.6K0
2022年10个用于时间序列分析的Python库推荐
15种时间序列预测方法总结(包含多种方法代码实现)
在这篇文章中,我们将深入探讨时间序列预测的基本概念和方法。我们将首先介绍单元预测和多元预测的概念,然后详细介绍各种深度学习和传统机器学习方法如何应用于时间序列预测,包括循环神经网络(RNN)、一维卷积神经网络(1D-CNN)、Transformer、自回归模型(AR)、状态空间模型、支持向量机(SVM)和随机森林(RF)等。我们还会讨论这些方法在单元预测和多元预测中的适用性。
机器学习AI算法工程
2024/04/30
9.8K0
15种时间序列预测方法总结(包含多种方法代码实现)
使用R语言进行时间序列(arima,指数平滑)分析
您要分析时间序列数据的第一件事就是将其读入R,并绘制时间序列。您可以使用scan()函数将数据读入R,该函数假定连续时间点的数据位于包含一列的简单文本文件中。
拓端
2020/08/04
5.3K0
使用R语言进行时间序列(arima,指数平滑)分析
时间序列建模三部曲
与大多数高级分析解决方案不同,时间序列建模是一种低成本解决方案,可提供强大的洞察力。
拓端
2020/07/28
6300
时间序列建模三部曲
MADlib——基于SQL的数据挖掘解决方案(20)——时间序列分析之ARIMA
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/79310475
用户1148526
2019/05/25
1.1K0
推荐阅读
相关推荐
数学建模--时间序列分析方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验