查看原文
其他

Facebook 开源的 Python 预测工具,用起来太方便了

Python高校 2020-10-08

点击上方“Python高校”,马上关注

真爱,请置顶或星标

文 | 标点符

出处 | biaodianfu.com


Prophet是Facebook开源的预测工具,相比ARIMA模型,Prophet真的是非常的简单。只要读入两列数据即可完成预测。且在某些环境下预测的准确性不输ARIMA。Prophet提供了R语言版本和Python版本,这里主要讲解的是Python版本。更多信息可产看官方链接。

Prophet的安装

fbprophet为Prophet在Python环境下的包,想要使用fbprohhet并没有想象中的那么简单,特别是在Windows系统上可能发生错误。主要原因是fbprophet基于pystan,pystan基于cython。问题会卡在pystan的安装上。

即正确的安装流程为:

  1. pip install cython

  2. pip install pystan

  3. pip install fbprophet

在安装pystan时会报如下错误:WARNING:pystan:MSVC compiler is not supported 。具体原因可在官方说明中找到:

PyStan is partially supported under Windows with the following caveats:

Python 2.7: Doesn’t support parallel sampling. When drawing samples n_jobs=1 must be used)

Python 3.5 or higher: Parallel sampling is supported

MSVC compiler is not supported.

PyStan requires a working C++ compiler. Configuring such a compiler is typically the most challenging step in getting PyStan running.

PyStan is tested against the MingW-w64 compiler which works on both Python versions (2.7, 3.x) and supports x86 and x64.

Due to problems with MSVC template deduction, functions with Eigen library are failing. Until this and other bugs are fixed no support is provided for Windows + MSVC. Currently, no fix is known for this problem, other than to change the compiler to GCC or clang-cl.

解决方案为:将Python编译环境更改为MingW-w64。

下载MingW-w64,并进行安装,下载地址:https://osdn.net/projects/mingw/releases/

将mingw的路径添加到环境变量的PATH中,示例路径:C:\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin

验证编译环境是否OK,验证方式为在cmd中执行如下命名 gcc –dumpversion、ld –v、dllwrap –version

修改Python内部编译设置,方法为在Python安装目录下(示例:C:\Python36\Lib\distutils),新建distutils.cfg文件,文件内容为

[build]

 compiler = mingw32

完后后再执行安装即可。如果是Anaconda环境,除了上述步骤外,还需执行:

  1. conda update conda

  2. conda install libpython m2w64-toolchain -c msys2

Prophet的使用

数据集:https://pan.baidu.com/s/1Pw8ZSQgD8vLJjiQUhIJv_A 提取码: taav

  1. import pandas as pd

  2. from fbprophet importProphet

  3. import matplotlib.pyplot as plt


  4. data = pd.read_csv('AirPassengers.csv', parse_dates=['Month'])

  5. print(data.head())



  6. MonthAirPassengers

  7. 01949-01-01112

  8. 11949-02-01118

  9. 21949-03-01132

  10. 31949-04-01129

  11. 41949-05-01121

Prophet 的输入量必须包含两列的数据框:ds 和 y 。ds 列为时间格式。y 列必须是数值变量,表示我们希望去预测的量。属于拿到数据后需要修改列名:

  1. data = data.rename(columns={'Month': 'ds', 'AirPassengers': 'y'})

  2. print(data.head())


  3. ds y

  4. 01949-01-01112

  5. 11949-02-01118

  6. 21949-03-01132

  7. 31949-04-01129

  8. 41949-05-01121

观察数据:

  1. ax = data.set_index('ds').plot(figsize=(12, 6))

  2. ax.set_ylabel('Monthly Number of Airline Passengers')

  3. ax.set_xlabel('Date')

  4. plt.show()

Prophet 遵循 sklearn 库建模的应用程序接口。我们创建了一个 Prophet 类的实例,其中使用了“拟合模型” fit 和“预测” predict 方法。默认情况下, Prophet 的返回结果中会包括预测值 yhat 的预测区间。当然,预测区间的估计需建立在一些重要的假设前提下。在预测时,不确定性主要来源于三个部分:趋势中的不确定性、季节效应估计中的不确定性和观测值的噪声影响。

趋势中的不确定性

预测中,不确定性最大的来源就在于未来趋势改变的不确定性。在之前教程中的时间序列实例中,我们可以发现历史数据具有明显的趋势性。Prophet 能够监测并去拟合它,但是我们期望得到的趋势改变究竟会如何走向呢?或许这是无解的,因此我们尽可能地做出最合理的推断,假定 “未来将会和历史具有相似的趋势” 。

尤其重要的是,我们假定未来趋势的平均变动频率和幅度和我们观测到的历史值是一样的,从而预测趋势的变化并通过计算,最终得到预测区间。这种衡量不确定性的方法具有以下性质:变化速率灵活性更大时,预测的不确定性也会随之增大。原因在于如果将历史数据中更多的变化速率加入了模型,也就代表我们认为未来也会变化得更多,就会使得预测区间成为反映过拟合的标志。预测区间的宽度(默认下,是 80% )可以通过设置 interval_width 参数来控制:

  1. my_model = Prophet(interval_width=0.95) #设置置信空间为95%(如果不设置的话默认80%)

  2. my_model.fit(data)

