Python 中的高级时间序列建模 (ARIMA) 模型
介绍
时间序列算法广泛用于分析和预测基于时间的数据。一组流行且强大的时间序列算法是 ARIMA 类模型,该算法基于描述数据中的自相关性。
ARIMA 代表自回归综合移动平均线,具有构建 ARIMA 模型所需的三个成分p、d和q 。这三个成分是:
p:自回归滞后数
d:使序列平稳所需的差分阶数
q:移动平均滞后数
在本指南中,您将学习 ARIMA 建模的核心概念以及如何在 Python 中实现它。让我们从理解和加载数据开始。
数据
本指南使用虚构的某连锁超市月销售数据,其中包含 564 个观测值和 3 个变量,如下所述:
- 日期:每月的第一天 
- 销售额:每日销售额(千美元) 
- Class:表示训练和测试数据集划分的变量 
下面的代码行导入所需的库和数据。
      import pandas as pd
import numpy as np 
# Reading the data
df = pd.read_csv("data.csv")
print(df.shape)
print(df.info())
    
输出:
      (564, 3)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 564 entries, 0 to 563
Data columns (total 3 columns):
Date     564 non-null object
Sales    564 non-null int64
Class    564 non-null object
dtypes: int64(1), object(2)
memory usage: 13.3+ KB
None
    
下一步是创建用于模型构建和评估的训练和测试数据集。
      train = df[df["Class"] == "Train"]
test = df[df["Class"] == "Test"]
print(train.shape)
print(test.shape)
    
输出:
      (552, 3)
    (12, 3)
    
您还应该使用下面的代码创建训练和测试数组。
      train_array = train["Sales"]
print(train_array.shape)
test_array = test["Sales"]
print(test_array.shape)
    
输出:
      (552,)
     
 (12,)
    
准备好数据后,您就可以开始学习后续章节中的预测技术了。不过,在构建 ARIMA 模型之前,了解平稳性的统计概念非常重要。
文具系列
ARIMA 的要求之一是时间序列应该是平稳的。平稳序列是指其属性不会随时间而变化的序列。有几种方法可以检查序列的平稳性。您将在本指南中使用的方法是 Augmented Dickey-Fuller 检验。
增强型迪基-福勒检验
增强型迪基-福勒检验是一种统计单位根检验。该检验使用自回归模型,并针对多个不同的滞后值优化信息标准。
检验的零假设是时间序列不是平稳的,而备择假设(拒绝零假设)是时间序列是平稳的。
第一步是从statsmodels包导入adfuller模块。这在下面的第一行代码中完成。第二行执行并打印测试的 p 值。
      from statsmodels.tsa.stattools import adfuller
print("p-value:", adfuller(train_array.dropna())[1])
    
输出:
      p-value: 0.3440379665909026
    
上面的输出显示 p 值大于显著性水平 0.05,因此我们无法拒绝原假设。该序列不是平稳的,需要差分。
可以使用diff()函数对序列进行差分。下面的第一行代码执行一阶差分,而第二行执行增强迪基-福勒检验。
      diff_1 = train_array.diff().dropna()
print("p-value:", adfuller(diff_1.dropna())[1])
    
输出:
      p-value: 0.001
    
现在 p 值低于重要性水平,表明该序列是平稳的。
ARIMA 模型
现在,您可以构建 ARIMA 模型并进行预测。您将使用Python 中的auto_arima函数,该函数会自动发现 ARIMA 模型的最佳顺序。简单来说,该函数将自动确定 ARIMA 模型的参数p、d ' 和q。
该函数的重要参数为:
- 适合 ARIMA 模型的时间序列。 
- start_p : p的起始值,即自回归(AR)模型的阶数。这必须是一个正整数。 
- start_q : q的起始值,即移动平均 (MA) 模型的阶数。这必须是一个正整数。 
- d:一阶差分的阶数。默认设置为无,然后根据检验结果自动选择值,在本例中为增强迪基-福勒检验。 
- 测试:当平稳性为假且d为无时,使用单位根检验的类型来检测平稳性。 
现在您将构建 ARIMA 估计器。第一步是导入包含auto_arima函数的pmdarima库。第二步是定义一个函数,该函数接受时间序列数组并返回 auto-arima 模型。这些步骤在下面的代码中完成。
      import pmdarima as pmd
