Prophet在Python中的时间序列预测
时间序列预测被认为是一个具有挑战性的任务,因为我们可以利用各种方法和各种超参数来进行预测。
Prophet库是一个开源库,旨在为时间序列的单个变量数据进行预测。它易于使用,并且通过默认情况下的趋势和季节性结构找到一组良好的超参数,从而能够为数据进行准确预测。
在接下来的教程中,我们将讨论使用Facebook Prophet库来预测时间序列。
在整个教程中,我们将学习:
- Prophet是一个由Facebook开发的用于自动预测单变量时间序列数据的开源库。
- 如何拟合Prophet模型并利用其进行样本内和样本外预测?
- 如何在保留数据集上评估Prophet模型?
所以,让我们开始吧。
了解Prophet预测库
Prophet,也被称为”Facebook Prophet”,是一个由Facebook设计的用于预测单变量时间序列的开源库。
Prophet实现了他们所说的加法时间序列预测模型,并且该实现支持季节性、趋势和假日。
根据Prophet Package的文档,它实现了一种基于加法模型的时间序列数据预测过程,其中非线性趋势与每日、每周、每年的季节性以及假日效应相匹配。
它被设计为易于使用和完全自动化。例如,将其应用于时间序列并得到预测结果。它的目的是用于公司内部使用,例如销售预测、产能预测等等。
Prophet库提供了包括Python和R在内的两个接口。本教程主要关注Python接口。
步骤1是通过pip安装Prophet库。
如何安装Python的Prophet库
为了安装Python模块,我们需要pip,这是一个管理从值得信任的公共仓库安装模块所需的包的框架。有了pip之后,我们可以使用以下命令从Windows命令提示符(CMD)或终端安装prophet库:
语法:
$ python.exe -m pip install fbprophet
验证安装
安装完成后,我们可以通过创建一个空的Python程序文件并编写以下 import 语句来验证它:
文件:verify.py
# importing the library
import fbprophet
# printing the version number
print("Prophet %s" %fbprophet.__version__)
现在,保存上述文件并在终端中使用以下命令执行:
语法:
$ python verify.py
输出:
Prophet 0.7.1
如果上面的Python程序文件没有引发任何异常并返回安装程序的版本号,则Prophet库已正确安装。然而,在引发异常的情况下,请尝试重新安装该库,并建议参考官方文档。
理解Prophet库的工作原理
现在让我们使用月度汽车销售数据集来了解Python Prophet库的工作原理。
该数据集是一个标准的单变量时间序列数据集,包括趋势和季节性。该数据集包含108个月的数据,一个朴素持久预测可以实现大约3235个销售额的平均绝对误差,这是一个较低的误差限制。
让我们从加载和总结数据集开始。
加载和总结数据集
Prophet库需要将数据存储在Pandas数据帧的形式中。因此,我们将使用Pandas库加载和总结数据。
我们可以通过调用Pandas的 read_csv() 函数直接从URL加载数据,总结数据的形状(行数和列数),并查看数据的前几行。
让我们考虑以下示例来演示相同的操作:
示例:
# importing the required function
from pandas import read_csv
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# summarizing shape
print(dFrame.shape)
# displaying the first few rows
print(dFrame.head())
输出:
(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文件的路径,并使用导入的函数读取该文件并将其转换为Data frame。然后使用shape属性对数据的形状进行了总结。最后,我们打印出了几行数据供用户查看。
因此,我们可以观察到有108个月的数据和两列。第一列是月份,第二列是销售数量。
注意:输出中的第一列是行索引,不是数据集的一部分,只是Pandas用来对行进行排序的有用工具。
加载和绘制数据集
除非我们绘制它,否则时间序列数据集是不完整的。
通过绘制时间序列,我们可以展示趋势、季节循环、异常值等等。它让我们对数据有了一个感性的认识。
我们可以通过在Data frame上调用plot()函数来轻松绘制数据。
让我们考虑以下示例来说明这一点:
示例:
# importing the required modules from libraries
from pandas import read_csv
from matplotlib import pyplot
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# plotting the time series
dFrame.plot()
pyplot.show()
输出:
解释:
在上面的代码片段中,我们从各自的库中导入了 read_csv 函数和 pyplot 模块。然后,我们初始化了CSV文件的路径。接着,我们使用 read_csv 函数读取该文件并将其转换为数据帧。然后,我们使用 plot() 函数绘制图表,并使用 show() 函数将其显示给用户。
因此,我们可以清楚地查看销售额随时间的趋势以及销售额的月度季节性模式。这些是我们希望预测模型考虑的模式。
现在我们熟悉了数据集,让我们探讨如何利用Prophet库进行预测。
使用Prophet在Python中预测汽车销售
在接下来的部分,我们将讨论如何使用Prophet库来预测汽车销售数据集。
让我们从在数据集上拟合模型开始。
拟合Prophet模型
为了使用Prophet进行预测,我们首先需要定义一个 Prophet() 对象并进行配置。然后,我们将调用 fit() 函数并传递数据来拟合数据集。
Prophet() 对象接受参数来根据偏好配置模型类型,如增长类型、季节性类型等。默认情况下,模型将自动努力找出几乎所有问题。
fit() 函数接受一个时间序列数据的数据帧。数据帧应该有特定的格式。第一列的名称必须为’ds’,包含日期时间数据。第二列的名称必须为’y’,包含观察数据。
这意味着我们需要更改数据集中的列名。它还要求如果还没有,将第一列转换为日期时间对象。例如,可以通过使用适当的参数加载数据集来完成此操作。 read_csv() 函数。
现在,让我们考虑以下语法,说明如何修改加载的数据集以获得预期的结构。
示例:
# preparing the expected column names
dFrame.columns = ['ds', 'y']
dFrame['ds']= to_datetime(dFrame['ds'])
解释:
在以上的语法中,我们改变了数据框列的名称,以便符合预期的结构。
现在,让我们看一个完整的示例,如何使用 Prophet 模型拟合汽车销售数据集:
示例:
# importing the required functions and modules
from pandas import read_csv
from pandas import to_datetime
from fbprophet import Prophet
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# preparing the expected names of the columns
dFrame.columns = ['ds', 'y']
dFrame['ds']= to_datetime(dFrame['ds'])
# defining the model
prophet_model = Prophet()
# fitting the model
prophet_model.fit(dFrame)
输出:
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”的数据框。例如,在数据集中的最后十二个月内,为每个月创建一个字符串。在下面的示例中,我们将循环遍历一年的日期。然后,我们将日期列表转换为数据框,并将字符串的值转换为日期时间对象。
让我们考虑以下示例的语法。
示例:
# defining the period for which we want a prediction
future = list()
for i in range(1, 13):
date = '1968-%02d' % i
future.append([date])
future = DataFrame(future)
future.columns = ['ds']
future['ds'] = to_datetime( future['ds'] )
解释:
在上面的代码片段中,我们定义了一个名为 future 的列表。然后,我们使用 for 循环遍历1968年的月份,并返回该时期的数据。然后,我们将这些数据放入一个数据框中,列名为 ‘ds’ ,并将此列设置为显示日期时间。
现在,我们可以将数据框提供给 predict() 函数,以评估预测。
predict() 函数的结果将是一个包含多列的数据框。其中最重要的列可能是:
- 预测的日期时间 ( ‘ds’ )。
- 预测的值 ( ‘yhat’ )。
- 预测值的下限和上限 ( ‘yhat_lower’ 和 ‘yhat_upper’ ),提供了预测的不确定性。
让我们考虑以下代码片段,我们在其中打印了前几个预测值:
示例:
# summarizing the forecast
print(the_forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())
解释:
在上面的代码片段中,我们打印了几个预测的导入列。
Prophet还提供了一个内置的实用工具,可以在训练数据集的上下文中可视化预测。这可以通过在模型上使用 plot() 函数并传递一个结果数据框来实现。它会创建一个训练数据集的图表,并在预测日期的上下界上覆盖预测结果。
以下是相同的语法:
示例:
# plotting the forecast
prophet_model.plot(the_forecast)
pyplot.show()
解释:
在上面的代码片段中,我们在模型上使用了 plot() 函数,并将数据帧的结果传递给它。然后我们使用 show() 函数来显示结果图形。
现在,让我们看一下完整的制作样本内预测的程序。
示例:
# importing the required functions and modules
from pandas import read_csv
from pandas import to_datetime
from pandas import DataFrame
from fbprophet import Prophet
from matplotlib import pyplot
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# preparing the expected column names
dFrame.columns = ['ds', 'y']
dFrame['ds']= to_datetime(dFrame['ds'])
# defining the model
prophet_model = Prophet()
# fitting the model
prophet_model.fit(dFrame)
# defining the period for which we want a prediction
future = list()
for i in range(1, 13):
date = '1968-%02d'%i
future.append([date])
future = DataFrame(future)
future.columns = ['ds']
future['ds']= to_datetime( future['ds'] )
# using the model to make a forecast
the_forecast = prophet_model.predict(future)
# summarizing the forecast
print(the_forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())
# plotting the forecast
prophet_model.plot(the_forecast)
pyplot.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
说明:
正如我们所观察到的,上述代码段将返回数据集中过去12个月的预测。
预测的前五个月被报告,我们还可以观察到这些值与数据集中原始销售值并没有太大的差异。
此外,我们还可以注意到一张图表已经被创建。训练数据以黑色点的形式表示,预测结果是一条蓝色的线,上下边界都在一个蓝色的阴影区域内。
最后,我们可以理解到预测的12个月与真实观测值非常匹配,尤其是考虑到边界情况。