Facebook Prophet 学习笔记

大趋势 Trend

FBP识别趋势和sparse prior息息相关(但是没有查到相关资料),sparse prior的强度changepoint_prior_scale决定了趋势的灵活性,默认值为0.05,增加这个值可以另模型趋势更加拟合历史数据,通常在0.001~0.5之间

m = Prophet(changepoint_prior_scale=0.001)

FBP在识别突变点changepoint时,默认情况下,会先指定25个可能点均匀地放在时间序列的前80%,然后只选取少数速率变化大的作为突变点,这个设置在大多数情况下都适用。如果需要,可以调节可能点的个数n_changepoints和范围changepoint_range,或者手动添加突变点

m = Prophet(n_changepoints=30, changepoint_range=0.9) 

m = Prophet(changepoints=['2014-01-01'])

当数据的周期性规律比大趋势更突出时,可以强制设置趋势平缓:

m = Prophet(growth='flat')



周期性 Seasonalities 

FBP使用傅里叶级数估算模型的季节性规律,傅里叶级数决定了季节性变化有多快。年度季节性的级数yearly_seasonality默认值是10,适用于大部分情况,当趋势的季节波动频率更高时可以调高这个值,但过高可能会导致过拟合

m = Prophet(yearly_seasonality=20).fit(df)

周期性的影响规模prior_scale,可以在定义时或添加自定义时调节,通常在0.1~10之间:

m = Prophet()

m.add_seasonality(name='weekly', period=7, fourier_order=3, prior_scale=0.1)

周期的模式有加性和乘性可以选择,加性周期的波动是固定的,乘性周期的波动会随着时间增长而放大,可以在定义时或添加自定义时调节:

m = Prophet(seasonality_mode='multiplicative')

m.add_seasonality('quarterly', period=91.25, fourier_order=8, mode='additive')

m.add_regressor('regressor', mode='additive')

Specifying Custom Seasonalities 定制周期

FBP能自动为模型计算每日、周度和年度的季节性规律(当识别到模型需要时),如果需要计算每小时、月度和季度的季节性规律,需要通过函数add_seasonality()添加

m = Prophet(weekly_seasonality=False) 

m.add_seasonality(name='monthly', period=30.5, fourier_order=5) 

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

Conditional Seasonalities 条件周期

当季节性规律需要满足一定的触发条件时,FBP提供了解决办法。比如,某数据只有1~2月和8~12月内具有周度季节性波动。先设置在季节内和非季节内的条件:

def is_nfl_season(ds):    

    date = pd.to_datetime(ds)    

    return (date.month > 8 or date.month < 2)

df['on_season'] = df['ds'].apply(is_nfl_season)

df['off_season'] = ~df['ds'].apply(is_nfl_season)

然后关闭内置的周度季节性,随后分别添加、预测条件内外的周度季节性

m = Prophet(weekly_seasonality=False)

m.add_seasonality(name='weekly_on_season', period=7, fourier_order=3, condition_name='on_season')

m.add_seasonality(name='weekly_off_season', period=7, fourier_order=3, condition_name='off_season')

future['on_season'] = future['ds'].apply(is_nfl_season)

future['off_season'] = ~future['ds'].apply(is_nfl_season)

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



节日 Holidays

FBP可以为模型添加节日节点,包含节日名称holiday和日期ds,还可以设定影响天数的范围lower_window和upper_window

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)) 

查看节日的影响:

forecast[(forecast['playoff']+forecast['superbowl']).abs()>0[['ds','playoff','superbowl']]

当节日过拟合时,可以调节节日的影响规模holidays_prior_scale,或者在节日数据框里设置prior_scale,其默认值为10,通常在0.01~10之间:

m = Prophet(holidays=holidays, holidays_prior_scale=0.05).fit(df)



其他回归器Additional regressors

FBP还支持为时间序列添加其他的特征,可以将其他特征合并到数据集中,然后添加函数add_regressor()实现,其预测趋势图也可以如其他规律一般被查看

m=Prophet(mcmc_samples=300,holidays=holidays_df,holidays_prior_scale=0.25,changepoint_prior_scale=0.01,seasonality_mode='multiplicative',\yearly_seasonality=10,\weekly_seasonality=True,\daily_seasonality=False)

m.add_regressor('temp',prior_scale=0.5,mode='multiplicative')

m.add_regressor('rain',prior_scale=0.5,mode='multiplicative')

m.add_regressor('sun',prior_scale=0.5,mode='multiplicative')

m.add_regressor('wind',prior_scale=0.5,mode='multiplicative')

data with regressors

注意!添加的回归器必须是一个过去到未来都知晓/已预测出来的数据,因此,回归器也可以是另一条时间序列,前提是这一条时间序列更加容易预测



限制增长趋势Forecasting Growth

FBP支持对预测上下限的界定。默认情况下,FBP使用线性增长模型,当使用逻辑增长模型时,可以设定上限cap和下限floor,设定下限时必须同时设定上限

m = Prophet(growth = 'logistic')

m.fit(df)

future = m.make_future_dataframe(periods = 1826)

future['cap'] = 8.5

fcst = m.predict(future)

fig = m.plot(fcst)

上限为8.5的预测结果



评估结果 Diagnostics

FBP提供滑窗交叉验证方法评估效果,输入参数需要起始预测点initial,意为从时间序列的第initial个时间起开始预测、测试效果;间隔阶段period,意为每+period时间后进行一次预测;和预测范围horizon,意为每次预测时长为horizon长度

from fbprophet.diagnostics importcross_validation

df_cv=cross_validation(m,initial='730 days',period='180 days',horizon='365 days')

结果表查看和可视化:

df_p=performance_metrics(df_cv)

plot_cross_validation_metric(df.cv, metric='mape')



调参心得

最重要的四个参数:

changepoint_prior_scale:突变点影响规模,影响趋势的灵活性。默认值为0.05,一般建议[0.001, 0.5]。该值越大,突变点带来的波动越大,越容易导致过拟合;

seasonality_prior_scale:周期性影响规模,决定周期的灵活性。默认值为10,一般建议 [0.01, 10]。该值越大,周期性波动越大

holidays_prior_scale:假日影响规模。默认值为10,一般建议 [0.01, 10]。该值越大,假日带来的波动越大

seasonality_mode:周期性模式。['additive','multiplicative'],默认加性。当数据取log时加性即原数据的乘性

其他:

傅里叶级数:决定函数的周期性,该值越大则周期越长(存疑)

changepoint_range:突变点范围,默认为0.8,代表在前80%的数据里选取突变点

n_changepoints:突变点个数,默认为25,代表均匀地选取25个突变点



参考自:

Trend changepoints.ipynb

Seasonality, holiday effects and regressors.ipynb

Multiplicative seasonality.ipynb

Auckland cycling and weather.ipynb

Saturating forecasts.ipynb

Diagnostics.ipynb

张戎:Facebook 时间序列预测算法 Prophet 的研究

阳望:python-fbprophet总结

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342