💡说明

安装

快速开始

饱和预测

趋势变化点

季节性、假日效应和额外回归

不确定区间

异常值

非日数据

模型诊断

乘法季节性

其他话题

https://facebook.github.io/prophet/docs/additional_topics.html

其他话题

保存模型

可以保存已安装的Prophet模型,以便以后可以加载和使用。

在R中,通过saveRDSreadRDS来实现。

# RsaveRDS(m, file="model.RDS")  # Save modelm <- readRDS(file="model.RDS")  # Load model

在Python中,模型不应该用pickle保存;附加在模型对象上的Stan后端将不能很好地pickle,并且在某些版本的Python下会产生问题。相反,你应该使用内置的序列化函数将模型序列化为json。

# Pythonimport jsonfrom fbprophet.serialize import model_to_json, model_from_jsonwith open('serialized_model.json', 'w') as fout:    json.dump(model_to_json(m), fout)  # Save modelwith open('serialized_model.json', 'r') as fin:    m = model_from_json(json.load(fin))  # Load model

json文件将可跨系统移植,反序列化可向后兼容旧版本的fbprophet。

扁平化趋势和自定义趋势

对于表现出强烈的季节性模式而非趋势变化的时间序列,将趋势增长率强制为平坦可能是有用的。这可以通过在创建模型时传递growth=flat来实现。

# Pythonm = Prophet(growth='flat')

这个目前只在Prophet的Python版本中实现。需要注意的是,如果这个功能用在一个不具有恒定趋势的时间序列上,任何趋势都会与噪声项进行拟合,因此预测的不确定性会很高。

如果要使用除了这三个内置趋势函数(计件线性、计件对数增长和平坦)之外的趋势,你可以从github下载源代码,在本地分支中根据需要修改趋势函数,然后安装该本地版本。这个PR很好地说明了实现一个自定义趋势必须做的事情。 https://github.com/facebook/prophet/pull/1466/files.

更新已拟合的模型

预测的一个常见设置是拟合模型,随着额外数据的到来,需要更新模型。Prophet模型只能拟合一次,当有新数据时,必须重新拟合一个新的模型。在大多数设置中,模型拟合的速度足够快,从头开始重新拟合没有任何问题。然而,可以通过从早期模型的模型参数进行热启动拟合来加快一些速度。这个代码示例展示了如何在Python中做到这一点。

# Pythondef stan_init(m):    """Retrieve parameters from a trained model.    Retrieve parameters from a trained model in the format    used to initialize a new Stan model.    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 resdf = pd.read_csv('../examples/example_wp_log_peyton_manning.csv')df1 = df.loc[df['ds'] < '2016-01-19', :]  # All data except the last daym1 = Prophet().fit(df1) # A model fit to all data except the last day%timeit m2 = Prophet().fit(df)  # Adding the last day, fitting from scratch%timeit m2 = Prophet().fit(df, init=stan_init(m1))  # Adding the last day, warm-starting from m1
1.44 s ± 121 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
860 ms ± 203 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

可以看出,上一个模型的参数通过kwarginit传递到下一个模型的拟合中。在这种情况下,使用温启动时,模型拟合的速度几乎快了2倍。速度的提高一般取决于随着新数据的加入,最佳模型参数的变化程度。

在考虑warm-starting时,有几个注意事项应该牢记。首先,warm-starting对于数据的小幅更新可能效果很好(比如上面的例子中增加了一天),但是如果数据有很大的变化(比如增加了很多天),warm-starting可能会比从头开始拟合更糟糕。这是因为当增加了大量的历史数据时,两个模型之间的变化点的位置会有很大的不同,所以之前模型的参数实际上可能会产生不好的趋势初始化。其次,作为一个细节,不同模型之间的变化点数量需要保持一致,否则会因为变化点之前的参数delta大小不对而产生错误。