查看原文
其他

Python的自回归分布滞后模型简介

数据应用学院 大数据应用 2023-08-17

今日份知识你摄入了么?

图一:葡萄酒月销售的多变量时间序列。数据源链接:https://pkg.yangzhuoranyang.com/tsdl/,图像由作者提供。


在这里,你将学习如何使用多变量时间序列创建预测模型。


如果时间序列包含多个变量,那么它就是多元的。


示例详见图1。它显示了多种葡萄酒月度销售的多变量时间序列。每种葡萄酒都是时间序列的一个变量。


假设你想预测其中一个变量。比如起泡酒的销量(个人喜好)。你如何通过一个模型来实现?


常见的方法就是将该变量视为单变量时间序列。有很多模拟这些序列的方法。例如ARIMA,exponential smoothing,或者Facebook的Prophet,自动回归机器学习方法被越来越多地使用(https://towardsdatascience.com/machine-learning-for-forecasting-transformations-and-feature-extraction-bbbea9de0ac2)


然而,其他变量也可能包含起泡酒未来销售的重要线索。详见下面的矩阵。

图2:不同类型酒的相关矩阵。图像由作者提供。


起泡酒的销量(第二排)与其他葡萄酒的销量表现出良好的相关性。


因此,尝试在模型中包含这些变量可能是一个好主意。

我们可以使用一种称为自回归分布滞后(ARDL)的方法来完成。


自回归分布滞后


单变量时间序列的自回归


顾名思义,ARDL模型以自回归为基础。


自回归是大多数单变量时间序列模型的基础。它主要有两个步骤。


首先,我们将(单变量)时间序列从值序列转换为矩阵,用时间延迟嵌入法来实现这一点。尽管这个名字很花哨,但方法却很简单。其根本就是基于之前的最近值对每个值进行建模。了解详细的解释和实施情况,详见我之前的帖子(https://towardsdatascience.com/machine-learning-for-forecasting-transformations-and-feature-extraction-bbbea9de0ac2)


然后,我们再建一个回归模型。未来值表示目标变量。解释变量代表最近的值(https://towardsdatascience.com/machine-learning-for-forecasting-transformations-and-feature-extraction-bbbea9de0ac2)


多变量情况


概念与多元时间序列相似。但是,你也可以将其他变量的过去值添加到解释变量中。这成了一种叫做“多变量时间序列”的方法。但是,你也可以将其他变量的过去值添加到解释变量中。这导致了一种称为“自回归分布滞后”的方法。分布滞后含义是指使用额外变量的滞后性。


把他们放在一起。时间序列中变量的未来值就取决于自身的滞后和其他变量的滞后。


为了使这个方法更清晰明白,我们对其进行了编码。


亲身实践


多变量时间序列通常指许多相关产品的销售数据。我们将以葡萄酒销售时间序列为例。你可以从https://rdrr.io/cran/Rssa/man/AustralianWine.html或https://pkg.yangzhuoranyang.com/tsdl/得到它,ARDL方法也适用于零售以外的其他领域。


转换时间序列


我们先使用以下脚本转换时间序列。


import pandas as pd# https://github.com/vcerqueira/blog/from src.tde import time_delay_embeddingwine = pd.read_csv('data/wine_sales.csv', parse_dates=['date'])# setting date as indexwine.set_index('date', inplace=True)# you can simulate some data with the following code# wine = pd.DataFrame(np.random.random((100, 6)),#            columns=['Fortified','Drywhite','Sweetwhite',#                      'Red','Rose','Sparkling'])# create data set with lagged features using time delay embeddingwine_ds = []for col in wine:    col_df = time_delay_embedding(wine[col], n_lags=12, horizon=6)    wine_ds.append(col_df)# concatenating all variableswine_df = pd.concat(wine_ds, axis=1).dropna()# defining target (Y) and explanatory variables (X)predictor_variables = wine_df.columns.str.contains('\(t\-')target_variables = wine_df.columns.str.contains('Sparkling\(t\+')X = wine_df.iloc[:, predictor_variables]Y = wine_df.iloc[:, target_variables]view rawtde_mv.py hosted with ❤ by GitHub


我们将函数time_delay_embedding(https://towardsdatascience.com/machine-learning-for-forecasting-transformations-and-feature-extraction-bbbea9de0ac2)应用于时间序列中的每个变量(第18–22行)。结果在第23行被连接到单个Pandas数据帧中。


解释变量(X)是每个时间步上(第29行)每个变量的最后12个已知值。以下是它们如何查找滞后t-1(为简洁,省略了其他滞后数)。


滞后t-1的解释变量示例。图像由作者提供。


第30行定义了目标变量。这些变量指的是未来起泡酒销售的6个值:


目标变量的示例。图像由作者提供。


构建模型


准备好数据之后,就可以构建模型了。下面,我使用随机森林算法完成了一个简单的训练和测试周期。


from sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_absolute_error as maefrom sklearn.ensemble import RandomForestRegressorfrom sklearn.ensemble import RandomForestRegressor# train/test splitX_tr, X_ts, Y_tr, Y_ts = train_test_split(X, Y, test_size=0.3, shuffle=False)# fitting a RF modelmodel = RandomForestRegressor()model.fit(X_tr, Y_tr)# getting forecasts for the test setpreds = model.predict(X_ts)# computing MAE errorprint(mae(Y_ts, preds))# 288.13view rawmv_tde_model.py hosted with ❤ by GitHub


在拟合模型(第11行)之后,我们再从测试中得到预测结果(第14行)。该模型的平均绝对误差为288.13。


选择滞后数


图片来自Unsplash,作者 Mikael Kristenson


我们使用每个变量的12个滞后数作为解释变量。这是在函数time_delay_embedding的参数n_lags中定义的。该如何设置此参数的值呢?


很难说应该包含多少值。这取决于输入数据和特定变量。


简单的方法就是使用特征选择。首先,从大量的值开始。然后再根据重要性得分或预测性能减少该数字。


这是该过程的简化版本。首先,根据随机森林的重要性得分选择前10个特征。


然后就是不断重复训练和测试周期。


# getting importance scores from previous modelimportance_scores = pd.Series(dict(zip(X_tr.columns, model.feature_importances_)))# getting top 10 featurestop_10_features = importance_scores.sort_values(ascending=False)[:10]top_10_features_nm = top_10_features.indexX_tr_top = X_tr[top_10_features_nm]X_ts_top = X_ts[top_10_features_nm]# re-fitting the modelmodel_top_features = RandomForestRegressor()model_top_features.fit(X_tr_top, Y_tr)# getting forecasts for the test setpreds_topf = model_top_features.predict(X_ts_top)# computing MAE errorprint(mae(Y_ts, preds_topf))# 274.36view rawmv_tde_model_top_feats.py hosted with ❤ by GitHub


与之前的原始预测指标相比,前十个特征显示出更好的预测性能。以下是这些功能的重要性评分:


前十个特征的重要性评分。图像由作者提供。


正如预期的那样,目标变量(起泡酒)的滞后性是非常最重要的。但是,其他变量的一些滞后性也是相关的。


ARDL的扩展


多目标变量


我们旨在预测单一变量(起泡酒)。如果我们有兴趣预测多个呢?


这就是一种称为向量自回归(VAR)的方法。


与ARDL一样,每个变量都是基于其滞后和其他变量的滞后进行建模的。VAR用于预测多个变量,而不仅仅直是一个变量。


与全球预测模型的关系


值得注意的是,ARDL和全球预测模型(https://medium.com/towards-data-science/introduction-to-global-forecasting-models-3ca8e69a6524)不同。在ARDL的情况下,每个变量的信息都被添加到解释变量之中。变量的数量通常较低而且大小也相同。


全球预测模型汇集了许多时间序列的历史观测结果。该模型符合所有观察结果。因此,每个新系列都作为新的观测值被添加。此外,全球预测模型通常还涉及数千个时间序列。


总结


  • 多变量时间序列包含两个或多个变量。

  • ARDL方法可用于多变量时间序列的监督学习。

  • 使用特征选择策略优化滞后数。

  • 使用VAR法预测多个变量。


参考资料:

[1] Rob Hyndman and Yangzhuoran Yang (2018). tsdl: Time Series Data Library. v0.1.0. https://pkg.yangzhuoranyang.com/tsdl/

原文作者:Vitor Cerqueira

翻译作者:王文龙

美工编辑:过儿

校对审稿:Chuang

原文链接:https://towardsdatascience.com/machine-learning-for-forecasting-supervised-learning-with-multivariate-time-series-b5b5044fe068

本周公开课预告

往期精彩回顾

2022年IDEAS全球人工智能大会火热抢票中!

关于开发Open-Source,我学到的6个教训!

使用SQL总结A/B实验结果

认识Julia:数据科学的未来

招贤纳士 | Marketing specialist、Business Development Manager






点「在看」的人都变好看了哦

点击“阅读原文”查看数据应用学院核心课程

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存