Prophet模型中使用外生变量、自定义周期性

news/2024/12/28 22:56:16/

Prophet模型中使用外生变量

在使用 Prophet 进行时间序列预测时,我们可能需要考虑一些与时间序列相关但是并不在时间序列中体现的因素,比如天气、特别节日等,这些因素被称为 外生变量(external regressors)。添加外生变量之后,Prophet模型就变成多变量时间序列模型了,如果外生变量选的不错,可能会使模型的性能得到较大的提升。

1 用add_regressor 添加外生变量

Prophet 提供了 add_regressor 方法,可以将外生变量添加到模型中,以进一步提高模型的拟合和预测能力。具体步骤如下:

  1. 准备:准备好外生变量的数据,包括变量的名称和对应的值。在添加了外生变量后,Prophet 会自动对它们进行标准化处理,使其值落在 [0, 1] 的范围内。

  2. 添加:使用 add_regressor 方法向模型中添加外生变量,并在其中指定变量的名称。例如,假设我们想向时间序列数据中添加温度变量 temp,则可以像下面这样添加:

    # model是你实例化之后的
    model.add_regressor('temp')
    
  3. 训练:在训练模型时,将外生变量的数据作为 DataFrame 类型的参数传入 fit 方法中。例如,假设 temp 变量的数据存储在名为 df 的 DataFrame 中,则可以像下面这样训练模型:

    # 将外生变量添加到训练集中
    df['temp'] = [15, 16, 17, 18, 19]
    # df中还有时间序列数据,如果是饱和预测,还有cap、floor
    model.fit(df)
    
  4. 预测:在进行预测时,如果用到了make_future_dataframe生成预测窗口,需要在 make_future_dataframe 得到的Dateframe中指定外生变量的值;如果用的是拆分的测试集,在测试集中也要有外生变量的值。例如,假设我们需要预测未来五天的时间序列数据:

    # 用make_future_dataframe生成预测窗口
    future = model.make_future_dataframe(periods=5)
    future['temp'] = [20, 21, 22, 23, 24]  # 添加外生变量 temp
    

Prophet添加外生变量的完整代码:

"""
利用 Prophet 模型对 example.csv 中的时间序列数据进行建模
同时添加了一个外生变量 temp
并生成了未来五天的预测数据
最后,使用 plot 和 plot_components 方法将预测结果和外生变量的影响进行可视化展示
"""import pandas as pd
from fbprophet import Prophet  # 或from prophet import Prophet# 导入数据
df = pd.read_csv('example.csv')
df['ds'] = pd.to_datetime(df['ds'])# 实例化Prophet 此处我用的默认参数
model = Prophet()# 添加外生变量
model.add_regressor('temp')# 训练模型
model.fit(df)# 生成预测数据 此处我用的make_future_dataframe
future = model.make_future_dataframe(periods=5)
future['temp'] = [20, 21, 22, 23, 24]  # 添加外生变量 temp
forecast = model.predict(future)# 可视化预测结果和外生变量的影响
fig = model.plot(forecast)
fig = model.plot_components(forecast)

2 用add_seasonality 添加自定义周期性

除了使用外生变量之外,我们还可以使用 add_seasonality 方法来添加自定义的周期性成分,从而更好地模拟时间序列中的周期性变化。需要注意的是,此处只是调整模型的参数,而不是给模型增加额外的变量(特征)。具体步骤如下:

  1. 添加:使用 add_seasonality 方法添加自定义的周期性成分,可以指定周期的长度、名称、强度等参数。例如,如果我们想向模型中添加一个额外的二次周期性成分,可以像下面这样添加:

    # model就是实例化的Prophet
    model.add_seasonality('custom_period', period=14, fourier_order=2)
    

    其中,‘custom_period’ 是该周期性成分的名称,period=14 表示周期长度为 14(这里可以根据具体需求进行调整),fourier_order=2 表示使用两个傅里叶项来对该成分进行拟合。

  2. 预测:在进行预测时,与默认的周期性成分一样,在 make_future_dataframe 方法中设置好需要预测的时间区间,然后调用 predict 方法进行预测即可。例如:

    # 生成预测窗口
    future = model.make_future_dataframe(periods=60)
    # 预测
    forecast = model.predict(future)
    