def arimamodel(timeseriesarray):
    autoarima_model = pmd.auto_arima(timeseriesarray, 
                              start_p=1, 
                              start_q=1,
                              test="adf",
                              trace=True)
    return autoarima_model
    
下一步是使用上面定义的函数并在训练数据上构建 ARIMA 估计器。
      arima_model = arimamodel(train_array)
arima_model.summary()
    
输出:
      Fit ARIMA: order=(1, 1, 1); AIC=7974.318, BIC=7991.565, Fit time=0.425 seconds
Fit ARIMA: order=(0, 1, 0); AIC=7975.310, BIC=7983.934, Fit time=0.011 seconds
Fit ARIMA: order=(1, 1, 0); AIC=7973.112, BIC=7986.047, Fit time=0.177 seconds
Fit ARIMA: order=(0, 1, 1); AIC=7973.484, BIC=7986.419, Fit time=0.084 seconds
Fit ARIMA: order=(2, 1, 0); AIC=7974.012, BIC=7991.259, Fit time=0.274 seconds
Fit ARIMA: order=(2, 1, 1); AIC=7973.626, BIC=7995.185, Fit time=0.989 seconds
Total fit time: 2.000 seconds
ARIMA Model Results
Dep. Variable:	D.y	No. Observations:	551
Model:	ARIMA(1, 1, 0)	Log Likelihood	-3983.556
Method:	css-mle	S.D. of innovations	333.866
Date:	Wed, 27 May 2020	AIC	7973.112
Time:	11:37:46	BIC	7986.047
Sample:	1	HQIC	7978.166
coef	std err	z	P>|z|	[0.025	0.975]
const	9.0108	13.085	0.689	0.491	-16.636	34.658
ar.L1.D.y	-0.0871	0.042	-2.053	0.041	-0.170	-0.004
Roots
Real	Imaginary	Modulus	Frequency
AR.1	-11.4797	+0.0000j	11.4797	0.5000
    
上面的输出表明,最终拟合的模型是 ARIMA(1,1,0) 估计量,其中参数p、d和q的值分别为 1、1 和 0。auto_arima函数使用AIC作为标准,测试具有不同p、d和q组合的时间序列。 AIC 代表赤池信息准则,它估计给定模型丢失的相对信息量。 简单来说,AIC 值越低越好。 在上面的输出中,ARIMA(1, 1, 0) 模型获得了最低的 AIC 值 7973.112,并将其用作最终估计量。
您已经训练了模型,现在将使用它对测试数据进行预测并执行模型评估。执行此操作之前的一步是创建一个将用作评估指标的效用函数。下面的代码创建了一个效用函数,用于计算平均绝对百分比误差 (MAPE),这是要使用的指标。MAPE 值越低,预测模型性能越好。
      def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
    
下一步是对测试数据进行预测,使用下面的代码完成。第二行打印前五个观察值。
      test['ARIMA'] = automodel.predict(len(test))
test.head(5)
    
输出:
      Date	      Sales	   Class	  ARIMA
552	01-01-2014	  6785        Test      6882.9
553	01-02-2014	  6856        Test      6889.8
554	01-03-2014	  6853        Test      6898.9
555	01-04-2014	  6400       Test      6907.9
556	01-05-2014	  6442        Test      6916.9
    
最后一步是使用效用函数评估测试数据的预测,如下所示。
      mean_absolute_percentage_error(test.Sales, test.ARIMA)
    
输出:
      9.7846
    
上面的输出显示测试数据的 MAPE 为 9.8%。 较低的值意味着模型结果良好。
结论
在本指南中,您学习了如何使用 ARIMA 预测时间序列数据。您了解了时间序列的平稳性要求以及如何通过差分使非平稳序列平稳化。最后,您学习了如何使用 Python 构建和解释 ARIMA 估计量以进行预测。
要了解有关使用 Python 进行数据科学的更多信息,请参阅以下指南。
- <a href="https://www-pluralsight-com.translate.goog/resources/blog/guides/validating-machine-learning-models-s 
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
 
                                 
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                     
                                 
                             
                                     
                                     
                                     
                                     
     
    
 
             
   
        
请先 登录后发表评论 ~