可以保存已安装的 Prophet 模型,以便以后加载和使用。在 Python 中,模型使用内置的序列化函数将模型序列化为 json:
import json
from prophet.serialize import model_to_json, model_from_json
with open('serialized_model.json', 'w') as fout:
json.dump(model_to_json(m), fout) # Save model
with open('serialized_model.json', 'r') as fin:
m = model_from_json(json.load(fin)) # Load model
保存后的模型为:
完整的代码:
import pandas as pd
import numpy as np
from prophet import Prophet
import logging
logging.getLogger('prophet').setLevel(logging.ERROR)
import warnings
warnings.filterwarnings("ignore")
import json
from prophet.serialize import model_to_json, model_from_json
df = pd.DataFrame({
'ds': pd.date_range(start='2020-01-01', periods=20),
'y': np.arange(20),
})
m = Prophet(weekly_seasonality=False)
m.fit(df)
#python
with open('serialized_model.json', 'w') as fout:
json.dump(model_to_json(m), fout) # Save model
with open('serialized_model.json', 'r') as fin:
m = model_from_json(json.load(fin)) # Load model
预测的一个常见设置是拟合需要随着额外数据进入而更新的模型。Prophet 模型只能拟合一次,并且当新数据可用时必须重新拟合新模型。
在大多数情况下,模型拟合速度足够快,从头开始重新拟合没有任何问题。但是,可以通过从早期模型的模型参数热启动拟合来加快速度。
import pandas as pd
import numpy as np
from prophet import Prophet
import logging
import timeit
logging.getLogger('prophet').setLevel(logging.ERROR)
import warnings
warnings.filterwarnings("ignore")
import json
from prophet.serialize import model_to_json, model_from_json
def stan_init(m):
"""从训练好的模型中检索参数
以格式从训练过的模型中检索参数
用于初始化一个新的Stan模型。
Parameters
----------
m: A trained model of the Prophet class.
Returns
-------
A Dictionary containing retrieved parameters of m.
"""
res = {}
for pname in ['k', 'm', 'sigma_obs']:
res[pname] = m.params[pname][0][0]
for pname in ['delta', 'beta']:
res[pname] = m.params[pname][0]
return res
df = pd.read_csv('example_wp_log_peyton_manning.csv')
df1 = df.loc[df['ds'] < '2016-01-19', :] # 除最后一天外的所有数据
m1 = Prophet().fit(df1) # 模型适用于除最后一天以外的所有数据
#加上最后一天,从头开始(数据较多耗时会加长)
m2 = Prophet().fit(df) # Adding the last day, fitting from scratch
# 加上最后一天,从m1开始训练
m2 = Prophet().fit(df, init=stan_init(m1)) # 加上最后一天,从m1开始训练
执行的结果为:
可以看出,前一个模型的参数通过 kwarg 传递给下一个模型的拟合init
。在这种情况下,模型拟合在使用直接再训练时快了大约 5 倍。加速通常取决于优化模型参数随着新数据的添加而改变了多少。
在考虑热启动时,应牢记一些注意事项。首先,热启动可能适用于数据的小幅更新(如上面示例中添加的一天),但如果数据有较大的更改(即很多天有已添加)。这是因为当添加大量历史时,两个模型之间变化点的位置会非常不同,因此之前模型的参数实际上可能会产生不良的趋势初始化。其次,作为一个细节,变化点的数量需要从一个模型到下一个模型保持一致,否则会因为变化点先验参数的大小错误而引发错误。
时间序列:按时间顺序记录的一组数据,称为时间序列
而一条时间序列通常可以分解为下面四个部分:趋势、季节波动、循环波动、不规则波动,又可以将上述的三个部分称作为:趋势性、季节性、周期性和随机波动性。
组合这四种成分的方式主要有两种:乘法模型和加法模型。
时间序列的预测方法
时间序列的预测方法有很多很多最简单的几种就是移动平均、简单指数平滑、回归等等。稍微复杂一点的就有ARIMA模型,现在还可以使用机器学习的方法对时间序列进行预测,例如Prophet,LSTM等等。
a.有至少几个月(最好是一年)的每小时、每天或每周观察的历史数据;
b.有多种人类规模级别的较强的季节性趋势:每周的一些天和每年的一些时间;
c.有事先知道的以不定期的间隔发生的重要节假日(比如国庆节);
d.缺失的历史数据或较大的异常数据的数量在合理范围内;
e.有历史趋势的变化(比如因为产品发布);
f.对于数据中蕴含的非线性增长的趋势都有一个自然极限或饱和状态。
prophet 所做的事情就是:
输入已知的时间序列的时间戳和相应的值;
输入需要预测的时间序列的长度;
输出未来的时间序列走势。
输出结果可以提供必要的统计指标,包括拟合曲线,上界和下界等。
这是Generalized Additive Model(GAM)模型的特例,通过对各项的拟合,再进行累加得到预测值。
模型整体由三部分组成:
g(t): 趋势项,描述growth(增长趋势),即时间序列非周期的变化趋势
s(t): 周期项,描述seasonality(季节趋势),即时间序列周期的变化
h(t): 假期项,描述holidays(节假日对预测值的影响),即周期中偶发的、无固定周期的假日对预测值的影响。
ϵt:噪声项/误差项,随机的未预测波动。假设服从高斯分布(Gaussian distribution)/正态分布(Normal distribution)。
Prophet 算法就是通过拟合这几项,然后最后把它们累加起来就得到了时间序列的预测值。
趋势项用于描述时间序列非周期的变化趋势,包括基于逻辑回归函数的饱和增长模型【一般预测到达什么时候达到高值或者低值】(saturating growth model)、线性增长模型(piecewise linear model)。
1, 基于逻辑回归的趋势项
承载能力C(capacity):
使用傅立叶级数来模拟时间序列的周期性:假设 P 表示时间序列的周期,P = 365.25 表示以年为周期,P = 7 表示以周为周期。
其中,N表示希望在模型中使用的周期个数,N值较大时,可以拟合出更复杂的季节性函数,但也会带来过拟合问题。
通过 seasonality_prior_scale 控制,值越大,季节的效应越明显;值越小,表示季节的效应越不明显。
seasonality_mode 对应两种模式,分别是加法和乘法,默认是加法的形式。
根据生活经验,节假日、重要事项的影响持续时间不同,同时,假期前后几天的时间都比较重要,假设假期附近时间影响与假期当天一致。于是,需要将不同节假日的影响独立分析,不同的节假日需要设定不同的影响时间范围。
官方链接:
论文:《Forecasting at scale》,https://peerj.com/preprints/3190/
github:https://github.com/facebook/prophet
官网:https://facebook.github.io/prophet/
案例链接:
预测股价并进行多策略交易:https://mp.weixin.qq.com/s/bf_CHcoZMjqP6Is4ebD58g
预测Medium每天发表的文章数:https://mp.weixin.qq.com/s/1wujYYDP_P2uerZzZBaspg
预测网站流量:https://pbpython.com/prophet-overview.html
预测空气质量:https://mp.weixin.qq.com/s/S-NNG7BmviitBmMBJRJSRQ
预测客运量:https://www.analyticsvidhya.com/blog/2018/05/generate-accurate-forecasts-facebook-prophet-python-r/
疫情预测分析:https://mp.weixin.qq.com/s/fZpsy1bQ3Olhng1P5p5WAg
原理讲解:https://mp.weixin.qq.com/s/675ASxDSVH_8BX6W8WRRqg
知乎专栏:https://zhuanlan.zhihu.com/p/52330017
股票价格预测:https://mp.weixin.qq.com/s/78xpmsbC2N1oZ3UIMm29hg