Prophet文档中文翻译--Seasonality,Holiday effects,and Regressors

%matplotlib inline
from fbprophet import Prophet
import pandas as pd
from matplotlib import pyplot as plt
import logging
logging.getLogger('fbprophet').setLevel(logging.ERROR)
import warnings
warnings.filterwarnings("ignore")
df = pd.read_csv('examples/example_wp_log_peyton_manning.csv')
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=366)

假期和特殊事件建模

如果您有假期或其他您想要建模的重复活动,则必须为它们创建数据框。它有两列(假日和ds),每个假日出现一行。它必须包括所有出现的假期,包括过去(返回历史数据)和未来(直到预测正在进行)。如果将来不再重复,Prophet将对它们进行建模,然后不将它们包含在预测中。

您还可以包含lower_windowupper_window列,它们将假日延长到日期周围的*[lower_window,upper_window]天。例如,如果你想在圣诞节前加入平安夜,那么你应该包括lower_window = -1*,upper_window = 0。如果你想在感恩节之外使用黑色星期五,你可以加入lower_window=0,upper_window=1.您还可以包含列prior_scale,以便为每个假日分别设置先前的比例(影响因子),如下所述。

在这里,我们创建一个数据框,其中包括Peyton Manning所有季后赛出场的日期:

playoffs = pd.DataFrame({
  'holiday': 'playoff',
  'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16',
                        '2010-01-24', '2010-02-07', '2011-01-08',
                        '2013-01-12', '2014-01-12', '2014-01-19',
                        '2014-02-02', '2015-01-11', '2016-01-17',
                        '2016-01-24', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
superbowls = pd.DataFrame({
  'holiday': 'superbowl',
  'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
holidays = pd.concat((playoffs, superbowls))

以上我们将superbowl(超级碗)天数列为季后赛和超级碗比赛。这意味着超级碗效应将是季后赛效应之外的额外附加奖励。

创建表后,通过使用holidays参数传递假日效果,将其包含在预测中。在这里,我们使用Quickstart中的Peyton Manning数据:

m = Prophet(holidays=holidays)
forecast = m.fit(df).predict(future)

假日效果可以在forecast数据框中看到:

forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][
        ['ds', 'playoff', 'superbowl']][-10:]
dsplayoffsuperbowl
21902014-02-021.2234781.202807
21912014-02-031.9017431.461349
25322015-01-111.2234780.000000
25332015-01-121.9017430.000000
29012016-01-171.2234780.000000
29022016-01-181.9017430.000000
29082016-01-241.2234780.000000
29092016-01-251.9017430.000000
29222016-02-071.2234781.202807
29232016-02-081.9017431.461349

假期效果也将出现在组件情节中,我们看到季后赛出现的日子有一个高峰,超级碗有一个特别大的峰值:

fig = m.plot_components(forecast)

png

可以使用plot_forecast_component函数(从Python中的fbprophet.plot导入)绘制单个假期,例如plot_forecast_component(m,forecast,‘superbowl’),以仅绘制超级碗假期组件。

内置各个国家的假期

您可以使用add_country_holidays方法(Python),使用内置的国家/地区特定假日集合。指定国家/地区的名称,然后除了通过上述假期参数指定的任何假期外,还将包括该国家/地区的主要节假日:


m = Prophet(holidays=holidays)
m.add_country_holidays(country_name='US')
m.fit(df)

<fbprophet.forecaster.Prophet at 0x12ed2bb3e10>

您可以通过模型的train_holiday_names(Python)属性来查看包含哪些假期。

m.train_holiday_names
0                         playoff
1                       superbowl
2                  New Year's Day
3     Martin Luther King, Jr. Day
4           Washington's Birthday
5                    Memorial Day
6                Independence Day
7                       Labor Day
8                    Columbus Day
9                    Veterans Day
10                   Thanksgiving
11                  Christmas Day
12       Christmas Day (Observed)
13        Veterans Day (Observed)
14    Independence Day (Observed)
15      New Year's Day (Observed)
dtype: object

每个国家的假期都由Python的holiday包提供。已经实现的国家/地区列表以及使用的国家/地区名称可以在这个页面找到:https://github.com/dr-prodigy/python-holidays。除此之外,Prophet还包括下面这些国家的假期: 巴西(BR),印度尼西亚(ID),印度(IN),马来西亚(MY),越南(VN),泰国(TH),菲律宾(PH),土耳其(TU),巴基斯坦(PK),孟加拉国(BD),埃及(EG),中国(CN)和俄罗斯(RU)。

在Python中,大多数假期都是通过程序计算出来的,因此可用于任何日期范围;如果日期超出该国家支持的范围,将会发出警告。

如果需要更大范围的日期范,则可以使用此脚本将该文件替换为希望的日期范围:https://github.com/facebook/prophet/blob/master/python/scripts/generate_holidays_file.py。

如上所述,国家的假期分解将显示在组件图中:

forecast = m.predict(future)
fig = m.plot_components(forecast)

png

季节性的傅立叶级数( Fourier Order for Seasonalities)

使用局部傅里叶和(partial Fourier sum)估计季节性。请参阅论文以获取完整的详细信息,并在维基百科上查看此解释,以了解局部傅里叶和(partial Fourier sum)如何逼近aribtrary周期信号。部分和中的项数是决定季节性变化的速度的参数(这里不是太,附上原句。原句: The number of terms in the partial sum (the order) is a parameter that determines how quickly the seasonality can change)。为了说明这一点,请考虑快速入门中的Peyton Manning数据案列。年度季节性的默认傅里叶级别为10,这样可以产生这种拟合:

from fbprophet.plot import plot_yearly
m = Prophet().fit(df)
a = plot_yearly(m)

png

默认值通常是合适的,但是当季节性需要适应更高频率的变时和更少的平滑时,这个默认值可以增加。在实例化模型时,可以为每个内置季节性指定傅里叶级别,此处它增加到20:

from fbprophet.plot import plot_yearly
m = Prophet(yearly_seasonality=20).fit(df)
a = plot_yearly(m)

png

增加傅里叶项的数量可以使季节性适应更快的变化周期,但也可能导致过度拟合:N个傅里叶项对应2N个用于循环建模的变量。

指定自定义季节

如果时间序列长度超过两个周期,先知将默认使用周和年的季节性去训练模型。它还适合每日时间序列(例如:时间序列日期精确到小时)的日季节性。您可以使用add_seasonality方法(Python)添加其他季节性(monthly, quarterly, hourly)。

这个函数的输入包括名称,季节性的周期,以及季节性的傅里叶级级。作为参考,默认情况下,Prophet使用周季节性的傅立叶级数为3,年的季节性傅立叶级数为10。 add_seasonality方法的可选输入是该季节性组件的先前比例(the prior scale,这里这个参数我的理解是:在前几个周期中相同位置的时间对这个预测值的影响程序)–这将在下面讨论。

下面这个例子,这里我们选择来自Quickstart的Peyton Manning数据进行训练,但用月季节性取代周季节性。月的季节性将出现在组件图中:

m = Prophet(weekly_seasonality=False)
m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
forecast = m.fit(df).predict(future)
fig = m.plot_components(forecast)

png

节假日与季节的先前比例影响(Prior scale for holidays and seasonality)

如果您发现假期过度拟合,您可以使用参数holidays_prior_scale调整其先前的比例以平滑它们。默认情况下,此参数为10,这提供了很少的正则化。减少此参数会抑制假日效果:

m = Prophet(holidays=holidays, holidays_prior_scale=0.05).fit(df)
forecast = m.predict(future)
forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][
    ['ds', 'playoff', 'superbowl']][-10:]
dsplayoffsuperbowl
21902014-02-021.2064620.962911
21912014-02-031.8528080.992123
25322015-01-111.2064620.000000
25332015-01-121.8528080.000000
29012016-01-171.2064620.000000
29022016-01-181.8528080.000000
29082016-01-241.2064620.000000
29092016-01-251.8528080.000000
29222016-02-071.2064620.962911
29232016-02-081.8528080.992123

与以前相比,假日效应的幅度减小了,特别是对于观察量最少的超级碗。参数seasonality_prior_scale同样调整季节性模型训练数据。

通过在假日数据框中包含列prior_scale,可以为各个假期单独设置先前的比例。个别季节性的先前比例可以作为add_seasonality的参数传递。例如,可以使用以下方式设置仅每周季节性的先前比例:

m = Prophet()
m.add_seasonality(
    name='weekly', period=7, fourier_order=3, prior_scale=0.1)
<fbprophet.forecaster.Prophet at 0x12ed07d2e10>

额外的回归量(Additional regressors)

可以使用add_regressor方法或函数将其他回归量添加到模型的线性部分。具有回归量值的列将需要添加到拟合和预测数据框中。例如,我们可以在NFL赛季期间为周日增加额外的效果。在组件图上,此效果将显示在“extra_regressors”图中:

def nfl_sunday(ds):
    date = pd.to_datetime(ds)
    if date.weekday() == 6 and (date.month > 8 or date.month < 2):
        return 1
    else:
        return 0
df['nfl_sunday'] = df['ds'].apply(nfl_sunday)

m = Prophet()
m.add_regressor('nfl_sunday')
m.fit(df)

future['nfl_sunday'] = future['ds'].apply(nfl_sunday)

forecast = m.predict(future)
fig = m.plot_components(forecast)

png

可以通过创建过去和未来NFL星期日的列表,也可以使用上述“假期”接口处理NFL星期日变量。add_regressor函数为定义额外的线性回归量提供了更通用的接口,特别是不要求回归量是二元指标。可以吧另一个时间序列用作回归量,但是预测的值在另一个时间序列中必须是已知的。

add_regressor函数有可选参数,用于指定先前的比例(默认情况下使用假日先前比例)以及回归量是否标准化。请参阅Python中的docstringhelp(Prophet.add_regressor)。注意回归量必须在模型拟合之前添加。

额外的回归量必须同时为历史和未来日期所知。因此,它必须是具有已知未来价值的事件(例如nfl_sunday),或者在其他地方单独预测过的东西。如果回归变量在整个历史数据中保持不变,先知也会提出错误,因为没有任何有用的数据可以训练。

额外的回归量被放在模型的线性分量中,因此基础时间序列模型是加法还是乘法模型,与额外的回归量有关(原句: the underlying model is that the time series depends on the extra regressor as either an additive or multiplicative factor。)(参见下一节的乘法性)。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值