时间序列prophet模型是facebook的时间序列算法。 可以有效处理节假日信息,并且按照周、月、年对时间序列数据的变化趋势进行拟合。 适合节假日、季节性因素等特殊因素考量的环境。 附数据集,Python代码
Prophet这玩意儿用起来是真香,特别是老板非要你预测下个月销量的时候。它处理节假日和季节性的能力确实能救命,不像ARIMA那种调参调到怀疑人生。直接上代码实操一把,拿电商销售数据举例。

先搞个模拟数据集,假设我们有2019到2023年的日销售数据:
import pandas as pd
import numpy as np
date_rng = pd.date_range(start='2019-01-01', end='2023-12-31', freq='D')
sales = np.random.randint(100, 500, size=len(date_rng)) # 随机生成基础销量
for date in pd.date_range('2019-02-04', periods=5): sales[date_rng == date] += 300
for year in range(2019,2024): sales[date_rng == f'{year-06-18}'] += 500
df = pd.DataFrame({'ds': date_rng, 'y': sales})
数据长得像这样——日常波动+周期性爆发。用Prophet前先画个图看看趋势:
from prophet import Prophet
m = Prophet(
growth='flat', # 数据没有明显增长趋势
changepoint_prior_scale=0.1, # 控制趋势敏感度,调小防止过拟合
yearly_seasonality=8, # 年周期强度
weekly_seasonality=True
)
重点来了——自定义节假日。系统自带的西方节日不接地气,得手动加中国特色节日:
chinese_holidays = pd.DataFrame({
'holiday': 'spring_festival',
'ds': pd.to_datetime([
'2019-02-04', '2020-01-24', '2021-02-11',
'2022-02-01', '2023-01-22'
]),
'lower_window': -3, # 节前3天开始影响
'upper_window': 7, # 节后7天仍有影响
})
m.add_country_holidays(country_name='CN') # 先加官方节日
m.holidays = pd.concat([m.holidays, chinese_holidays]) # 合并自定义
训练模型时记得把历史数据中的异常点排除,比如2022年上海封控期间的数据:
# 添加异常时段
df['floor'] = 0
df.loc[(df['ds'] >= '2022-03-28') & (df['ds'] <= '2022-05-31'), 'floor'] = 100
m.fit(df)
预测代码倒是简单,但要注意future数据要包含所有可能的影响因素:
future = m.make_future_dataframe(periods=90)
forecast = m.predict(future)
fig = m.plot(forecast)
看预测结果时,重点看components里的holidays部分:
from prophet.plot import plot_components
plot_components(forecast)
这时候可能会发现双11的效应被低估了——因为随机生成的数据里没刻意制造这个峰值。这时需要手动调整holidays参数,比如把双11的upper_window拉长到15天。
模型有个坑:默认的seasonality_mode是加法模式。如果数据波动幅度随时间增大,得换成multiplicative:
m = Prophet(..., seasonality_mode='multiplicative')
m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
最终部署时建议保存模型二进制,避免重复训练:
import json
from prophet.serialize import model_to_json
with open('prophet_model.json', 'w') as f:
json.dump(model_to_json(m), f)
实测时发现,这货对促销日的预测比人工拍脑门准多了。但遇到黑天鹅事件(比如疫情)还是得靠手动调整。别迷信算法,业务理解才是王道。

1154

被折叠的 条评论
为什么被折叠?



