| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> fbprophet -> 正文阅读 |
|
[人工智能]fbprophet |
1?Prophet 简介?? ? ? Facebook 开源了一个时间序列预测的算法,叫做?fbprophet,它的官方网址与基本介绍来自于以下几个网站:
? ? ? ? 从官网的介绍来看,Facebook 所提供的 prophet 算法不仅可以处理时间序列存在一些异常值的情况,也可以处理部分缺失值的情形,还能够几乎全自动地预测时间序列未来的走势。从论文上的描述来看,这个 prophet 算法是基于时间序列分解和机器学习的拟合来做的,其中在拟合模型的时候使用了 pyStan 这个开源工具,因此能够在较快的时间内得到需要预测的结果。除此之外,为了方便统计学家,机器学习从业者等人群的使用,prophet 同时提供了 R 语言和 Python 语言的接口。从整体的介绍来看,如果是一般的商业分析或者数据分析的需求,都可以尝试使用这个开源算法来预测未来时间序列的走势。 2 Prophet 数据的输入和输出? ? ? ? prophet 所做的事情就是:
? ? ? ? 就一般情况而言,时间序列的离线存储格式为时间戳和值这种格式,更多的话可以提供时间序列的 ID,标签等内容。因此,离线存储的时间序列通常都是以下的形式。其中 date 指的是具体的时间戳,category 指的是某条特定的时间序列 id,value 指的是在 date 下这个 category 时间序列的取值,label 指的是人工标记的标签('0' 表示异常,'1‘ 表示正常,'unknown' 表示没有标记或者人工判断不清)。 ? ? ? ? ? ? ? ? ?? ? ? ? ? 而 fbprophet 所需要的时间序列也是这种格式的,根据官网的描述,只要用 csv 文件存储两列即可,第一列的名字是 'ds', 第二列的名称是 'y'。第一列表示时间序列的时间戳,第二列表示时间序列的取值。通过 prophet 的计算,可以计算出 yhat,yhat_lower,yhat_upper,分别表示时间序列的预测值,预测值的下界,预测值的上界。两份表格如下面的两幅图表示。? ??? ? ? ? ? ? ? ? ? ? ? ? ?Prophet 的输入画图:
3?Prophet 算法原理? ? ? ??在时间序列分析领域,有一种常见的分析方法叫做时间序列的分解(Decomposition of Time Series),它把时间序列?分成几个部分,分别是季节项,趋势项,剩余项,也就是说对所有的,都有 ?? ? ? ? ? ? ? ? 除了加法的形式,还有乘法的形式,也就是: ? ? ? ? ?*? ? ? ? ? 以上式子等价于????????。所以,有的时候在预测模型的时候,会先取对数,然后再进行时间序列的分解,就能得到乘法的形式。在 fbprophet 算法中,作者们基于这种方法进行了必要的改进和优化。 ? ? ? ? 模型整体主要由三部分组成:
? ? ? ? 其中:
? ? ? ? Prophet 算法就是通过拟合这几项,然后最后把它们累加起来就得到了时间序列的预测值。 2.1 趋势项模型? ? ? ? 趋势项有两个重要的函数,一个是基于逻辑回归函数的(非线性增长),另一个是基于分段线性函数的(线性增长) 2.1.1 基于逻辑回归的趋势项? ? ? ? 如果回顾逻辑回归函数的话,一般都会想起这样的形式:,它的导数是,如果增加一些参数的话,那么逻辑回归就可以改写成: ? ? ? ? ? ?? ? ? ? ? 这里的???称为曲线的最大渐近值,??表示曲线的增长率,??表示曲线的中点。当??时,恰好就是大家常见的 sigmoid 函数的形式。从 sigmoid 的函数表达式来看,它满足以下的微分方程:。 ? ? ? ? 那么,如果使用分离变量法来求解微分方程就可以得到: ? ? ? ? ? ? ? ? ? ? 但是在现实环境中,函数?的三个参数??不可能都是常数,而很有可能是随着时间的迁移而变化的,因此,在 Prophet 里面,作者考虑把这三个参数全部换成了随着时间而变化的函数,也就是???。 ? ? ? ? ?除此之外,在现实的时间序列中,曲线的走势肯定不会一直保持不变,在某些特定的时候或者有着某种潜在的周期曲线会发生变化,这种时候,就有学者会去研究变点检测,也就是所谓 change point detection。例如下面的这幅图的???就是时间序列的两个变点。 ?? ? ? ?? ? ? ? ? ?在 Prophet 里面,是需要设置变点的位置的,而每一段的趋势和走势也是会根据变点的情况而改变的。在程序里面有两种方法:
? ? ? ? 在默认的函数里面,Prophet 会选择 n_changepoints = 25 个变点,然后设置变点的范围是前 80%(changepoint_range),也就是在时间序列的前 80% 的区间内会设置变点。通过 forecaster.py 里面的 set_changepoints 函数可以知道,首先要看一些边界条件是否合理,例如时间序列的点数是否少于 n_changepoints 等内容;其次如果边界条件符合,那变点的位置就是均匀分布的,这一点可以通过 np.linspace 这个函数看出来。 ? 2.1.2 基于分段线性函数的趋势项? ? ? ? ?众所周知,线性函数指的是??,而分段线性函数指的是在每一个子区间上,函数都是线性函数,但是在整段区间上,函数并不完全是线性的。正如下图所示,分段线性函数就是一个折线的形状。 ? ? ? ? ? ?因此,基于分段线性函数的模型形如: ? ? ? ??? ? ? ? ? 其中?
? ? ? ? 而这两种方法(分段线性函数与逻辑回归函数)最大的区别就是???的设置不一样,在分段线性函数中,???注意:这与之前逻辑回归函数中的设置是不一样的。? ? ? ? ? ?在 Prophet 的源代码中,forecast.py 这个函数里面包含了最关键的步骤,其中 piecewise_logistic 函数表示了前面所说的基于逻辑回归的增长函数,它的输入包含了 cap 这个指标,因此需要用户事先指定 capacity。而在 piecewise_linear 这个函数中,是不需要 capacity 这个指标的,因此 m = Prophet() 这个函数默认的使用 growth = 'linear' 这个增长函数,也可以写作 m = Prophet(growth = 'linear');如果想用 growth = 'logistic',就要这样写:
?2.2?变点的选择? ? ? 在介绍变点之前,先要介绍一下 Laplace 分布,它的概率密度函数为: ?? ? ??? ? ? ? ?其中???表示位置参数,??表示尺度参数。Laplace 分布与正态分布有一定的差异。? ? ? ? ? 在 Prophet 算法中,是需要给出变点的位置,个数,以及增长的变化率的。因此,有三个比较重要的指标,那就是
? ? ? ?changepoint_range 指的是百分比,需要在前 changepoint_range 那么长的时间序列中设置变点,在默认的函数中是 changepoint_range = 0.8。n_changepoint 表示变点的个数,在默认的函数中是 n_changepoint = 25。changepoint_prior_scale 表示变点增长率的分布情况,在论文中,??,这里的??就是 change_point_scale。 ? ? ? ? ?在整个开源框架里面,在默认的场景下,变点的选择是基于时间序列的前 80% 的历史数据,然后通过等分的方法找到 25 个变点(change points),而变点的增长率是满足 Laplace 分布??的。因此,当??趋近于零的时候,??也是趋向于零的,此时的增长函数将变成全段的逻辑回归函数或者线性函数。这一点从??的定义可以轻易地看出。 ?2.3?对未来的预估?2.4?季节性趋势? ? ? ? 几乎所有的时间序列预测模型都会考虑这个因素,因为时间序列通常会随着天,周,月,年等季节性的变化而呈现季节性的变化,也称为周期性的变化。对于周期函数而言,大家能够马上联想到的就是正弦余弦函数。而在数学分析中,区间内的周期性函数是可以通过正弦和余弦的函数来表示的:假设??是以??????????为周期的函数,那么它的傅立叶级数就是 ? ? ? ??? ? 2.5 节假日效应(holidays and events)? ? ? ??在现实环境中,除了周末,同样有很多节假日,而且不同的国家有着不同的假期。在 Prophet 里面,通过维基百科里面对各个国家的节假日的描述,hdays.py 收集了各个国家的特殊节假日。除了节假日之外,用户还可以根据自身的情况来设置必要的假期,例如 The Super Bowl,双十一等。 ?? ? ? ? ? ??? ?2.5?模型拟合(Model Fitting)? ? ? ?按照以上的解释,我们的时间序列已经可以通过增长项,季节项,节假日项来构建了,i.e. ? ? ? ? ? ? ? ?? ? ? ? ?下一步我们只需要拟合函数就可以了,在 Prophet 里面,作者使用了 pyStan 这个开源工具中的 L-BFGS 方法来进行函数的拟合。具体可以参考 forecast.py 里面的 stan_init 函数。 2.6 Prophet 中可以设置的参数???????? ? ? ? 在 Prophet 中,用户一般可以设置以下四种参数:
? ? ? 如果不想设置的话,使用 Prophet 默认的参数即可。 ?? ? ? ? ? ? ? Prophet原理:Facebook 时间序列预测算法 Prophet 的研究 - 知乎 Prophet的原理知识: Prophet的使用:时间序列模型Prophet使用详细讲解_anshuai_aw1的博客-CSDN博客_prophet 官方链接:
案例链接: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:31:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |