下图显示了关于不同类型葡萄酒销售的每月多变量时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设您要预测其中一个变量。例如,起泡酒。如何建立模型进行预测?一种常见的方法是将此变量视为单变量时间序列。这样就有很多方法可以对这些系列进行建模。也可以使用ARIMA、指数平滑或Facebook的Prophet和自回归等机器学习方法。但其他变量可能为起泡酒的未来销售提供重要线索。看看下面的相关矩阵。可以看出,起泡酒(第二行)的销量与其他酒类的销量有相当大的相关性。因此,将这些变量包含在模型中可能是个好主意。本文将展示如何通过称为自回归分布式滞后(ARDL)的方法来完成此操作。Auto-RegressiveDistributedLagARDL模型使用自回归。自回归是大多数单变量时间序列模型的基础。主要分为两步。首先将(单变量)时间序列从值序列转换为矩阵。这可以使用时间延迟嵌入来完成。尽管名字很花哨,但这种方法非常简单。它根据之前的最新值对每个值建模。然后建立回归模型。未来值代表目标变量。解释变量是过去最近的值。多变量时间序列的想法类似,我们可以将其他变量的过去值添加到解释变量中。这就是所谓的自回归分布滞后法。分布式滞后意味着使用额外变量的滞后。现在我们整合它们,时间序列中一个变量的未来值取决于它自身的滞后值和其他变量的滞后值。实现多变量时间序列的代码通常引用许多相关产品的销售数据。这里我们以葡萄酒销售时间序列为例。当然,ARDL方法也适用于零售以外的其他领域。转换时间序列首先使用下面的脚本转换时间序列。importpandasaspd#https://github.com/vcerqueira/blog/fromsrc.tdeimporttime_delay_embeddingwine=pd.read_csv('data/wine_sales.csv',parse_dates=['date'])#设置日期为索引wine.set_index('date',inplace=True)#你可以用下面的代码模拟一些数据#wine=pd.DataFrame(np.random.random((100,6)),#columns=['Fortified','Drywhite','Sweetwhite',#'Red','Rose','Sparkling'])#使用时间延迟嵌入创建具有滞后特征的数据集wine_ds=[]forcolinwine:#连接所有变量wine_df=pd.concat(wine_ds,axis=1).dropna()#定义目标(Y)和解释变量(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]将time_delay_embedding函数应用于时间序列中的每个变量(第18-22行).Line23将结果与我们的数据集合并。解释变量(X)是每个变量在每个时间步长的最后12个已知值(第29行)。下面是他们如何寻找滞后t-1(为简洁起见省略了其他滞后值):目标变量在第30行定义。这指的是未来销售的6个值:建立模型准备好数据后,您可以构建模型。使用随机森林的简单训练和测试循环。fromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportmean_absolute_errorasmaefromsklearn.ensembleimportRandomForestRegressor#train/testsplitX_tr,X_ts,Y_tr,Y_ts=train_test_split(X,Y,test_size)#fse=0.3,RF模型模型=RandomForestRegressor()model.fit(X_tr,Y_tr)#获取测试集的预测preds=model.predict(X_ts)#计算MAE误差print(mae(Y_ts,preds))#288.13拟合模型后(第11行),并获得测试集中的预测(第14行)。该模型的平均绝对误差为288.13。滞后参数的选择上面的基线使用每个变量的12个滞后作为解释变量。这是在函数time_delay_embedding的参数n_lags中定义的。那么这个参数的值应该怎么设置呢?很难先验地说应该包括多少值,因为这取决于输入数据和特定变量。解决这个问题的一个简单方法是使用特征选择。从适当数量的值开始,然后根据重要性分数或预测性能修改此数字,或直接使用GridSearch进行超参数搜索。我们这里简单演示一个判断过程:根据随机森林的重要性得分选择前10个特征。#从之前的模型中获取重要性得分X_tr[top_10_features_nm]X_ts_top=X_ts[top_10_features_nm]#重新拟合模型model_top_features=RandomForestRegressor()model_top_features.fit(X_tr_top,Y_tr)#获取测试集的预测preds_topdiature=model_tstop_ct(MAerrorprint(mae(Y_ts,preds_topf))#274.36Top10featuresshowbetterpredictiveperformancethanrawpredictions.以下是这些特征的重要性:目标变量(Sparkling)的滞后是最重要的。但其他变量的一些滞后也是相关的。ARDL的扩展对于多个目标变量的预测,到目前为止我们一直在预测单个变量(起泡酒)。如果我们想同时预测几个变量呢?这种方法称为:向量自回归(VAR)与ARDL一样,每个变量都根据其滞后和其他变量的滞后进行建模。当想要预测多个变量而不仅仅是一个变量时,使用VAR。与全球预测模型的关系值得注意的是,ARDL并不等同于全球预测模型(GlobalForecastingModels)。在ARDL的前提下,解释变量中加入了各个变量的信息。变量的数量通常很小并且大小相同。全球预测模型汇集了许多时间序列的历史观察结果。该模型对所有这些观察结果进行建模。每个新的时间序列都作为新的观察添加到数据中。全球预测模型通常涉及多达数千个时间序列,而且量级也很大。总结本文的要点如下:多元时间序列包含两个或多个变量;ARDL方法可用于多元时间序列的监督学习;使用特征选择策略来优化滞后数。如果要预测多个变量,可以使用VAR方法。最后,本文的数据集在这里:https://rdrr.io/cran/Rssa/man/AustralianWine.html
