Prophet 时间序列预测算法

一、背景

时间序列预测是一种预测未来数据的方法,对于时间序列的分析,我们可以采用传统的统计学方法,例如 ARIMA、Exponential Smoothing等,这些方法通过分析过去的数据建立模型来预测未来的趋势,但是这些方法有一个限制就是必须满足某些假设条件,例如数据的稳定性,缺失值的处理等等。

因此,近年来出现了一些新的时间序列预测方法,例如 Facebook开源的 Prophet,它是一种具有高度灵活性的时间序列预测算法,它能够处理数据的不稳定性,缺失值,异常值等等,同时还能够自动检测周期性的趋势和节假日的影响,可以应用于多种行业和领域。


二、Prophet 的基本原理

Prophet 的基本原理是将时间序列分解成趋势项、季节项和假日项,并在此基础上使用加法模型进行预测。具体地,假设时间序列 y(t) 由以下三个部分组成:

  • 趋势项 g(t):描述时间序列的长期趋势,通常采用带有自动回归项和季节项的分段线性模型来拟合。
  • 季节项 s(t):描述时间序列的周期性变化,通常采用傅里叶级数来拟合。
  • 假日项 h(t):描述时间序列中的异常事件(如节假日、促销等),通常采用自定义二进制变量来表示。
    将趋势项、季节项和假日项相加,得到时间序列的预测值:

y(t) = g(t) + s(t) + h(t) + ε(t)

其中,ε(t) 是误差项,通常假定为正态分布。


三、Prophet 的使用方法

1、环境准备

首先,我们需要安装 Prophet 和其所依赖的 Python 包。可以通过以下命令进行安装:

pip install fbprophet numpy pandas matplotlib

2、数据准备

为了进行销售量预测,我们需要先准备一些历史销售数据。这里我们使用一个示例数据集 sales.csv,包含日期和销售量两列。数据集可以通过以下链接下载:
https://raw.githubusercontent.com/facebook/prophet/master/examples/example_retail_sales.csv

我们可以使用 Pandas 库读取数据集:

import pandas as pd

sales = pd.read_csv('sales.csv')

接下来,我们需要将数据集转换为 Prophet 所需的格式。
Prophet 要求数据集至少包含 dsy 两列,分别表示日期预测值
在这里,我们将 ds 列设置为日期列,并将 y 列设置为销售量列。

sales = sales.rename(columns={
    
    'ds': 'date', 'y': 'sales'})
sales['date'] = pd.to_datetime(sales['date'])

最后,我们还需要将数据集拆分为训练集和测试集。这里我们将最后 12 个月的数据作为测试集。

test_size = 12
train = sales.iloc[:-test_size]
test = sales.iloc[-test_size:]

3、模型训练

数据准备好了,接下来我们就可以开始训练 Prophet 模型了。Prophet 的使用流程大致如下:

  1. 创建一个 Prophet 模型对象
  2. 用训练集数据拟合模型
  3. 使用模型对未来数据进行预测
from fbprophet import Prophet

# 创建 Prophet 模型对象
model = Prophet()

# 拟合模型
model.fit(train)

# 构建未来时间序列
future = model.make_future_dataframe(periods=test_size, freq='M')

# 使用模型进行预测
forecast = model.predict(future)

在上面的代码中,我们创建了一个 Prophet 模型对象 model,并使用训练集数据对其进行拟合。

然后,我们使用 make_future_dataframe 方法构建一个包含未来 12 个月的时间序列,并使用 predict 方法进行预测。

需要注意的是,Prophet 的预测结果包含许多列,其中包括:yhat 列为预测值,yhat_lower 列为预测值的下限,yhat_upper 列为预测值的上限。

4、评估优化

在进行时间序列预测之后,我们需要对预测结果进行评估和优化。
Prophet 提供了许多方法来评估模型的拟合程度,例如可视化预测结果、计算预测误差等。

1)可视化预测结果
import matplotlib.pyplot as plt

# 可视化预测结果
fig = model.plot(forecast)
plt.show()

这里,我们使用 plot 方法将预测结果可视化,然后使用Matplotlib将其绘制出来。

2)计算预测误差
# 计算预测误差
from fbprophet.diagnostics import performance_metrics

df_perf = performance_metrics(forecast)

通过对预测结果进行评估,我们可以确定模型的拟合程度,进而进行优化,例如调整模型参数、增加更多的历史数据等。

3)查看预测结果的组成部分
model.plot_components(forecast)

这将生成一个包含趋势、季节性和假期效应的可视化图。

以上就是如何使用Prophet进行时间序列预测的基本步骤。

当然,在实际应用中,可能需要进行更多的数据处理和调整(如自定义季节性、设置假期、置信区间等),以确保获得最佳的预测结果。


四、总结

Prophet 是一款功能强大的时间序列预测工具,使用简单,同时具有较高的预测准确率。

如果是对时序数据进行预测的场景,推荐使用 Prophet !!!


PS

关于 Prophet 参数说明,请参考博客:https://www.cnblogs.com/miracle-luna/p/17368601.html


猜你喜欢

转载自blog.csdn.net/aikudexiaohai/article/details/130679275