WEBKT

Prophet 模型多重季节性时间序列预测实战技巧

17 0 0 0

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_loweryhat_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 也不是万能的。在实际应用中,你可能还需要根据具体情况,尝试不同的模型和参数,才能找到最适合你的解决方案。记住,数据分析是一个不断试错、不断优化的过程。希望今天的分享对你有所帮助!下次再见!

数据挖掘机 Prophet时间序列预测多重季节性

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8809