由于预测区间估计时假定未来将会和过去保持一样的变化频率和幅度,而这个假定可能并不正确,所以预测区间的估计不可能完全准确。


季节效应估计中的不确定性

默认情况下, Prophet 只会返回趋势中的不确定性和观测值噪声的影响。你必须使用贝叶斯取样的方法来得到季节效应的不确定性,可通过设置 mcmc.samples 参数(默认下取 0 )来实现。

  1. my_model = Prophet(interval_width=0.95, mcmc_samples=500) #设置置信空间为95%(如果不设置的话默认80%)

  2. my_model.fit(data)

上述代码将最大后验估计(MAP)取代为马尔科夫蒙特卡洛取样(MCMC)。执行后可通过绘图的方式直观的观测到季节效应的不确定性。

观测值的噪声影响

处理异常值最好的方法是移除它们,而 Prophet 使能够处理缺失数据的。如果在历史数据中某行的值为空(NA),但是在待预测日期数据框 future 中仍保留这个日期,那么 Prophet 依旧可以给出该行的预测值。

预测将会建立在一列包含日期 ds 的数据框基础上来预测指定日期的数据。make_future_dataframe 函数使用模型对象和一段待预测的时期去构建一个相应的包含待预测日期的数据框。默认情况下,该函数将会自动包含历史数据的日期,因此可用来分析训练集的拟合效果。

  1. future_dates = my_model.make_future_dataframe(periods=36, freq='MS')

  2. print(future_dates.head())


  3. ds

  4. 01949-01-01

  5. 11949-02-01

  6. 21949-03-01

  7. 31949-04-01

  8. 41949-05-01

在Prophet中使用通用的 predict 函数来预测数据。预测结果 forecast 对象是包含了预测值 yhat 的数据框,此外,还有其余的列用来储存估计的置信区间和季节因子。

  1. forecast = my_model.predict(future_dates)

  2. forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()


  3. ds yhat yhat_lower yhat_upper

  4. 1751963-08-01659.473243592.176200726.973325

  5. 1761963-09-01613.132606542.378855677.590035

  6. 1771963-10-01576.340290505.417141642.690391

  7. 1781963-11-01545.832790478.427462610.037598

  8. 1791963-12-01575.599488501.734482649.450637

查看预测效果:my_model.plot(forecast, uncertainty\=True)

查看分解效果:my_model.plot_components(forecast)

更多参考:https://facebook.github.io/prophet/

原文:https://www.biaodianfu.com/fbprophet.html



推荐:

开源库

Python 开发者必知的 11 个 Python GUI 库

10款 Web开发最佳的 Python 框架

推荐 GitHub 上100天学习 Python的开源项目

Python绘图还在用Matplotlib?out了 !发现一款手绘可视化神器!


面试


我用  Python 爬了天猫内衣店的数据Python爬完数据后,我终于买车不用坐引擎盖哭啦
1年工作经验,拿下今日头条 Python 开发面经分享!
Python 面试中 8 个必考问题
面试 4 个月,最终入职微软!
10 家公司 Python 面试题总结
面试了9家公司,拿到5份Offer
面试Python怕? 你想要的315道题都在这了
如何拿到半数面试公司Offer——我的Python求职之路



学习路线


基于TensorFlow 2.0的中文深度学习开源书来了!GitHub趋势日榜第一,斩获2K+星
微软官方上线了Python 教程,7个章节就把Python说通了
最全 14 张思维导图:教你构建 Python 编程的核心知识体系
  Python 从入门到精通:一个月就够了!
  24招加速你的Python,超级实用!
即学即用的 30 段 Python 非常实用的代码




工具

最靠谱的Pycharm 汉化安装+ 破解详细教程!

Python数据分析、挖掘常用工具

Python 最强 IDE 详细使用指南!

一款 Python 自动抢票神器,收藏起来回家不愁!


实践和数据分析


Python 开发植物大战僵尸游戏

用 Python 来找合适的妹子

一键分析你上网行为,看你是在认真工作还是摸鱼

Python给照片换底色,基于opencv模块

10个经典的小技巧:快速用 Python 进行数据分析

使用 Python 进行微信好友分析


爬虫


我给曾经暗恋的初中女同学,用Python实现了她飞机上刷抖音

为了能早点买房,我用 Python 预测房价走势!

被女朋友三番五次拉黑后,我用 Python 写了个“舔狗”必备神器

谁偷偷删了你的微信?别慌!Python 揪出来为了给女友挑合适的内衣,我用  Python 爬了天猫内衣店的数据Python爬完数据后,我终于买车不用坐引擎盖哭啦


这里除了干货一无所有

看完本文有收获?请转发分享给更多人

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存