Prophet 模型多重季节性时间序列预测实战技巧
Prophet 模型多重季节性时间序列预测实战技巧
啥是多重季节性?
Prophet 的 add_seasonality 方法
实战案例:预测电商销售额
1. 数据准备
2. 创建模型并添加季节性
3. 拟合模型并预测
4. 分析结果
高级技巧
总结
Prophet 模型多重季节性时间序列预测实战技巧
大家好,我是你们的“老朋友”——数据挖掘机。
今天咱们来聊聊 Facebook 开源的时间序列预测神器 Prophet。这玩意儿,对搞数据分析、特别是需要预测未来趋势的兄弟们来说,简直是福音。不过,Prophet 虽好,但也不是万能的。特别是遇到那种具有多种季节性模式的时间序列数据,比如同时包含了年度、每周、甚至节假日效应的数据,处理起来就有点棘手了。别慌!今天我就来给大家支支招,分享一下我用 Prophet 处理多重季节性数据的实战经验,重点会讲到 add_seasonality
方法的使用,还会结合实际案例进行讲解,保证让你们一看就懂,一学就会!
啥是多重季节性?
在深入探讨之前,咱们先来搞清楚啥是“多重季节性”。
想象一下,你是一家电商平台的运营,需要预测未来一段时间的销售额。你手头的数据,不仅有每年双十一、618 大促带来的年度季节性波动,还有每周周末销售额小高峰带来的每周季节性波动,甚至还有法定节假日(比如春节、国庆)对销售额的影响。这就是典型的多重季节性时间序列数据——多种周期性波动叠加在一起。
Prophet 的 add_seasonality
方法
Prophet 模型本身就能自动检测年度和每周的季节性。但是,如果你的数据还有其他的季节性模式,或者你想更精细地控制季节性的建模,就需要用到 add_seasonality
这个方法了。
add_seasonality
方法允许你自定义季节性组件。它有几个关键参数:
name
: 季节性组件的名称,你自己起,方便区分。period
: 季节性周期的长度,单位是天。比如,年度季节性就是 365.25,每周季节性就是 7。fourier_order
: 傅里叶级数的阶数。这个参数决定了季节性曲线的平滑程度。阶数越高,曲线越灵活,越能捕捉到细节的波动,但也越容易过拟合。一般来说,对于年度季节性,10 是一个不错的选择;对于每周季节性,3 就够了。prior_scale
: 季节性组件的先验尺度。这个参数控制了季节性组件的强度。值越大,季节性影响越大;值越小,季节性影响越小。默认值是 10,通常不需要调整,除非你有很强的先验知识。mode
: 季节性模式,可以是 'additive'(加法)或 'multiplicative'(乘法)。加法模式意味着季节性波动是固定的,不随趋势变化;乘法模式意味着季节性波动与趋势成比例变化。一般来说,如果你的数据波动幅度随着时间推移越来越大,就应该选择乘法模式。
实战案例:预测电商销售额
光说不练假把式,咱们来个实战案例。假设我们要预测一家电商平台未来一年的每日销售额。我们的数据包含了过去三年的每日销售额,以及各种促销活动、节假日的信息。
1. 数据准备
首先,我们需要把数据整理成 Prophet 模型要求的格式:一个包含两列的 DataFrame,一列是时间(ds
),一列是数值(y
)。
import pandas as pd from prophet import Prophet # 读取数据 df = pd.read_csv('sales_data.csv') # 重命名列 df = df.rename(columns={'Date': 'ds', 'Sales': 'y'}) # 将日期列转换为 datetime 类型 df['ds'] = pd.to_datetime(df['ds'])
2. 创建模型并添加季节性
接下来,我们创建一个 Prophet 模型,并添加年度、每周和节假日三种季节性。
# 创建模型 m = Prophet() # 添加年度季节性 m.add_seasonality(name='yearly', period=365.25, fourier_order=10) # 添加每周季节性 m.add_seasonality(name='weekly', period=7, fourier_order=3) # 添加节假日效应 holidays = pd.DataFrame({ 'holiday': 'promotion', # 促销日统一命名为 promotion 'ds': pd.to_datetime(['2021-11-11', '2022-06-18', '2022-11-11', '2023-06-18', '2023-11-11']), 'lower_window': -1, # 促销日前一天也算 'upper_window': 1, # 促销日后一天也算 }) m.add_country_holidays(country_name='CN') # 添加中国的法定节假日 #将节假日和促销日合并 #将法定节假日与自定义的促销日合并 holidays = pd.concat((holidays, m.holidays))
注意,这里我们用 add_country_holidays
方法添加了中国的法定节假日。你也可以手动创建一个包含节假日信息的 DataFrame,然后用 add_seasonality
方法添加。
3. 拟合模型并预测
现在,我们可以用整理好的数据来拟合模型,并预测未来一年的销售额了。
# 拟合模型 m.fit(df) # 构建未来一年的日期 future = m.make_future_dataframe(periods=365) # 预测 forecast = m.predict(future) # 查看预测结果 print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
4. 分析结果
Prophet 会给出预测值(yhat
),以及预测值的上下限(yhat_lower
和 yhat_upper
)。你还可以用 Prophet 内置的绘图工具来可视化预测结果和各个季节性组件。
# 绘制预测结果 m.plot(forecast); # 绘制季节性组件 m.plot_components(forecast);
通过观察季节性组件图,你可以清楚地看到年度、每周和节假日对销售额的影响。如果某个季节性组件的波动很小,说明它对预测结果的影响不大,你可以考虑移除它,或者降低它的先验尺度。
高级技巧
除了 add_seasonality
方法,Prophet 还提供了一些高级技巧,可以帮助你更好地处理多重季节性数据:
- 调整 changepoint_prior_scale: Prophet 会自动检测趋势的变化点(changepoint)。
changepoint_prior_scale
参数控制了模型对趋势变化的敏感度。如果你的数据趋势变化比较频繁,可以适当增大这个值;如果趋势变化比较平缓,可以适当减小这个值。 - 使用自定义的 regressor: 如果你有一些外部因素会影响你的预测目标(比如,天气、竞争对手的活动等),你可以把它们作为额外的 regressor 添加到模型中。Prophet 会自动学习这些因素对预测目标的影响。
- 处理异常值: 异常值会对 Prophet 模型的预测结果产生很大的影响。你可以通过数据清洗来移除异常值,或者用 Prophet 的
outliers
参数来处理它们。
总结
Prophet 是一个强大的时间序列预测工具,add_seasonality
方法更是让它如虎添翼,能够轻松应对各种复杂的多重季节性数据。只要你掌握了这些技巧,就能更好地预测未来,做出更明智的决策。
当然,Prophet 也不是万能的。在实际应用中,你可能还需要根据具体情况,尝试不同的模型和参数,才能找到最适合你的解决方案。记住,数据分析是一个不断试错、不断优化的过程。希望今天的分享对你有所帮助!下次再见!