机器学习做多维时间序列预测

时间:2024-03-27 10:17:41

另一篇博文地址:时间序列arima预测:https://blog.csdn.net/u014281392/article/details/77585419

做时间序列预测,
传统模型:比如ARIMA模型,一次只能对一组时间序列数据进行预测,比如预测某个品牌下某家店未来销售额。

现实情况中需要预测某个品牌下每家店未来的销售额。也就是说,如果这个品牌在某地区一共有100家店,我们就需要给出这100家店分别对应的销售额预测值。
此时传统模型便不再适合。

时间序列预测模型建模思路

  1. 初始数据集
    机器学习做多维时间序列预测
    一开始拿到的数据可能是分好训练集、测试集的,也可能是没分好的。这里我按照竞赛的情况假设一开始的数据集分有训练集和测试集。

对于时间序列数据来说,训练集即为历史数据,测试集即为新数据。历史数据对应的时间均在时间分割点之前(如2018年以前某品牌每家店每天的销售数据),新数据对应的时间均在分割点之后(如2018年以后某品牌每家店每天的销售数据)。

历史数据和新数据均包含N维信息(如某品牌每家店的地理位置、销售的商品信息等),但前者比后者多一列数据:Target,即要预测的对象,如销售额。

基于给出的数据,我们的预测任务是:根据已有数据,预测测试集的Target(如,根据某品牌每家店2018年以前的历史销售情况,预测每家店2018年1月份头15天的销售额)

  1. 数据处理
    在构建预测特征上,截面数据和时间序列数据遵循的逻辑截然不同。下面两张图分别是二者的数据处理逻辑示意图。

首先来看针对截面数据的数据处理思路。

机器学习做多维时间序列预测
对于截面数据来说,训练集数据和测试集数据在时间维度上没有区别,二者唯一的区别是前者包含要预测的目标变量,而后者没有该目标变量。

一般来说,在做完数据清洗之后,我们用“N维数据”来分别给训练集、测试集构建M维预测特征(维度相同),然后用机器学习算法在训练集的预测特征和Target上训练模型,最后通过训练出的模型和测试集的预测特征来计算预测结果(测试集的Target)。

此外,为了给模型调优,我们一般还需要从训练集里面随机分割一部分出来做验证集。

而时间序列的处理思路则有所不同

机器学习做多维时间序列预测
时间序列预测的核心思想是:用过去时间里的数据预测未来时间里的Target。

所以,在构建模型的时候,所有过去时间里的数据(训练集里的N维数据和Target,如2018年以前每家店的地理信息、所卖商品信息、日销售额等)都应该拿来构建预测特征。

而新数据本身的N维数据(如2018年1月头15天每家店的地理信息、所卖商品信息等)也应该拿来构建预测特征。

前者是历史特征(对应图上的预测特征A),后者是未来特征(对应图上的预测特征B)。二者合起来构成总预测特征集合。

最后,用预测模型和这个总的预测特征集合来预测未来Target(如未来销售额)。

看到这里,一个问题就产生了:既然所有的数据都拿来构建预测特征了,那预测模型从哪里来?没有Target数据,模型该怎么构建?

你可能会说,那就去找Target呗。对,没有错。但这里需要注意,我们要找的不是未来时间下的Target(毕竟未来的事还没发生,根本无从找起),而是从过去时间里构造“未来的”Target,从而完成模型的构建。这是在处理时间序列上,逻辑最绕的地方。

3. 模型构建
用机器学习算法构造时间序列预测模型,关键的思路在于,通过时间滑窗,人为地构造“未来”Target,来给算法进行学习。

有点绕,请看下面的示意图
机器学习做多维时间序列预测
和之前一样,从时间的角度上来看,我们有历史数据,和新数据。但这里,我们不能简单地把历史数据作为训练集、把新数据作为测试集。

怎么做呢。

首先,在历史数据上,我们通过截取不同时间窗口的数据来构造一组或几组数据。比如,我的历史数据是2017年 1月到12月每家店每天的销售数据,那么我可以截取3组数据(见上图的深绿、浅绿部分):2017年1月到10月的数据、2017年2月到11月的数据、2017年3月到12月的数据。

然后,人为地给每组数据划分历史窗口(对应上图的深绿色部分)和未来窗口(对应上图的浅绿色部分)。比如,对于2017年1月到10月的数据,我把1月到9月作为历史窗口、10月作为未来窗口,以此类推。

接着,分别给每组数据构建预测特征,包括历史特征(预测特征A)和未来特征(预测特征B)。而此时,每组数据还有预测Target。

这个时候,我们把得到的所有预测特征(我的例子里是三组预测特征)都合并起来作为训练集特征、把所有预测Target(我的例子里是三组预测Target)合并起来作为训练集Target,之后就可以构建机器学习模型了。

有了训练集和训练模型,还差测试集。测试集的构建遵循之前的数据处理逻辑,拿历史数据构建历史特征,拿新数据构建未来特征,然后把这些特征加入到从训练集上训练出的预测模型中去,即可得到任务需要的最终预测值。

这里需要注意,划多少个时间窗口因数据而异。此外,数据的历史窗口(图上深绿部分)和未来窗口(图上浅绿部分)可以是定长也可以是变长,看具体情况。

以上就是我最近总结出的用机器学习算法构建时间序列预测模型的建模思路。

时间序列预测竞赛代码:
https://github.com/wepe/O2O-Coupon-Usage-Forecast

转载来源:https://blog.csdn.net/weixin_42587745/article/details/82965531