在R中使用开源大规模预测工具Prophet(一)

[复制链接]
发表于 : 2017-7-31 16:39:11 最新回复:2017-07-31 16:39:21
2430 1
建赟
建赟  专家

Prophet 是 Facebook 推出的开源大规模预测工具,可以在 R 和 Python 中使用以预测时间序列数据。

下面将简单介绍 Prophet 在 R 中的使用。

一、基础介绍

下面实例中使用的是佩顿 · 曼宁的维基百科主页每日访问量的时间序列数据(2007/12/10 – 2016/01/20)。我们使用 R 中的 Wikipediatrend 包获取该数据集。这个数据集具有多季节周期性、不断变化的增长率和可以拟合特定日期(例如佩顿 · 曼宁的决赛和超级碗)的情况等 Prophet 适用的性质,因此可以作为一个不错的例子。( 注: 佩顿 · 曼宁为前美式橄榄球四分卫)

在 R 中,Prophet 提供了一个 prophet 函数去拟合模型并且返回一个模型对象,可以对这个模型对象执行“预测”( predict )和“绘图”( plot )操作。

http://s1.51cto.com/wyfs02/M01/94/F3/wKiom1kQHo3Qb07aAADEWrq9qPs626.jpg

http://s2.51cto.com/wyfs02/M00/94/F3/wKiom1kQHpjj32uiAAC0rX37L0M204.jpg

使用 prophet_plot_components 函数去展示预测中的趋势、周效应和年度效应。

http://s4.51cto.com/wyfs02/M02/94/F3/wKiom1kQHqXi3NpTAABHmvO2mwA069.jpg

http://s5.51cto.com/wyfs02/M02/94/F2/wKioL1kQHq-SU4INAACllzzVe0Y213.jpg

注: Windows 系统语言设置为中文的话,会导致 R 输出成分分析图时,周效应无法正常显示,可在 R 中使用 Sys.setlocale("LC_ALL","English") 代码将环境改为英文。

二、预测增长

默认情况下, Prophet 使用线性模型进行预测。当预测增长情况时,通常会存在可到达的最大极限值,例如:总市场规模、总人口数等等。这被称做承载能力,那么预测时就应当在接近该值时趋于饱和。

Prophet 可使用 logistic 增长 趋势模型进行预测,同时指定承载能力。下面使用 R 语言的维基百科主页 访问量(取对数)的实例来进行说明。

http://s3.51cto.com/wyfs02/M00/94/F3/wKiom1kQHrzQnEw5AACoUKyvkuo631.jpg

http://s3.51cto.com/wyfs02/M02/94/F3/wKiom1kQHseA1dnTAAC4z4mk7AU260.jpg

三、趋势突变点

默认情况下, Prophet 将自动监测到突变点,并对趋势做适当地调整。

下面将会介绍几种使用的方法可以对趋势的调整过程做更好地控制。

1. 调整趋势的灵活性

如果趋势的变化被过度拟合(即过于灵活)或者拟合不足(即灵活性不够),可以利用输入参数 changepoint.prior.scale 来调整稀疏先验的程度。默认下,这个参数被指定为 0.05 。

增加这个值,会导致趋势拟合得更加灵活。如下代码和图所示:

http://s5.51cto.com/wyfs02/M00/94/F2/wKioL1kQHtOTi2uyAACQ8nhj5cY153.jpg

http://s5.51cto.com/wyfs02/M01/94/F3/wKiom1kQHt2CtyxQAACxdblUpio799.jpg

减少这个值,会导致趋势拟合得灵活性降低。如下代码和图所示:

http://s1.51cto.com/wyfs02/M02/94/F2/wKioL1kQHufSSe7HAABk0WAqOH4336.jpg

http://s1.51cto.com/wyfs02/M01/94/F3/wKiom1kQHvCTENsXAAC0cC00tiM042.jpg

四、节假日效应

1. 对节假日建模

如果需要专门对节假日进行建模,你就必须得为此创建一个新的数据框,其中包含两列(节假日 holiday 和日期戳 ds ),每行分别记录了每个出现的节假日。

你可以在这个数据框基础上再新建两列 lower_window 和 upper_window ,从而将节假日的时间扩展成一个区间 [ lower_window , upper_window ] 。举例来说,如果想将平安夜也加入到 “圣诞节” 里,就设置 lower_window = -1 , upper_window = 0 ;如果想将黑色星期五加入到 “感恩节” 里,就设置 lower_window = 0 , upper_window = 1 。

下面我们创建一个数据框,其中包含了所有佩顿 · 曼宁参加过的决赛日期:

http://s3.51cto.com/wyfs02/M01/94/F2/wKioL1kQHvvA7Kd0AADzMFtgRvg485.jpg

上述代码中,我们将超级碗的日期既记录在了决赛的日期数据框中,也记录在了超级碗的日期数据框中。这就会造成超级碗日期的效应会在决赛日期的作用下叠加两次。

一旦这个数据框创建好了,就可以通过传入 holidays 参数使得在预测时考虑上节假日效应。

http://s4.51cto.com/wyfs02/M00/94/F2/wKioL1kQHwbSv6FRAABV6qMOynQ726.jpg

可通过 forecast 数据框,来展示节假日效应:

http://s4.51cto.com/wyfs02/M02/94/F3/wKiom1kQHxDBLbuGAABQYxqnOXY526.jpg

http://s5.51cto.com/wyfs02/M01/94/F3/wKiom1kQHxqwE9n2AAFot590_ao276.jpg

在成分分析的图中,如下所示,也可以看到节假日效应。我们可以发现,在决赛日期附近有一个穿透,而在超级碗日期时穿透则更为明显。

http://s5.51cto.com/wyfs02/M02/94/F2/wKioL1kQHyXS7bzMAAAxzmGYUSQ024.jpg

http://s4.51cto.com/wyfs02/M00/94/F2/wKioL1kQHzGgRc2fAACHJvLd86M488.jpg

http://s5.51cto.com/wyfs02/M00/94/F2/wKioL1kQHzuBCQY_AACBvJL8qEk322.jpg

2. 对节假日和季节性设定先验规模

如果发现节假日效应被过度拟合了,通过设置参数 holidays.prior.scale 可以调整它们的先验规模来使之平滑,默认下该值取 10 。

http://s4.51cto.com/wyfs02/M01/94/F3/wKiom1kQH0uC3botAACJoY7Wpb4606.jpg

http://s5.51cto.com/wyfs02/M01/94/F2/wKioL1kQH1aRkbciAAF3_vrGjUw149.jpg

和之前相比,节假日效应的规模被减弱了,特别是对观测值较少的超级碗而言。类似的,还有一个 seasonality.prior.scale 参数可以用来调整模型对于季节性的拟合程度。


  • x
  • 常规:

点评 回复

跳转到指定楼层
建赟
建赟  专家 发表于 2017-7-31 16:39:21 已赞(0) 赞(0)

顶一个!
  • x
  • 常规:

点评 回复

发表回复
您需要登录后才可以回帖 登录 | 注册

警告 内容安全提示:尊敬的用户您好,为了保障您、社区及第三方的合法权益,请勿发布可能给各方带来法律风险的内容,包括但不限于政治敏感内容,涉黄赌毒内容,泄露、侵犯他人商业秘密的内容,侵犯他人商标、版本、专利等知识产权的内容,侵犯个人隐私的内容等。也请勿向他人共享您的账号及密码,通过您的账号执行的所有操作,将视同您本人的行为,由您本人承担操作后果。详情请参看“隐私声明
如果附件按钮无法使用,请将Adobe Flash Player 更新到最新版本!
登录参与交流分享

登录参与交流分享

登录