WEBKT

Prophet 进阶:自定义 changepoint_func,掌控时间序列拐点

11 0 0 0

changepoint_func 的基本用法

进阶案例:基于业务逻辑的拐点选择

更复杂的案例:结合外部信号

注意事项

总结

大家好,我是你们的程序员朋友,大白。今天咱们来聊聊 Facebook 开源的时间序列预测神器 Prophet 中的一个高级参数:changepoint_func。相信不少用过 Prophet 的朋友都对它强大的自动拐点 (changepoint) 检测能力印象深刻,但有时候,面对复杂的业务场景,默认的拐点选择策略可能不够“灵光”,这时候,changepoint_func 就派上用场了。

先给不太熟悉 Prophet 的朋友简单介绍一下。Prophet 是一个基于加法模型的时间序列预测工具,特别擅长处理具有季节性和节假日效应的数据。它最大的亮点之一就是能够自动检测时间序列中的趋势变化点,也就是拐点。这些拐点代表着数据趋势的重大转变,例如,某个产品的销量突然暴增,或者某个网站的流量突然下降。

默认情况下,Prophet 使用一种基于潜在变化点数量的先验分布来选择拐点。这个先验分布可以通过 changepoint_prior_scale 参数来调整。changepoint_prior_scale 越大,模型就越倾向于选择更多的拐点,反之亦然。但是,这种方法有一个局限性,就是它无法根据具体的时间序列数据来定制拐点选择策略。changepoint_func 的出现,正是为了解决这个问题。

changepoint_func 参数允许我们传入一个自定义函数,这个函数将完全接管拐点的选择过程。这意味着我们可以根据自己的业务逻辑、领域知识,甚至是一些外部信号,来精确地控制拐点的位置和数量。这种灵活性是 Prophet 默认方法无法比拟的。

changepoint_func 的基本用法

changepoint_func 接受一个函数作为输入,这个函数需要满足以下条件:

  1. 输入参数:
    • ts: 一个 Pandas DataFrame,包含时间序列数据。至少需要包含 ds (日期) 和 y (值) 两列。
    • changepoint_prior_scale: 用户设置的 changepoint_prior_scale 值。
    • trend: Prophet 模型拟合的趋势分量。
    • history_dates: 训练数据中的所有日期。
    • kwargs: 其他可能需要的参数。
  2. 返回值:
    • 一个 Pandas Series,表示每个潜在拐点的得分或权重。Series 的索引是潜在拐点的日期,值是对应的得分。得分越高,表示该点越有可能是拐点。

下面是一个最简单的 changepoint_func 示例:

import pandas as pd
def my_changepoint_func(ts, changepoint_prior_scale, trend, history_dates, **kwargs):
# 所有潜在拐点的得分都设为 1
scores = pd.Series(1, index=history_dates)
return scores

这个函数简单粗暴地将所有潜在拐点的得分都设置为 1。这实际上相当于告诉 Prophet,每个点都有相同的可能性成为拐点。这种做法在实际应用中意义不大,但可以作为我们理解 changepoint_func 工作原理的起点。

进阶案例:基于业务逻辑的拐点选择

假设我们是一家电商公司,需要预测某个商品的销量。我们知道,这个商品的销量在每年的“双十一”和“618”大促期间都会有显著的增长。我们可以利用这个业务知识,来定制 changepoint_func,让 Prophet 更准确地捕捉到这些促销活动带来的影响。

import pandas as pd
def promotion_changepoint_func(ts, changepoint_prior_scale, trend, history_dates, **kwargs):
scores = pd.Series(0, index=history_dates)
# 定义促销活动的日期
promotion_dates = [
pd.to_datetime('2023-11-11'),
pd.to_datetime('2024-06-18'),
pd.to_datetime('2024-11-11'),
]
# 将促销活动日期的得分设置为一个较高的值
for date in promotion_dates:
if date in scores.index:
scores[date] = 10
return scores

在这个例子中,我们首先创建了一个全零的 Series,表示所有潜在拐点的初始得分都为 0。然后,我们定义了一个 promotion_dates 列表,包含了过去和未来的几次促销活动的日期。接下来,我们遍历这个列表,将促销活动日期的得分设置为 10。这样,Prophet 在选择拐点时,就会优先考虑这些促销活动日期。

更复杂的案例:结合外部信号

除了业务逻辑,我们还可以结合外部信号来定制 changepoint_func。例如,假设我们是一家新闻网站,需要预测网站的流量。我们知道,网站的流量通常会受到重大新闻事件的影响。我们可以利用这一点,将重大新闻事件的发生时间作为外部信号,来指导 Prophet 选择拐点。

import pandas as pd
import requests
def news_changepoint_func(ts, changepoint_prior_scale, trend, history_dates, **kwargs):
scores = pd.Series(0, index=history_dates)
# 调用新闻 API 获取重大新闻事件
api_key = 'YOUR_API_KEY' # 替换成你的 API 密钥
url = f'https://newsapi.org/v2/top-headlines?country=cn&apiKey={api_key}'
response = requests.get(url)
news_data = response.json()
# 提取新闻发布时间
news_dates = [pd.to_datetime(article['publishedAt']).date() for article in news_data['articles']]
# 将新闻发布日期的得分设置为一个较高的值
for date in news_dates:
date = pd.to_datetime(date) # 将日期对象转换为 Timestamp 对象
if date in scores.index:
scores[date] = 5
return scores

这个例子中,我们首先调用了一个新闻 API(这里使用的是 NewsAPI,你需要替换成你自己的 API 密钥),获取了最近的重大新闻事件。然后,我们提取了新闻的发布时间,并将这些日期的得分设置为 5。这样,Prophet 在选择拐点时,就会考虑到这些新闻事件的影响。

注意事项

在使用 changepoint_func 时,有几个需要注意的地方:

  1. 性能问题:自定义 changepoint_func 可能会增加模型的计算负担,特别是当你的函数逻辑比较复杂,或者需要处理大量的外部数据时。因此,在设计 changepoint_func 时,要注意代码的效率,尽量避免不必要的计算。
  2. 过拟合风险:过度定制 changepoint_func 可能会导致模型过拟合。例如,如果你将所有的促销活动日期都设置为拐点,模型可能会过于关注这些促销活动,而忽略了其他潜在的趋势变化。因此,在使用 changepoint_func 时,要保持一定的谨慎,避免过度干预模型的自动学习过程。
  3. 调试技巧:调试 changepoint_func 可能比较困难,因为你无法直接看到 Prophet 是如何根据你的函数来选择拐点的。一个有用的技巧是,在 changepoint_func 中添加一些打印语句,输出中间结果,例如每个潜在拐点的得分,这样可以帮助你了解函数的执行过程,找到潜在的问题。
  4. 数据预处理: 在传入数据给Prophet之前,确认你的ds列是日期类型。可以使用pd.to_datetime进行转换。

总结

changepoint_func 是 Prophet 中一个非常强大的工具,它允许我们根据自己的业务需求和领域知识,来定制拐点选择策略,从而提高模型的预测准确性。但是,使用 changepoint_func 也有一定的门槛,需要对 Prophet 的内部机制有一定的了解,并且要注意避免性能问题和过拟合风险。希望今天的分享能帮助你更好地掌握这个高级参数,让你的 Prophet 模型更上一层楼!

如果你在使用 changepoint_func 过程中遇到了任何问题,或者有什么好的想法和经验,欢迎在评论区留言,我们一起交流学习!

大白话Python Prophet时间序列Python

评论点评

打赏赞助
sponsor

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

分享

QRcode

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