Prophet模型中使用外生变量
在使用 Prophet 进行时间序列预测时,我们可能需要考虑一些与时间序列相关但是并不在时间序列中体现的因素,比如天气、特别节日等,这些因素被称为 外生变量(external regressors)。添加外生变量之后,Prophet模型就变成多变量时间序列模型了,如果外生变量选的不错,可能会使模型的性能得到较大的提升。
1 用add_regressor
添加外生变量
Prophet 提供了 add_regressor
方法,可以将外生变量添加到模型中,以进一步提高模型的拟合和预测能力。具体步骤如下:
-
准备:准备好外生变量的数据,包括变量的名称和对应的值。在添加了外生变量后,Prophet 会自动对它们进行标准化处理,使其值落在 [0, 1] 的范围内。
-
添加:使用 add_regressor 方法向模型中添加外生变量,并在其中指定变量的名称。例如,假设我们想向时间序列数据中添加温度变量 temp,则可以像下面这样添加:
# model是你实例化之后的 model.add_regressor('temp')
-
训练:在训练模型时,将外生变量的数据作为 DataFrame 类型的参数传入 fit 方法中。例如,假设 temp 变量的数据存储在名为 df 的 DataFrame 中,则可以像下面这样训练模型:
# 将外生变量添加到训练集中 df['temp'] = [15, 16, 17, 18, 19] # df中还有时间序列数据,如果是饱和预测,还有cap、floor model.fit(df)
-
预测:在进行预测时,如果用到了
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
方法来添加自定义的周期性成分,从而更好地模拟时间序列中的周期性变化。需要注意的是,此处只是调整模型的参数,而不是给模型增加额外的变量(特征)。具体步骤如下:
-
添加:使用
add_seasonality
方法添加自定义的周期性成分,可以指定周期的长度、名称、强度等参数。例如,如果我们想向模型中添加一个额外的二次周期性成分,可以像下面这样添加:# model就是实例化的Prophet model.add_seasonality('custom_period', period=14, fourier_order=2)
其中,‘
custom_period
’ 是该周期性成分的名称,period=14 表示周期长度为 14(这里可以根据具体需求进行调整),fourier_order=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)
总结
对不同的时间序列,特征工程不同,调参寻优方法、建模过程也可能大相径庭。应根据实际情况,做出一些适应性的调整,上述只是方法论,仅供参考。