本文简单介绍了Prophet时间预测工具的使用等相关知识。
Prophet是Facebook核心数据科学团队开发的一个开源时间序列预测工具,于2017年发布。它专门为业务预测任务设计,具有以下特点:
易用性:无需深厚的时间序列分析专业知识即可使用
自动化:自动检测时间序列中的趋势、季节性和节假日效应
灵活性:允许用户轻松加入领域知识调整模型
鲁棒性:对缺失数据和异常值有较好的处理能力
快速拟合:基于Stan的底层实现,计算效率高
Prophet特别适合具有强烈季节性效应和多个季节历史数据的时间序列,也适用于历史数据较少的情况。
Prophet使用了一个可分解的加法模型,将时间序列分解为三个主要部分:
y(t) = g(t) + s(t) + h(t) + εₜ
其中:
g(t):趋势函数,模拟非周期性变化
s(t):季节性成分,表示周期性变化(如周、月、年季节性)
h(t):节假日效应,表示不规则日程的影响
εₜ:误差项,表示模型未捕捉的随机变化
Prophet提供了两种趋势模型可选:
g(t) = (k + a(t)ᵀδ)·t + (m + a(t)ᵀγ)
适用于具有明显变化点的趋势
g(t) = C / (1 + exp(-k(t - m)))
适用于有饱和增长限制的数据
使用傅里叶级数来拟合周期性模式:
s(t) = Σ[aₙ·cos(2πnt/P) + bₙ·sin(2πnt/P)]
其中P是周期(年周期为365.25,周周期为7)
通过为每个节假日指定一个时间窗口,模型在该窗口内添加额外的参数来捕捉节假日影响。
# Python安装(需要先安装pystan)
pip install prophet
# R安装
install.packages("prophet")
import pandas as pd
from prophet import Prophet
# 数据需要包含两列:ds (日期) 和 y (值)
df = pd.read_csv('example_data.csv') # 或创建DataFrame
df['ds'] = pd.to_datetime(df['ds'])
model = Prophet(
growth='linear', # 趋势类型 ('linear' 或 'logistic')
seasonality_mode='additive', # 季节性模式 ('additive' 或 'multiplicative')
yearly_seasonality=True, # 是否拟合年季节性
weekly_seasonality=True, # 是否拟合周季节性
daily_seasonality=False, # 是否拟合日季节性
changepoint_prior_scale=0.05, # 趋势灵活度
seasonality_prior_scale=10.0, # 季节性强度
holidays_prior_scale=10.0, # 节假日强度
)
### 添加自定义节假日(可选)
holidays = pd.DataFrame({
'holiday': 'spring_festival',
'ds': pd.to_datetime(['2020-01-25', '2021-02-12', '2022-02-01']),
'lower_window': -7,
'upper_window': 7,
})
model.add_country_holidays(country_name='CN') # 添加中国节假日
model.add_holidays(holidays) # 添加自定义节假日
### 拟合模型
model.fit(df)
future = model.make_future_dataframe(periods=365) # 预测未来365天
forecast = model.predict(future)
fig1 = model.plot(forecast) # 预测图
fig2 = model.plot_components(forecast) # 分解图
growth: 趋势类型
‘linear’: 线性趋势(默认)
‘logistic’: 逻辑增长趋势(需指定cap和floor列)
seasonality_mode: 季节性模式
‘additive’: 加法模型(默认)
‘multiplicative’: 乘法模型
changepoint_prior_scale: 控制趋势灵活度
值越大,趋势越灵活(可能过拟合)
值越小,趋势越刚性(可能欠拟合)
seasonality_prior_scale: 控制季节性强度
值越大,季节性效应越强
holidays_prior_scale: 控制节假日效应强度
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)
model = Prophet(changepoints=['2020-01-01', '2021-01-01']) # 手动指定变点
饱和预测(逻辑增长):
df['cap'] = 100 # 上限
df['floor'] = 0 # 下限
future['cap'] = 100
future['floor'] = 0
model = Prophet(growth='logistic')
from prophet.diagnostics import cross_validation
df_cv = cross_validation(model, initial='730 days', period='180 days', horizon='365 days')
from prophet.diagnostics import performance_metrics
df_p = performance_metrics(df_cv)
特性 Prophet ARIMA LSTM
易用性 高 中 低
自动化程度 高 低 中
处理季节性 优秀 中等 优秀
解释性 高 中 低
训练速度 快 中等 慢
数据需求 少 中等 多
趋势变化处理 优秀 差 优秀
Prophet特别适合业务场景中的时间序列预测,尤其是那些具有明显季节性且需要快速部署的场景。对于更复杂的时间序列或需要更高精度的预测,可能需要考虑更高级的模型如深度学习时间序列模型。