一文搞懂ARIMA时间序列预测模型(python)

文摘   2024-06-01 17:44   辽宁  
点击上方“进修编程”,选择“星标公众号

超级无敌干货,第一时间送达!!!

在本文中,我将使用 Python 中的 ARIMA 模型进行时间序列分析和预测示例教会大家如何使用。

ARIMA(自回归综合移动平均线)是一种广泛使用的统计方法,用于分析时间序列数据并预测未来值。ARIMA 模型用于对时间序列数据中的趋势、季节性和噪声(随机波动)进行建模。

ARIMA 模型由三个基本部分组成:

  1. AR(自回归):此组件使用过去时间步骤的观测值的线性组合来预测当前时间步骤的值。AR 的程度决定了我们回溯的时间步骤数。

  2. I(积分):此组件通过获取数据序列的差异使数据平稳。这使数据序列的趋势平稳,并使模型更适合。

  3. MA(移动平均):此组件使用过去时间步的误差项的线性组合来估计当前时间步的值。MA 的程度决定了过去误差项的回溯程度。

❗ 在应用 ARIMA 之前,我们需要确保该序列是平稳的;涉及检查该序列的统计属性(例如均值、方差和自相关)是否随时间保持不变。

让我们检查一下数据集

我将使用代表 1959 年美国加利福尼亚州每日女性出生总数的数据集。

# 导入库import pandas as pd import matplotlib.pyplot as plt from sklearn.metrics import mean_squared_error import warnings 
from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.arima.model import ARIMA
# 关闭警告warnings.filterwarnings( 'ignore' )

1-导入库:

  • import pandas as pd:用于数据操作的库。

  • import matplotlib.pyplot as plt:用于绘制图形的库。

  • from sklearn.metrics import mean_squared_error:scikit-learn 库用于计算均方误差来评估预测的准确性

  • from statsmodels.tsa.stattools import adfuller和from statsmodels.graphics.tsaplots import plot_acf, plot_pacf:这些行从库中导入必要的函数statsmodels来测试时间序列平稳性(增强迪基-福勒检验)并绘制自相关函数(ACF)和偏自相关函数(PACF)图。

  • from statsmodels.tsa.arima.model import ARIMA:它ARIMA从库中导入类statsmodels来创建 ARIMA 模型。

  • import warnings:用于处理警报的库。

# 加载数据集data = pd.read_csv( "daily-total-female-births-CA.csv" ) data.head()

data["date"] = pd.to_datetime(data["date"])data.set_index("date", inplace=True)

第一行将列pd.to_datetime(data["date"])中的数据转换"date"为时间戳数据类型。

如果第二行是set_index("date", inplace=True),则不会创建新的DataFrame,而是替换现有的DataFrame。这样,数据索引现在由日期和时间信息组成,并且可以在此索引上执行基于日期的操作。

# plot the time seriesplt.plot(data["births"])plt.title('Daily Total Female Births in California')plt.xlabel('Date')plt.ylabel('Number of births')plt.show()

该图表显示了“出生”列中的数据随时间的变化情况,并提供了对趋势、季节性等的初步见解。

2-平稳性检验

我们使用增强迪基-福勒(ADF)检验来检查平稳性:

adf_test = adfuller(data["births"])print('ADF Statistic: %f' % adf_test[0])print('p-value: %f' % adf_test[1])

  1. adf_test = adfuller(data["births"]):该adfuller()函数执行增强型迪基-福勒单位根检验。此检验有助于确定时间序列的平稳性。“出生”列中的数据将发送到此检验,并将结果分配给变量adf_test。

  2. print('ADF Statistic: %f' % adf_test[0]):打印 ADF 统计数据。ADF 统计数据提供有关测试结果和时间序列的平稳性属性的信息。adf_test[0]对应于包含 ADF 统计数据的测试结果的第一个元素(第一个索引)。

  3. print('p-value: %f' % adf_test[1]):打印 p 值 (p-value)。p 值决定假设检验结果的统计显著性。adf_test[1]对应于包含 p 值的检验结果的第二个元素。

