初探facebook的prophet时序预测模型

邴和雅
2023-12-01

1 结合代码对Prophet模型分析

1.1 模型公式分析

  y ( t ) = g ( t ) + s ( t ) + h ( t ) + ε ( t ) \ y(t) = g(t)+s(t)+h(t)+\varepsilon (t)\quad  y(t)=g(t)+s(t)+h(t)+ε(t)

  • g(t)属于趋势项。源代码中以changepoints分段采取时间轴的最小与最大对应的y值并取之斜率。
  • s(t)属于季节项。源代码包括以年、周、日为周期,用傅里叶级数来求每一天对应项所对应的值。
  • h(t)属于节假日项。节假日的时间是自己在设置参数时设定的,除了可以设定这一天为节假日,还能设置节假日的前一天和后一天,源码中设置这一天的该项为1。
  1. 该模型最后的结果由 趋势项+(周期项+节假日)—— 加性模型;
    也可以是:趋势项 * (1 + (周期项+节假日))—— 乘性模型,例如航空旅客数量的时间序列;
  2. 趋势项原版是由时间两侧直接的斜率得到,周期项由贝叶斯推理得到。

1.2 各个参数的含义

growth = ‘linear’:fbporphet有两种模式,线性增长模式和逻辑增长模式(growth=‘logistic’)

changepoints:指定潜在改变点,如果不指定,将会自动选择潜在改变点.

n_changepoints:默认值为25,表示changepoints的数量大小,如果changepoints指定,该传入参数将不会被使用。
如果changepoints不指定,将会从输入的历史数据前80%中选取25个(个数由n_changepoints传入参数决定)潜在改变点。

yearly_seasonality:指定是否分析数据的年季节性,True输出yearly_trend,yearly_upper,yearly_lower等数据。

weekly_seasonality:指定是否分析数据的周季节性,True输出weekly_trend,weekly_upper,weekly_lower等数据。

daily_seasonality:自定义的参数,目前fbprophet不支持以小时为粒度的数据,

holidays:传入pd.dataframe格式的数据。这个数据包含有holiday列 (string)和ds(date类型)和可选列

lower_window和upper_window来指定该日期的lower_window或者upper_window范围内都被列为假期。

lower_window=-2将包括前2天的日期作为假期

upper_window=1将包括后1天的日期作为假期

seasonality_prior_scale:季节性模型的调节强度,较大的值允许模型以适应更大的季节性波动,较小的值抑制季节性。

holidays_prior_scale:假期组件模型的调节强度。

changepoint_prior_scale:自动的潜在改变点的灵活性调节参数,较大值将允许更多的潜在改变点,较小值将允许更少的潜在改变点。

mcmc_samples:整数,若大于0,将做mcmc样本的全贝叶斯推理,如果为0,将做最大后验估计。指定贝叶斯抽样,例如mcmc_samples=20

interval_width:浮点数,给预测提供不确定性区间宽度,如果mcmc_samples=0,这将是预测的唯一不确定性,如果mcmc_samples>0,这将会被集成在所有的模型参数中,其中包括季节性不确定性

uncertainty_samples:模拟绘制数,用于估计不确定的时间间隔

include_history:是否包含历史数据,保持默认就好。

def __init__(
            self,
            growth='linear',
            changepoints=None,
            n_changepoints=25,
            yearly_seasonality=True,
            weekly_seasonality=True,
            daily_seasonality=True,
            holidays=None,
            seasonality_prior_scale=10.0,
            holidays_prior_scale=10.0,
            changepoint_prior_scale=0.05,
            mcmc_samples=0,
            interval_width=0.80,
            uncertainty_samples=1000,
    ):

1.3 笔记

  1. 周季节性的傅里叶级数是3,年是10,月设为5。

1.4 调参经验

  1. 首先是处理异常值,有两类,直接赋值为none就可以,因为Prophet的设计中可以通过插值处理缺失值,但是对异常值比较敏感;
  2. 选择趋势模型,因为不是log型的,所以这里用linear;
  3. 设置趋势转折点(changepoint),无需设置,这里取默认前80%;
  4. 设置周期性,模型默认是带有年和星期以及天的周期性,根据业务,自己有增设月的周期性,以及把特殊节假日(51,101)的星期的周期性去掉;
  5. 设置节假日特征,如果我们的数据存在节假日的突增或者突降,如双11,双12;
  6. 此时可以简单的进行作图观察,然后可以根据经验继续调节上述模型参数,同时根据模型是否过拟合以及对什么成分过拟合,我们可以对应调节seasonality_prior_scale(不填->“auto”)、holidays_prior_scale(0.15)、changepoint_prior_scale(0.05)参数(值越大,该节假日对模型的影响越大,值越小,节假日的影响越小。(默认10))。
  7. 如果在尝试的大多数方法中,某些日期的预测依然存在很大的误差,这就说明历史数据中存在异常值。最好的办法就是找到这些异常值并剔除掉。(有两类)使用者无需像其他方法那样对剔除的数据进行插值拟合,可以仅保留异常值对应的时间, 并将异常值修改为空值(NA),模型在预测时依然可以给出这个时间点对应的预测结果。
  8. 如果对历史数据进行仿真预测时发现,从一个截点到下一个截点误差急剧的增加,这说明在两个截点期间数据的产生过程发生了较大的变化,此时两个截点之间应该增加一个”changepoint”,来对这期间的不同阶段分别建模。

1.5 prophet模型优点

  1. 大规模、细粒度数据
    能进行大范围预测,并且给出置信区间;数据时间粒度可以很小,支持小时、天、月数据。
  2. 自动处理缺失值数据
    遇到有缺失的数据时其它预测方法需要先进行插值填补预处理,而fbprophet可以自己处理缺失值数据。
  3. 更灵活,支持季节、节假日调节
    有些突变点往往是由特别的节假日期引起的,fbprophet支持输入这些日期以及前后影响的时间窗口,预测的时候自动适这些日期。
  4. 趋势预测+趋势分解
    拟合的有两种趋势:线性趋势、logistic趋势;趋势分解有很多种:Trend、年、周、天趋势、以及节假日效应。
  5. 模型参数易解释
    模型参数很好理解,可以让分析师根据业务经验调节参数来增强某部分假设提高准确率,使模型与业务达到理想的融合。
  6. 拟合速度快
  7. 操作简单
    不仅环境搭建简单,而且只要十几行代码即可完成整个预测过程。

Reference:

  • https://facebook.github.io/prophet
  • https://peerj.com/preprints/3190/
  • https://github.com/facebook/prophet
  • http://blog.51cto.com/13591395/2066888
  • https://blog.csdn.net/fxlou/article/details/79576493
  • https://blog.csdn.net/qq_23860475/article/details/81354467
  • https://blog.csdn.net/anshuai_aw1/article/details/83412058#%E5%9B%9B%E3%80%81%E5%AD%A3%E8%8A%82%E6%80%A7%EF%BC%8C%E5%81%87%E6%9C%9F%E6%95%88%E6%9E%9C%E5%92%8C%E5%9B%9E%E5%BD%92%E9%87%8F
 类似资料: