原文:
www.kdnuggets.com/2023/03/time-series-forecasting-statsmodels-prophet.html
时间序列是一种在数据科学领域独特的数据集。数据是按时间频率(例如:每日、每周、每月等)记录的,每个观察值与其他观察值相关。时间序列数据在你想分析数据随时间变化的情况并进行未来预测时非常有价值。
1. Google 网络安全证书 - 快速通道进入网络安全职业。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织的 IT
时间序列预测是一种基于历史时间序列数据创建未来预测的方法。时间序列预测有许多统计方法,例如 ARIMA 或 指数平滑。
时间序列预测在商业中经常遇到,因此数据科学家了解如何开发时间序列模型是非常有益的。在本文中,我们将学习如何使用两个流行的预测 Python 包:statsmodels 和 Prophet 来进行时间序列预测。让我们开始吧。
statsmodels Python 包是一个开源包,提供了各种统计模型,包括时间序列预测模型。让我们用一个示例数据集来试用这个包。本文将使用来自 Kaggle 的 数字货币时间序列 数据(CC0:公共领域)。
让我们清理数据,看看我们拥有的数据集。
import pandas as pd
df = pd.read_csv('dc.csv')
df = df.rename(columns = {'Unnamed: 0' : 'Time'})
df['Time'] = pd.to_datetime(df['Time'])
df = df.iloc[::-1].set_index('Time')
df.head()
对于我们的示例,假设我们想预测‘close_USD’变量。让我们看看数据随时间的模式。
import matplotlib.pyplot as plt
plt.plot(df['close_USD'])
plt.show()
让我们基于上述数据构建预测模型。在建模之前,我们先将数据分为训练数据和测试数据。
# Split the data
train = df.iloc[:-200]
test = df.iloc[-200:]
我们不会随机分割数据,因为这是时间序列数据,我们需要保持顺序。相反,我们尝试从较早的数据中获取训练数据,从最新的数据中获取测试数据。
让我们使用 statsmodels 创建一个预测模型。statsmodel 提供了许多时间序列模型 API,但我们将使用 ARIMA 模型作为示例。
from statsmodels.tsa.arima.model import ARIMA
#sample parameters
model = ARIMA(train, order=(2, 1, 0))
results = model.fit()
# Make predictions for the test set
forecast = results.forecast(steps=200)
forecast
在我们的示例中,我们使用 statsmodels 的 ARIMA 模型作为预测模型,并尝试预测接下来的 200 天。
模型结果好吗?让我们来评估一下。时间序列模型评估通常使用可视化图来比较实际值和预测值,并使用回归指标如均绝对误差 (MAE)、均方根误差 (RMSE) 和均绝对百分比误差 (MAPE)。
from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np
#mean absolute error
mae = mean_absolute_error(test, forecast)
#root mean square error
mse = mean_squared_error(test, forecast)
rmse = np.sqrt(mse)
#mean absolute percentage error
mape = (forecast - test).abs().div(test).mean()
print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAPE: {mape:.2f}%")
MAE: 7956.23
RMSE: 11705.11
MAPE: 0.35%
上述评分看起来不错,但我们来看看它们的可视化效果如何。
plt.plot(train.index, train, label='Train')
plt.plot(test.index, test, label='Test')
plt.plot(forecast.index, forecast, label='Forecast')
plt.legend()
plt.show()
如我们所见,预测效果较差,因为我们的模型无法预测上升趋势。我们使用的 ARIMA 模型似乎过于简单。
也许我们可以尝试使用 statsmodels 之外的其他模型。让我们尝试一下 Facebook 的著名 Prophet 包。
Prophet 是一个时间序列预测模型包,适用于具有季节性影响的数据。Prophet 还被认为是一个稳健的预测模型,因为它可以处理缺失数据和异常值。
让我们试试 Prophet 包。首先,我们需要安装这个包。
pip install prophet
之后,我们必须准备数据集以进行预测模型训练。Prophet 有一个特定要求:时间列需要命名为‘ds’,值列需要命名为‘y’。
df_p = df.reset_index()[["Time", "close_USD"]].rename(
columns={"Time": "ds", "close_USD": "y"}
)
数据准备好之后,我们来尝试基于数据创建预测。
import pandas as pd
from prophet import Prophet
model = Prophet()
# Fit the model
model.fit(df_p)
# create date to predict
future_dates = model.make_future_dataframe(periods=365)
# Make predictions
predictions = model.predict(future_dates)
predictions.head()
Prophet 的优点在于每个预测数据点都为用户提供了详细的信息。然而,仅从数据中很难理解结果。因此,我们可以尝试使用 Prophet 对其进行可视化。
model.plot(predictions)
模型的预测绘图函数会提供我们对预测的信心程度。从上述图中,我们可以看到预测有上升的趋势,但随着预测时间的延长,不确定性增加。
还可以使用以下函数检查预测组件。
model.plot_components(predictions)
默认情况下,我们会获得具有年度和每周季节性的数据显示趋势。这是一种很好的方式来解释数据的变化情况。
是否也可以评估 Prophet 模型?当然可以。Prophet 包括一个我们可以使用的诊断测量:时间序列交叉验证。该方法使用历史数据的一部分,每次使用截止点之前的数据拟合模型。然后 Prophet 将预测结果与实际结果进行比较。让我们尝试使用代码。
from prophet.diagnostics import cross_validation, performance_metrics
# Perform cross-validation with initial 365 days for the first training data and the cut-off for every 180 days.
df_cv = cross_validation(model, initial='365 days', period='180 days', horizon = '365 days')
# Calculate evaluation metrics
res = performance_metrics(df_cv)
res
在上述结果中,我们获得了每个预测日实际结果与预测结果的评估结果。也可以使用以下代码可视化结果。
from prophet.plot import plot_cross_validation_metric
#choose between 'mse', 'rmse', 'mae', 'mape', 'coverage'
plot_cross_validation_metric(df_cv, metric= 'mape')
如果我们查看上面的图表,可以看到预测误差随着天数的变化而变化,在某些点可能达到 50%的误差。这样,我们可能需要进一步调整模型以修正误差。你可以查看文档以进行进一步探索。
预测是商业中常见的情况之一。开发预测模型的一种简单方法是使用 statsforecast 和 Prophet Python 包。本文将介绍如何创建预测模型并使用 statsforecast 和 Prophet 进行评估。
Cornellius Yudha Wijaya 是一名数据科学助理经理和数据撰稿人。在全职工作于印尼安联期间,他喜欢通过社交媒体和写作媒体分享 Python 和数据技巧。