使用 Prophet 进行 Python 时间序列预测

2025年3月17日 | 阅读 10 分钟

时间序列预测被认为是一项具有挑战性的任务,因为我们可以利用各种方法,每种方法都有各种超参数。

Prophet 库是一个开源库,旨在对时间序列的单变量数据集进行预测。它易于使用,并且旨在默认情况下自动为模型找到一组好的超参数,以便借助趋势和季节性结构对数据进行熟练的预测。

在下面的教程中,我们将讨论使用 Facebook Prophet 库来预测时间序列。

在整个教程中,我们将学习

  1. Prophet 是一个开源库,旨在自动预测单变量时间序列数据,由 Facebook 开发。
  2. 如何拟合 Prophet 模型并利用它们进行样本内和样本外预测?
  3. 如何在保留数据集上评估 Prophet 模型?

那么,让我们开始吧。

理解 Prophet 预测库

Prophet,也称为“Facebook Prophet”,是一个开源库,用于预测 Facebook 设计的单变量时间序列。

Prophet 实现了他们所称的加性时间序列预测模型,并且该实现支持季节性、趋势和假期。

根据 Prophet 包的文档,它实现了一个基于加性模型预测时间序列数据的过程,其中非线性趋势与每日、每周、每年季节性以及假期效应一起拟合。

它设计得易于使用且完全自动化。例如,将其指向时间序列并获得预测。它旨在用于内部公司使用,例如预测销售额、容量等等。

Prophet 库提供了两个接口,包括 Python 和 R。本教程我们将主要关注 Python 接口。

第一步是使用 pip 安装程序安装 Prophet 库。

如何安装 Python Prophet 库?

为了安装 Python 模块,我们需要“pip”,这是一个管理从受信任的公共存储库安装模块所需的包的框架。一旦我们有了“pip”,我们就可以使用 Windows 命令提示符 (CMD) 或终端中的命令安装 prophet 库,如下所示

语法

验证安装

模块安装完成后,我们可以通过创建一个空的 Python 程序文件并写入如下 import 语句来验证它:

文件:verify.py

现在,保存上述文件并在终端中使用以下命令执行它:

语法

输出

Prophet 0.7.1

如果上述 Python 程序文件没有引发任何异常并返回安装程序版本号,则 Prophet 库已正确安装。但是,如果引发异常,请尝试重新安装该库,并且建议查阅该库的官方文档。

理解 Prophet 库的工作原理

现在让我们使用每月汽车销售数据集来理解 Python Prophet 库的工作原理。

该数据集是一个标准的单变量时间序列数据集,包含趋势和季节性。该数据集包含 108 个月的数据,朴素的持久性预测可以实现约 3,235 次销售的平均绝对误差,提供了较低的误差限。

让我们首先加载并总结数据集

加载和总结数据集

Prophet 需要数据以 Pandas 数据框的形式存储。因此,我们将借助 Pandas 库加载和总结数据。

我们可以通过调用 Pandas 的 read_csv() 函数直接从 URL 加载数据,总结数据的形状(行数和列数),并查看数据的前几行。

让我们看下面的例子来演示这一点:

示例

输出

(108, 2)
     Month    Sales
0  1960-01   6550.0
1  1960-02   8728.0
2  1960-03  12026.0
3  1960-04  14395.0
4  1960-05  14587.0

说明

在上面的代码片段中,我们从 Pandas 库导入了 read_csv() 函数。然后,我们初始化了以 CSV 文件形式存储数据的路径,并使用导入的函数读取该文件并将其转换为数据框。然后,我们使用 shape 属性总结了数据的形状。最后,我们为用户打印了数据的前几行。

结果,我们可以观察到有 108 个月的数据和两列。第一列是月份,第二列是销售数量。

注意:输出中的第一列是行索引,不属于数据集,只是 Pandas 用于对行进行排序的有用工具。

加载和绘制数据集

一个时间序列数据集,直到我们绘制它才算完整。

绘制时间序列可以让我们显示是否存在趋势、季节性周期、异常值等等。它让我们对数据有所了解。

我们可以通过在数据框上调用 plot() 函数,轻松地在 Pandas 中绘制数据。

让我们考虑以下说明相同内容的示例

示例

输出

Time Series Forecasting with Prophet in Python

说明

在上面的代码片段中,我们从各自的库中导入了 read_csv 函数以及 pyplot 模块。然后,我们初始化了 CSV 文件的路径。然后,我们使用 read_csv 函数读取该文件并将其转换为数据框。然后,我们使用 plot() 函数绘制图表,并使用 show() 函数为用户显示它。