Prophet添加自定义周期性完整代码:

"""
利用 Prophet 模型对 example.csv 中的时间序列数据进行建模
添加了一个额外的周期性成分(名称为 'custom_period',周期长度为 14,傅里叶项数为 2)
最后,我们使用 plot 方法可视化预测结果
"""import pandas as pd
from fbprophet import Prophet  # from prophet import Prophet# 导入数据
df = pd.read_csv('example.csv')
df['ds'] = pd.to_datetime(df['ds'])# 创建 Prophet 对象
model = Prophet()# 添加自定义二次周期性成分
model.add_seasonality('custom_period', period=14, fourier_order=2)# 训练模型
model.fit(df)# 生成预测数据
future = model.make_future_dataframe(periods=60)
forecast = model.predict(future)# 可视化预测结果
fig = model.plot(forecast)

总结

对不同的时间序列,特征工程不同,调参寻优方法、建模过程也可能大相径庭。应根据实际情况,做出一些适应性的调整,上述只是方法论,仅供参考。


http://www.ppmy.cn/news/47430.html

相关文章

案例分享 | 汽车电机控制箱螺钉浮高检测

电机控制器是通过主动工作来控制电机按照设定的方向、速度、角度、响应时间进行运动的集成电路,日常生活中的洗衣机、冰箱、印刷机等设备都需要电机控制器来控制其运行工作,是各种机械设备中不可或缺的部件。 在电动车辆中,电机控制器也是关…

Google FLASH-QUAD Transformer模型的设计雷点

这个模型用来做无序弱监督分类,效果好,特别是收敛速度比标准多头Attention层快多了,完全没得比。 问题1 但这模型我用来做自回归生成,非常垃圾。 同时尝试了 GPT 和 T5 这两种模型结构的设计,明明Loss正常下降&#…

Python‘s Standard Library :Networking

Python’s Standard Library :Networking Python的标准库为创建网络服务和远程访问服务提供了一些模块。例如:ipaddress, socket, socketserver 等。 Python’s standard library comes complete with modules for creating network services, as well …

JAVA面试宝典: SpringCloud知识点(通俗易懂易背)

1、什么是 Spring Cloud? Spring Cloud 是基于 Spring Boot 的微服务架构开发工具箱,提供了在分布式系统中构建可靠的、弹性的、灵活的应用所需的大多数工具。Spring Cloud 中包含的子项目如下: Spring Cloud Config:配置管理工具…

STL :双端队列容器 Deque

Deque #include<deque> using namesace std; 双端队列容器 &#xff1a;双向开口的连续线性空间&#xff1b; 擅长尾部和头部添加或删除元素&#xff1a;常数阶&#xff1b; 存储元素并不能保证所有元素都存储到连续的内存空间中&#xff1b; deque 是动态的以分段…

系统需求分析

系统需求分析 需求分析是软件生存周期中相当重要的一个阶段。由于开发人员熟悉计算机但不熟悉应用 领域的业务&#xff0c;用户熟悉应用领域的业务但不熟悉计算机&#xff0c;因此对于同一个问题&#xff0c;开发人员和用 户之间可能存在认识上的差异。在需求分析阶段&#xff…

java记录-lambda表达式、接口应用、方法引用

基本形式 (str)->{System.out.println(str) };调用作为参数的接口实例的方法 1、用一个类实现接口&#xff0c;然后使用该类实例调用方法 2、匿名内部类 3、在 接口&#xff08;不能是抽象类&#xff09; 有且只有一个抽象方法时&#xff0c;可以使用lamda表达式来重写这个…

蓝桥 卷“兔”来袭编程竞赛专场-07明码加密 题解

赛题介绍 挑战介绍 清末&#xff0c;电报技术进入中国。上海大北水线电报公司在 1871 年选用了六千八百九十七个汉字&#xff0c;代以四码数字&#xff0c;编写成了中国最早的电报明码本。为了传输的内容可以保密&#xff0c;又设计出了将明码本加密的方法&#xff0c;于是就…