机器学习笔记五-----------------Prophet(时间序列模型)的保存及调用,微调及总结

一,模型的保存

       可以保存已安装的 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 倍。加速通常取决于优化模型参数随着新数据的添加而改变了多少。

      在考虑热启动时,应牢记一些注意事项。首先,热启动可能适用于数据的小幅更新(如上面示例中添加的一天),但如果数据有较大的更改(即很多天有已添加)。这是因为当添加大量历史时,两个模型之间变化点的位置会非常不同,因此之前模型的参数实际上可能会产生不良的趋势初始化。其次,作为一个细节,变化点的数量需要从一个模型到下一个模型保持一致,否则会因为变化点先验参数的大小错误而引发错误。

三,Prophet时间序列预测总结

时间序列:按时间顺序记录的一组数据,称为时间序列
  而一条时间序列通常可以分解为下面四个部分:趋势、季节波动、循环波动、不规则波动,又可以将上述的三个部分称作为:趋势性、季节性、周期性和随机波动性。
       组合这四种成分的方式主要有两种:乘法模型和加法模型。

时间序列的预测方法

  时间序列的预测方法有很多很多最简单的几种就是移动平均、简单指数平滑、回归等等。稍微复杂一点的就有ARIMA模型,现在还可以使用机器学习的方法对时间序列进行预测,例如Prophet,LSTM等等。

3.1 Prophet的适用场景

a.有至少几个月(最好是一年)的每小时、每天或每周观察的历史数据;
b.有多种人类规模级别的较强的季节性趋势:每周的一些天和每年的一些时间;
c.有事先知道的以不定期的间隔发生的重要节假日(比如国庆节);
d.缺失的历史数据或较大的异常数据的数量在合理范围内;
e.有历史趋势的变化(比如因为产品发布);
f.对于数据中蕴含的非线性增长的趋势都有一个自然极限或饱和状态。

3.2 模型输入输出 

prophet 所做的事情就是:

输入已知的时间序列的时间戳和相应的值;

输入需要预测的时间序列的长度;

输出未来的时间序列走势。

输出结果可以提供必要的统计指标,包括拟合曲线,上界和下界等。

3.3 基本原理

这是Generalized Additive Model(GAM)模型的特例,通过对各项的拟合,再进行累加得到预测值。

模型整体由三部分组成:

g(t): 趋势项,描述growth(增长趋势),即时间序列非周期的变化趋势
s(t): 周期项,描述seasonality(季节趋势),即时间序列周期的变化
h(t): 假期项,描述holidays(节假日对预测值的影响),即周期中偶发的、无固定周期的假日对预测值的影响。
ϵt:噪声项/误差项,随机的未预测波动。假设服从高斯分布(Gaussian distribution)/正态分布(Normal distribution)。

Prophet 算法就是通过拟合这几项,然后最后把它们累加起来就得到了时间序列的预测值。

 3.3.1  趋势项

      趋势项用于描述时间序列非周期的变化趋势,包括基于逻辑回归函数的饱和增长模型【一般预测到达什么时候达到高值或者低值】(saturating growth model)、线性增长模型(piecewise linear model)。

1, 基于逻辑回归的趋势项

  • 承载能力C(capacity):

    • 用函数C(t)描述的随时间变化的函数,对增长的上限进行约束
    • 在使用 Prophet 的 growth = ‘logistic’ 的时候,需要提前设置好 C(t) 的取值才行

   3.3.2 季节趋势

     使用傅立叶级数来模拟时间序列的周期性:假设 P 表示时间序列的周期,P = 365.25 表示以年为周期,P = 7 表示以周为周期。

      其中,N表示希望在模型中使用的周期个数,N值较大时,可以拟合出更复杂的季节性函数,但也会带来过拟合问题。

     通过 seasonality_prior_scale 控制,值越大,季节的效应越明显;值越小,表示季节的效应越不明显。

    seasonality_mode 对应两种模式,分别是加法和乘法,默认是加法的形式。

   

3.3.3 节假日趋势h(t)

       根据生活经验,节假日、重要事项的影响持续时间不同,同时,假期前后几天的时间都比较重要,假设假期附近时间影响与假期当天一致。于是,需要将不同节假日的影响独立分析,不同的节假日需要设定不同的影响时间范围。

四,Prophet 学习资料参考及案例

官方链接:

  • 论文:《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

你可能感兴趣的:(机器学习,机器学习)