结果,我们可以清楚地看到销售额随时间的趋势和每月销售额的季节性模式。这些是我们期望预测模型考虑的模式。

现在我们熟悉了数据集,让我们探索如何利用 Prophet 库进行预测。

使用 Python 中的 Prophet 预测汽车销售额

在以下部分中,我们将讨论如何使用 Prophet 库预测汽车销售数据集。

让我们从拟合数据集上的模型开始。

拟合 Prophet 模型

为了使用 Prophet 进行预测,我们将首先定义一个 Prophet() 对象并对其进行配置。然后,我们将调用 fit() 函数并将数据传递给它以在数据集上拟合它。

Prophet() 对象接受参数以根据偏好配置模型类型,例如增长类型、季节性类型等。默认情况下,模型将努力自动找出几乎所有内容。

fit() 函数接受时间序列数据的数据框。数据框应具有特定格式。第一列的名称必须是“ds”并包含日期时间。第二列的名称必须是“y”并包含观测值。

此语句意味着我们更改数据集中的列名。它还要求第一列如果不是日期时间对象,则将其转换为日期时间对象。例如,这可以通过使用 read_csv() 函数的适当参数加载数据集来完成。

现在,让我们考虑以下语法,说明我们如何修改加载的数据集以使其具有预期结构。

示例

说明

在上述语法中,我们更改了数据框列的名称,以使其具有预期的结构。

现在,让我们看一个在汽车销售数据集上拟合 Prophet 模型的完整示例,如下所示

示例

输出

INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.

说明

在上面的代码片段中,我们导入了所需的库并加载了数据。然后,我们准备了预期的列名。最后,我们定义了 prophet 模型并将数据集拟合到它。

下一步是进行预测。

进行样本内预测

它将有助于对历史数据进行预测。

我们可以对用作训练模型输入的数据进行预测。理想情况下,模型以前见过数据,会做出正确的预测。

然而,情况并非如此,因为模型试图概括数据中的所有情况。

此过程称为进行样本内(训练集样本中)预测,并且查看输出可以深入了解模型的好坏。也就是说,它学习训练数据的程度如何。

通过调用 predict() 函数并传入一个包含一列名为 'ds' 且行中包含预测区间的日期时间的数据框来进行预测。

有多种方法可以创建这个“the_forecast”数据框。例如,数据集中的最后十二个月,为每个月创建一个字符串。在下面的案例中,我们将遍历一年的日期。然后,我们将日期列表转换为数据框,并将字符串值转换为日期时间对象。

让我们考虑以下演示相同内容的语法。

示例

说明

在上面的代码片段中,我们定义了一个名为 future 的列表。然后,我们使用 for 循环迭代 1968 年的月份并返回该时期的数据。然后,我们将这些数据构造成一个列名为 'ds' 的数据框,并将此列设置为显示日期时间。

现在我们可以将数据框提供给 predict() 函数以评估预测。

predict() 函数的结果将是一个包含多列的数据框。最重要的列可能包括

  • 预测日期时间 ('ds')。
  • 预测值 ('yhat')。
  • 预测值的下限和上限('yhat_lower''yhat_upper'),它们提供了预测的不确定性。

让我们考虑以下打印前几个预测的代码片段

示例

说明

在上面的代码片段中,我们打印了前几个预测的导入列。

Prophet 还提供了一个内置工具,用于在训练数据集的上下文中可视化预测。这可以通过在模型上使用 plot() 函数并传入结果数据框来完成。它将创建训练数据集的图,并用预测的上限和下限覆盖预测日期。

这里是相同的语法

示例

说明

在上面的代码片段中,我们对模型使用了 plot() 函数并传入了结果数据框。然后,我们使用 show() 函数显示结果图。

现在,让我们看一个进行样本内预测的完整程序。

示例

输出

INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
          ds          yhat    yhat_lower    yhat_upper
0 1968-01-01  14334.737769  12802.203888  15949.723255
1 1968-02-01  14905.955964  13337.420778  16552.309312
2 1968-03-01  20842.150502  19242.348853  22460.757530
3 1968-04-01  22870.095215  21341.988780  24473.330178
4 1968-05-01  24176.211162  22508.496756  25726.410744

Time Series Forecasting with Prophet in Python

说明

正如我们所观察到的,上面的代码片段将返回数据集最后 12 个月的预测。

报告了预测的前五个月,我们还可以观察到这些值与数据集中原始销售值没有太大差异。

此外,我们还可以注意到已经创建了一个图。训练数据表示为黑色点,预测是蓝色线,蓝色阴影区域表示上限和下限。

最后,我们可以理解,预测的 12 个月与实际观测值非常吻合,特别是在考虑了界限的情况下。