prophet
函数去拟合模型并且返回一个模型对象,可以对这个模型对象执行“预测”( predict
)和“绘图”( plot
)操作。一、最简使用
-
数据格式要求
- 输入数据为包含两列的 DataFrame:
ds
(日期列,需为datetime
类型)和y
(数值列)。
- 输入数据为包含两列的 DataFrame:
import pandas as pd data = pd.DataFrame({ 'ds': ['2023-01-01', '2023-01-02', ...], 'y': [100, 120, ...] })
-
模型训练与预测
from fbprophet import Prophet # 初始化模型(默认线性趋势) model = Prophet() # 拟合数据 model.fit(data) # 创建未来时间范围(如预测未来30天) future = model.make_future_dataframe(periods=30) # 预测 forecast = model.predict(future)
#forecast
包含预测值(yhat
)及不确定性区间(yhat_lower
,yhat_upper
) -
可视化
# 绘制预测结果 fig1 = model.plot(forecast) # 分解趋势、季节性和节假日效应 fig2 = model.plot_components(forecast)
二、高级功能
1.预测模型调整
- 饱和增长模型:当数据存在自然上限(如市场容量)时,使用逻辑增长,例如:当预测增长情况时,通常会存在可到达的最大极限值,例如:总市场规模、总人口数等等。这被称做承载能力,那么预测时就应当在接近该值时趋于饱和,此时使用 logistic 增长 趋势模型进行预测,同时指定承载能力。
model = Prophet(growth='logistic') # 添加承载能力列 data['cap'] = 1000 # 设置上限值
2.突变点处理
2.1 调整趋势的灵活性
如果趋势的变化被过度拟合(即过于灵活)或者拟合不足(即灵活性不够),可以利用输入参数 changepoint_prior_scale
来调整稀疏先验的程度。默认下,这个参数被指定为 0.05 。增加这个值,会导致趋势拟合得更加灵活。减少这个值,会导致趋势拟合得灵活性降低。(值越大,模型对突变越敏感)
2.2 指定突变点的位置
如果你希望手动指定潜在突变点的位置而不是利用自动的突变点监测,可以使用 changepoints
参数。
3.季节性和节假日效应
- 支持 加法(默认)或乘法 季节性:
model.add_seasonality(name='monthly', period=30.5, fourier_order=5, mode='multiplicative')
3.2节假日配置
holiday
和日期戳 ds
),每行分别记录了每个出现的节假日。在这个数据框基础上可再新建两列
lower_window
和 upper_window
,从而将节假日的时间扩展成一个区间 [ lower_window
, upper_window
] 。举例来说,如果想将平安夜也加入到 “圣诞节” 里,就设置 lower_window = -1 , upper_window = 0
;如果想将黑色星期五加入到 “感恩节” 里,就设置 lower_window = 0 , upper_window = 1
。可通过 forecast
数据框,来展示节假日效应。holidays = pd.DataFrame({ 'holiday': '春节', 'ds': pd.to_datetime(['2023-01-22', '2024-02-10']), 'lower_window': -2, # 节前2天开始影响 'upper_window': 5, # 节后5天影响结束 }) model = Prophet(holidays=holidays)
如果发现节假日效应被过度拟合了,通过设置参数 holidays.prior.scale
可以调整它们的先验规模来使之平滑,默认下该值取 10 。类似的,还有一个 seasonality.prior.scale
参数可以用来调整模型对于季节性的拟合程度。
4.预测区间
在预测时,不确定性主要来源于三个部分:趋势中的不确定性、季节效应估计中的不确定性和观测值的噪声影响。
4.1 趋势中的不确定性
预测中,不确定性最大的来源就在于未来趋势改变的不确定性。Prophet 假定 “未来将会和历史具有相似的趋势” 。尤其重要的是,我们假定未来趋势的平均变动频率和幅度和我们观测到的历史值是一样的,从而预测趋势的变化并通过计算,最终得到预测区间。
这种衡量不确定性的方法具有以下性质:变化速率灵活性更大时(通过增大参数 changepoint.prior.scale
的值),预测的不确定性也会随之增大。原因在于如果将历史数据中更多的变化速率加入了模型,也就代表我们认为未来也会变化得更多,就会使得预测区间成为反映过拟合的标志。
预测区间的宽度(默认下,是 80% )可以通过设置 interval.width
参数来控制:
4.2季节效应中的不确定性
默认情况下, Prophet 只会返回趋势中的不确定性和观测值噪声的影响。你必须使用贝叶斯取样的方法来得到季节效应的不确定性,可通过设置 mcmc.samples
参数(默认下取 0 )来实现。将最大后验估计( MAP )取代为马尔科夫蒙特卡洛取样 ( MCMC ),并且将计算时间从 10 秒延长到 10 分钟。如果做了全取样,就能通过绘图看到季节效应的不确定性了
5.异常值
NA
),但是在待预测日期数据框 future
中仍保留这个日期,那么 Prophet 依旧可以给出该行的预测值。这个实例虽然影响了不确定性的估计,却没有影响到主要的预测值 yhat
。但是,现实往往并非如此,接下来,在上述数据集基础上加入新的异常值后再建模预测。另外如果2015年 6 月存在一些异常值破坏了季节效应的估计,未来的预测也会永久地受到这个影响,最好的解决方法就是移除这些异常值。6.非日数据
make_future_dataframe
中传入频率参数只做月度的预测。
评论
实在!
路过点赞。。。