Prophet 模型中傅里叶级数揭秘:如何模拟季节性及选择合适的阶数
Prophet 模型中傅里叶级数揭秘:如何模拟季节性及选择合适的阶数
啥是季节性?
傅里叶级数:周期函数的“万能钥匙”
Prophet 如何使用傅里叶级数?
如何选择合适的傅里叶级数阶数?
总结
Prophet 模型中傅里叶级数揭秘:如何模拟季节性及选择合适的阶数
大家好!相信不少搞数据分析、机器学习的同行们都听说过或者用过 Facebook 开源的 Prophet 时间序列预测模型。它上手简单,效果 often 不错,对业务友好,深受广大人民群众喜爱。但你是否真正了解 Prophet 模型内部的运作机制?今天咱们就来聊聊 Prophet 模型中一个核心概念——傅里叶级数,以及它如何帮助我们捕捉时间序列数据中的季节性模式。
啥是季节性?
在深入傅里叶级数之前,咱们先来明确一下“季节性”这个概念。简单来说,季节性就是指时间序列数据中呈现出的、以固定周期重复出现的波动模式。这个周期可以是每年、每月、每周、每天,甚至每小时。
举几个栗子:
- 电商网站的销量:通常在“双十一”、“618”等大促期间会暴涨,而在平时相对平稳,这就是一种年度季节性。
- 冰淇淋的销量:夏天卖得好,冬天卖得差,这也是一种年度季节性。
- 餐厅的客流量:工作日午餐和晚餐时间是高峰,周末可能全天都比较忙,这就是一种周度季节性和每日季节性。
- 网站的访问量:白天访问量高,凌晨访问量低,这是一种每日季节性。
这些季节性模式对我们做预测非常重要。如果我们能准确地捕捉到这些模式,就能更准确地预测未来的数据走势。那么,Prophet 是如何做到这一点的呢?答案就是傅里叶级数。
傅里叶级数:周期函数的“万能钥匙”
傅里叶级数是一种将周期函数分解为一系列正弦函数和余弦函数之和的方法。这些正弦函数和余弦函数具有不同的频率和振幅,就像音乐中的不同音符一样,组合起来就能构成复杂的乐曲。
数学公式长这样:
$$f(t) = a_0 + \sum_{n=1}^{\infty} [a_n \cos(2\pi nft) + b_n \sin(2\pi nft)]$$
其中:
f(t)
是我们要表示的周期函数。t
是时间。n
是正整数,表示谐波的阶数。f
是基频,它决定了周期的长度(周期T = 1/f
)。a_0
是直流分量,表示函数的平均值。a_n
和b_n
是傅里叶系数,它们决定了每个谐波的振幅和相位。
这个公式看起来有点吓人,但其实它的核心思想很简单:任何周期函数,都可以用一系列不同频率、不同振幅的正弦和余弦函数来近似表示。就像我们用不同频率、不同音量的音符,可以组合出各种各样的音乐一样。
Prophet 如何使用傅里叶级数?
Prophet 模型假设时间序列数据由三个主要成分组成:趋势、季节性和节假日效应。其中,季节性成分就是用傅里叶级数来建模的。
具体来说,Prophet 会根据我们指定的周期(比如年、周、日),自动生成一组傅里叶级数项。然后,它会通过拟合历史数据,来估计每个傅里叶级数项的系数(也就是 a_n
和 b_n
)。这样,它就能得到一个能够描述季节性模式的函数。
例如,如果我们指定周期为一年(365.25 天),那么 Prophet 会生成如下形式的傅里叶级数项:
cos(2πt/365.25)
sin(2πt/365.25)
cos(4πt/365.25)
sin(4πt/365.25)
cos(6πt/365.25)
sin(6πt/365.25)
- ...
这些项分别对应了频率为 1/365.25、2/365.25、3/365.25 ... 的谐波。Prophet 会根据数据的实际情况,来调整这些谐波的振幅和相位,从而捕捉到年度季节性的具体形态。
如何选择合适的傅里叶级数阶数?
傅里叶级数的阶数(n
)决定了我们用多少个谐波来拟合季节性。阶数越高,就能捕捉到越细微的季节性波动,但同时也增加了模型的复杂度,容易导致过拟合。
Prophet 默认的年度季节性阶数为 10,周度季节性阶数为 3。这些默认值通常在大多数情况下都能取得不错的效果。但如果我们发现模型对季节性的拟合不够好,或者出现了过拟合,就可以手动调整阶数。
一般来说,我们可以通过观察数据的季节性模式来判断阶数是否合适:
- 如果季节性模式比较简单,比如只有一两个明显的峰谷,那么较低的阶数就足够了。
- 如果季节性模式比较复杂,比如有很多个小的波动,那么可能需要较高的阶数才能捕捉到这些细节。
另外,我们还可以通过交叉验证等方法来评估不同阶数下模型的性能,从而选择最优的阶数。
在 Prophet 中,我们可以通过 add_seasonality
函数来添加自定义的季节性成分,并指定傅里叶级数的阶数。例如:
from prophet import Prophet # 创建 Prophet 模型 model = Prophet() # 添加年度季节性,阶数为 15 model.add_seasonality(name='yearly', period=365.25, fourier_order=15) # 添加周度季节性,阶数为 5 model.add_seasonality(name='weekly', period=7, fourier_order=5) # 拟合数据 model.fit(df)
总结
傅里叶级数是 Prophet 模型中用于模拟季节性的核心组件。它将复杂的季节性模式分解为一系列简单的正弦和余弦函数,从而使得模型能够有效地捕捉到这些模式。通过调整傅里叶级数的阶数,我们可以控制模型的复杂度,从而在拟合精度和泛化能力之间取得平衡。
希望通过这篇文章,你对 Prophet 模型中的傅里叶级数有了更深入的理解。下次你在使用 Prophet 模型时,不妨思考一下季节性的问题,看看如何通过调整傅里叶级数的阶数来提升模型的性能。如果有什么疑问或者想法,欢迎在评论区留言交流!