此代码块使用 ADF 检验确定“出生”列中数据的平稳性,并打印此检验的结果。如果 ADF 统计量越负,p 值越低,则可以得出结论,时间序列是平稳的。

👉p值低于0.05表示平稳性,我们的数据符合此标准,因此我们不需要对其进行差分。

3-查找 ARIMA 参数

我们使用自相关函数 (ACF) 和偏自相关函数 (PACF) 图来查找 ARIMA 参数。

plot_acf(data['births'], lags=40)plot_pacf(data['births'], lags=40)plt.show()

在此代码中,plot_acf()函数用于绘制 ACF 图,plot_pacf()函数用于绘制 PACF 图。lags参数指定要绘制的滞后范围。

👉这些图表明 ARIMA(1, 0, 1)模型可能是一个很好的起点。

4-建立ARIMA模型

model = ARIMA(data['births'], order=(1, 0, 1))model_fit = model.fit()

创建 ARIMA 模型:

  • 使用代码行定义 ARIMA 模型ARIMA(data['births'], order=(1, 0, 1))。

  • data['births']表示时间序列数据。

  • order=(1, 0, 1),指定 ARIMA 模型的参数。这些参数分别是自回归项数 ( p=1)、积分度 ( d=0) 和移动平均项数 ( q=1)。

将模型拟合到数据:

  • 该model.fit()方法被调用来将 ARIMA 模型拟合到时间序列。

  • 这个过程使得模型能够适应数据,以找到最适合数据的参数。

5-训练和预测

用数据训练模型并做出预测。然后将预测结果与历史数据一起可视化。

forecast = model_fit.get_forecast(steps=30)
  • get_forecast(steps=30)用于获取模型在指定步骤 ( steps=30) 的未来预测。

  • 该steps参数指定下一步将估计多少步。这里预测了未来 30 步。

6-模型评估

为了评估该模型,进行回溯预测。

# Split the data into train and testtrain_size = int(len(data) * 0.8)train, test = data[0:train_size], data[train_size:len(data)]
# Fit the ARIMA model on the training datasetmodel_train = ARIMA(train['births'], order=(1, 0, 1))model_train_fit = model_train.fit()
# Forecast on the test datasettest_forecast = model_train_fit.get_forecast(steps=len(test))test_forecast_series = pd.Series(test_forecast.predicted_mean, index=test.index)
# Calculate the mean squared errormse = mean_squared_error(test['births'], test_forecast_series)rmse = mse**0.5
# Create a plot to compare the forecast with the actual test dataplt.figure(figsize=(14,7))plt.plot(train['births'], label='Training Data')plt.plot(test['births'], label='Actual Data', color='orange')plt.plot(test_forecast_series, label='Forecasted Data', color='green')plt.fill_between(test.index, test_forecast.conf_int().iloc[:, 0], test_forecast.conf_int().iloc[:, 1], color='k', alpha=.15)plt.title('ARIMA Model Evaluation')plt.xlabel('Date')plt.ylabel('Number of Births')plt.legend()plt.show()
print('RMSE:', rmse)

回溯法将预测数据与测试集中的实际数据进行比较。估计值的均方根误差 (RMSE) 约为 6.97 个出生。

该图显示了训练数据、测试集上的实际值(橙色)和预测值(绿色);95% 置信区间显示为阴影区域。该模型似乎捕捉到了序列的集中趋势,但未能捕捉到任何潜在的样本内变异性;这并不奇怪,因为 ARIMA 模型通常更适合包含趋势或季节性的数据,而该序列并未表现出这些趋势或季节性。

RMSE 表示预测准确度;值越低表示拟合度越高。此误差水平是否可以接受取决于模型的具体使用环境。

结论

ARIMA 模型是时间序列预测的强大工具。通过了解时间序列数据中的潜在模式并使用统计测试和图表来确定模型参数,我们可以构建一个提供准确可靠预测的模型。本人五年项目开发经验有需要可找我!

—  —


进修编程
提升编程技能,学习编程技巧