WEBKT

Python Prophet 模型 Changepoint 自定义高级技巧

14 0 0 0

Python Prophet 模型 Changepoint 自定义高级技巧

什么是 Changepoint?

为什么需要自定义 Changepoint?

如何自定义 Changepoint?

1. 指定 Changepoint 的数量 (n_changepoints)

2. 指定 Changepoint 的范围 (changepoint_range)

3. 指定 Changepoint 的先验尺度 (changepoint_prior_scale)

4. 手动指定 Changepoint 的位置 (changepoints)

5. 灵活调整 Changepoint: 使用自定义函数 (changepoint_func)

案例分析:电商销售额预测

总结与最佳实践

Python Prophet 模型 Changepoint 自定义高级技巧

大家好!今天咱们来聊聊 Prophet 时间序列预测模型里一个很重要的概念——Changepoint(突变点)。相信各位高级 Python 开发者在使用 Prophet 的过程中,一定遇到过需要对模型进行更精细控制的场景,而 Changepoint 的自定义就是其中非常关键的一环。

什么是 Changepoint?

简单来说,Changepoint 就是时间序列数据中趋势发生显著变化的点。Prophet 模型的核心思想之一就是自动检测这些 Changepoint,并根据它们来拟合未来的趋势。例如,一个电商网站的销售额可能在“双十一”期间出现一个明显的 Changepoint,因为促销活动导致了销售额的激增。Prophet 模型会自动识别出这个突变点,并调整预测模型。

为什么需要自定义 Changepoint?

Prophet 默认的 Changepoint 自动检测机制在大多数情况下都能很好地工作,但在某些特定场景下,我们可能需要手动干预,原因可能有以下几点:

  1. 领域知识: 你可能比 Prophet 更了解你的数据。例如,你知道某个特定的日期会发生一个重大事件,这个事件会对你的数据产生影响,那么你就可以手动指定这个日期为一个 Changepoint。
  2. 模型调整: Prophet 自动检测到的 Changepoint 可能过多或过少,导致模型过拟合或欠拟合。你可以通过自定义 Changepoint 来调整模型的灵敏度。
  3. 特殊需求: 你可能希望模型只关注某些特定的 Changepoint,而忽略其他 Changepoint。例如,你可能只关心季节性的变化,而忽略短期波动。

如何自定义 Changepoint?

Prophet 提供了多种自定义 Changepoint 的方法,下面我们一一介绍。

1. 指定 Changepoint 的数量 (n_changepoints)

Prophet 默认会自动检测 25 个 Changepoint。你可以通过 n_changepoints 参数来改变这个数量。例如,如果你希望模型只检测 10 个 Changepoint,可以这样做:

from prophet import Prophet
# 假设 df 是你的时间序列数据,包含 'ds' (日期) 和 'y' (值) 列
model = Prophet(n_changepoints=10)
model.fit(df)

注意: 减少 n_changepoints 可以使模型对趋势变化不那么敏感,增加 n_changepoints 则会使模型更加敏感。需要根据实际情况进行调整。

2. 指定 Changepoint 的范围 (changepoint_range)

Prophet 默认会在时间序列的前 80% 的数据中检测 Changepoint。你可以通过 changepoint_range 参数来改变这个范围。例如,如果你希望模型只在前 60% 的数据中检测 Changepoint,可以这样做:

model = Prophet(changepoint_range=0.6)
model.fit(df)

注意: 减小changepoint_range 可以避免模型对近期数据的波动过于敏感。

3. 指定 Changepoint 的先验尺度 (changepoint_prior_scale)

changepoint_prior_scale 参数控制了模型对 Changepoint 的敏感程度。值越大,模型越容易检测到 Changepoint;值越小,模型越不容易检测到 Changepoint。Prophet 默认值为 0.05。你可以根据实际情况进行调整。
例如:希望模型对突变点更迟钝一些:

model = Prophet(changepoint_prior_scale=0.01)
model.fit(df)

4. 手动指定 Changepoint 的位置 (changepoints)

这是最直接的自定义 Changepoint 的方法。你可以通过 changepoints 参数传入一个包含日期列表,指定你希望模型考虑的 Changepoint。例如:

model = Prophet(changepoints=['2023-01-01', '2023-07-01'])
model.fit(df)

注意: 使用此方法时,Prophet 将不会自动检测 Changepoint,而只会使用你指定的 Changepoint。

5. 灵活调整 Changepoint: 使用自定义函数 (changepoint_func)

从版本 1.1 开始,Prophet 提供了一个强大的新功能:changepoint_func。这个参数允许你传入一个自定义函数,该函数将决定哪些点可以作为 Changepoint。这给了你极大的灵活性。

假设你有一个更复杂的业务逻辑,例如只考虑每周一为潜在的 Changepoint, 可以用自定义函数来实现。

import pandas as pd
def only_mondays(ds):
date = pd.to_datetime(ds)
if date.weekday() == 0:
return 1
else:
return 0
model = Prophet(changepoint_func=only_mondays)
model.fit(df) #df 依然是包含ds和y的dataframe
future = model.make_future_dataframe(periods=365)
future['changepoint_value'] = future['ds'].apply(only_mondays) #一定要在future dataframe中应用.
forecast = model.predict(future)

上面这段代码, only_mondays 函数会判断一个日期是否为星期一,如果是,则返回 1,否则返回 0。Prophet 会根据这个函数的返回值来决定是否将该点作为 Changepoint。

注意:

  • 你需要为 future DataFrame 应用同样的逻辑。Prophet 需要知道预测期间哪些点可以作为 Changepoint。
  • changepoint_func 的返回值应该是 0 或 1。1 表示该点可以作为 Changepoint,0 表示不可以。
  • 结合changepoint_range等其他参数,实现更精细的控制.

案例分析:电商销售额预测

假设我们有一家电商网站的销售额数据,我们需要预测未来一年的销售额。我们知道该网站每年都会在“双十一”和“618”期间进行大型促销活动,这会导致销售额的显著增长。我们可以利用 Prophet 的 Changepoint 自定义功能来提高预测的准确性。

import pandas as pd
from prophet import Prophet
# 加载数据
df = pd.read_csv('sales_data.csv')
# 将日期列转换为 datetime 类型
df['ds'] = pd.to_datetime(df['ds'])
# 创建 Prophet 模型,并手动指定 Changepoint
model = Prophet(changepoints=['2023-06-18', '2023-11-11', '2024-06-18', '2024-11-11'])
# 拟合模型
model.fit(df)
# 构建未来一年的日期 DataFrame
future = model.make_future_dataframe(periods=365)
# 进行预测
forecast = model.predict(future)
# 查看预测结果
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
# 可以绘制图形来查看预测结果
fig = model.plot(forecast)

在这个例子中,我们手动指定了“双十一”和“618”的日期作为 Changepoint。Prophet 模型会根据这些 Changepoint 来拟合未来的趋势,从而更准确地预测销售额。

总结与最佳实践

自定义 Changepoint 是 Prophet 模型调优的重要环节。通过合理地使用上述方法,你可以显著提高模型的预测准确性。以下是一些最佳实践:

  1. 了解你的数据: 在自定义 Changepoint 之前,花时间分析你的数据,了解数据的特点和潜在的 Changepoint。
  2. 从默认设置开始: 不要一开始就手动指定 Changepoint。先使用 Prophet 的默认设置,看看效果如何。如果效果不好,再考虑自定义 Changepoint。
  3. 逐步调整: 不要一次性进行 drastic 的改变。逐步调整 n_changepointschangepoint_rangechangepoint_prior_scale 参数,观察模型的变化。
  4. 使用交叉验证: 使用交叉验证来评估不同 Changepoint 设置的效果,选择最佳的设置。
  5. 结合领域知识: 将你的领域知识与 Prophet 的 Changepoint 自定义功能结合起来,可以获得更好的预测效果。
  6. 善用changepoint_func:对于复杂的业务逻辑,使用自定义函数可以大大提高灵活性和准确性。

希望这篇文章能帮助你更好地理解和使用 Prophet 的 Changepoint 自定义功能。如果你有任何问题或建议,欢迎留言讨论!咱们下期再见!

技术老兵 Prophet时间序列Python

评论点评

打赏赞助
sponsor

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

分享

QRcode

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