阿里云ACA 使用时间序列分解模型预测商品销量(三)

本文接上一篇使用时间序列分解模型预测商品销量———计算回归的差值dQ

发表本博客的目的在于记录笔记,分享经验,无其他任何目的

计算回归的差值dQ

使用线性回归方程预测出来的是与时间无关因素对产品销量的影响,本实验假设用产品实际销量减去回归模型预测销量就可以得到随时间波动的产品销量。
从左侧拖出一个“SQL脚本”,将其重命名为“计算dQ”,连接至“预测Q”,并输入如下代码:

select monthno
,quantity
,prediction_result
,(quantity - prediction_result) as dQ
from ${t1}

这段代码计算了该产品真实销量q与线性回归模型预测销量Q的差值dQ,本模型假设dQ可用时间序列分解的方法进行预测。
在这里插入图片描述
单击“计算dQ”,左键单击“执行该节点”

dQ归一化
右键单击“计算dQ”,左键单击“查看数据”。
在这里插入图片描述
由于dQ是回归模型预测值与真实值的差,实际上是模型的误差项,所以dQ较为均匀地分布在x轴两侧,均值接近于0。
由于在乘法分解模型中dQ的均值需要做分母,可能会放大模型的误差,因此需要对dQ进行归一化。
归一化是一种用来消除量纲的数据预处理方法。通常来说,不同的指标有着不同的量纲,对不同指标进行归一化可以消除他们之间的量纲差异。在本次实验中,归一化的目的不是消除量纲,通过将dQ的值域都映射到[0,1]区间上的归一化方法可以消除dQ可能会放大模型误差的问题。

从左侧拖出“数据预处理”— >“归一化”组件,连接至“计算dQ”。
在这里插入图片描述

单击“归一化”,在右侧“选择字段”选择‘dQ’。
在这里插入图片描述
单击“归一化-1”,左键单击“执行该节点”。
待其运行结束,右键单击“归一化-1”–“查看数据”–“查看输出桩1
在这里插入图片描述
可以看出,归一化之后,dQ已经被投影到了[0,1]的区间上。

时间序列分解

这一步新用到的PAI组件有:
“数据预处理”–“归一化”:可以对数据进行归一化处理。

时间序列分解计算

接下来进行时间序列分解,要求的参数有U,T,C,S,R。其中,U直接取训练集的平均dQ即可,T则需要计算移动平均。

从左侧拖出3个“SQL”脚本,按如下方式连接并重命名:
在这里插入图片描述
在“计算U与Y”输入如下代码:

select a.monthno
,a.dQ_adj
,a.U
,(a.dQ_adj/a.U) as Y
from
(SELECT monthno
,dQ as dQ_adj
,avg(dQ) over(partition by 1) AS U
from ${t1}
) a

这段代码根据归一化之后的dQ与其均值U计算出了Y。
单击“计算U与Y”,选择“执行该节点”。单击“计算U与Y”“查看数据”

在这里插入图片描述
这里已经计算出了Y,接下来要对Y求移动平均。
在“聚合”输入如下代码:

select * from
( select monthno,lag(a.y,1) over (partition by 1 order by monthno) as y from ${t1} a
  union all
  select monthno,lag(b.y,2) over (partition by 1 order by monthno) as y from ${t1} b
  union all
  select monthno,lag(c.y,3) over (partition by 1 order by monthno) as y from ${t1} c
  union all
  select monthno,lag(d.y,4) over (partition by 1 order by monthno) as y from ${t1} d
  union all
  select monthno,lag(e.y,5) over (partition by 1 order by monthno) as y from ${t1} e
  union all
  select monthno,lag(f.y,6) over (partition by 1 order by monthno) as y from ${t1} f
  union all
  select monthno,lag(g.y,7) over (partition by 1 order by monthno) as y from ${t1} g
  union all
  select monthno,lag(h.y,8) over (partition by 1 order by monthno) as y from ${t1} h
  union all
  select monthno,lag(i.y,9) over (partition by 1 order by monthno) as y from ${t1} i
  union all
  select monthno,lag(j.y,10) over (partition by 1 order by monthno) as y from ${t1} j
  union all
  select monthno,lag(k.y,11) over (partition by 1 order by monthno) as y from ${t1} k
  union all
  select monthno,lag(l.y,12) over (partition by 1 order by monthno) as y from ${t1} l
  union all
  select monthno,lag(m.y,13) over (partition by 1 order by monthno) as y from ${t1} m
 ) t1;

在“计算M”输入如下代码:

select monthno,avg(y) as m
from ${t1}
where monthno >=14
group by monthno

这两段代码实现了PAI机器学习平台中的移动平均。SQL脚本中的lag函数可以取某字段前第几行的数据,通过13次的union再对monthno聚合取y的平均,就可以计算出y的移动平均。每一段被union的select语句都选择了往前推1,2,…,13期的y,最后通过一个select avg(y) group by monthno语句将其聚和,便可以算出移动平均。Monthno>14是因为计算移动平均需要前13个月的y,所以monthno从1到13的结果都是没有意义的。

右键单击“计算U与Y”,左键单击“从此处开始执行”。
在得到了移动平均后,可以计算该商品的T,C,S,R等指标。

从左侧拖出一个“线性回归”,一个“预测”与2个“SQL脚本”,按如下方式连接并重命名。
在这里插入图片描述
“回归计算T参数”的“选择特征列”选择‘monthno’:
“选择标签列”选择‘m’:
单击“回归计算T参数”,单击“执行该节点”。
待运行结束,在“计算T”的“特征列”选择‘monthno’,“原样输出列”选择‘monthno’与‘m’两个字段:
在这里插入图片描述
在这里插入图片描述

在“计算C,K”输入如下代码:

select a.MONTHNO
,c.u
,a.prediction_result as T
,b.m/a.prediction_result as C
,c.Y/b.M as K
from 
(select * from ${t3}) a
left outer join
(select monthno
,m
from ${t2}) b
on a.monthno = b.monthno
left outer join
(select monthno
,u
,Y
from ${t1}
where monthno >=14) c
on a.monthno = c.monthno

这段代码对3张表的数据进行了计算与汇总。
单击“计算C,K”,单击“查看数据”
在这里插入图片描述
可以看出,T是一个下降的序列,也就是说该产品的销量呈现出了一个下降趋势。
表a取了“计算T”中的参数T,表b取了“计算M”中的移动平均M,根据公式可以用M计算出C与K,表c取了“计算U与Y”中的参数U和Y。至此,已经有了参数U,T,C,接下来根据K来计算S。

在“计算S”输入如下代码:

select monthno_in1y
,avg(K) as S
from
(select monthno
,monthno %13 as monthno_in1y
 ,K
from ${t1}) a
group by monthno_in1y

这段代码根据monthno,计算了每一个monthno是每年内的第几个月,将其命名为monthno_in1y,然后对monthno_in1y聚合求K的平均,便可以得到参数S。
单击“计算T,”单击“从此处开始执行”。
待其运行结束,单击“计算S”,单击“查看数据”
在这里插入图片描述
可以看出,这张表里只有monthno_in1y所对应的S,后面在计算测试集的S时,需要将相应的monthno计算出其对应的monthno_in1y再回到这张表中取出S。

预测时间序列销量

从左侧拖出一个“拆分”,一个“预测”和3个“SQL脚本”,按如下方式连接并重命名:
拆分命名为 测试集
预测 命名为计算测试集T
SQL脚本如图
在这里插入图片描述
在“取归一化参数”输入如下代码:

select monthno
,dq
,max(dq) over(partition by 1) AS max
,min(dq) over(partition by 1) AS min
, 1 as justforjoin
from ${t1}

这段代码计算了dQ的最大值与最小值。根据公式
在这里插入图片描述
要对该序列进行还原,需要的逆变换公式为:
在这里插入图片描述
justforjoin字段只是为了方便后面跟测试集的预测数据进行聚合而设置的,没有其他含义。

单击“取归一化参数”,“执行该节点”
在“测试集”的“参数设置”选择“按阀值拆分”,“拆分列”选择‘monthno’,“阀值”为‘44’。
在这里插入图片描述

一般来说,在周期取为一个月时,短期预测为对一到两个月以后的预测。通常预测的距离越远预测就越不准确。在本实验中,我们选取4个月作为测试集,前两个月可以看作是短期预测,后两个月可以看作中长期预测。
将阀值设为44以后,输出桩1输出的数据为第40、41、42、43个月的销售数据,我们将这四个月的数据选为测试集,来测试模型预测的准确度。

单击“测试集”,“执行该节点”

在“计算测试集T”的“字段设置”中,“特征列”与“原样输出列”均选择‘monthno’。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在“计算与整合测试集T,C,K,S,R”输入如下代码:`

select distinct monthno
,u_test,t_test,s_test,c_test,r_test
,(u_test*t_test*s_test*c_test*r_test) as dq_adj_p
from
(select c.monthno
,a.U as u_test,b.s_test
,avg(a.c) over(partition by 1) AS c_test
,c.t_test,1 as r_test
from
(select monthno
,C,U
,1 as justforjoin
from ${t1}) a
left outer join 
(select monthno
,monthno %13 as monthno_in1y
,prediction_result as t_test
,1 as justforjoin
from ${t3}) c
on a.justforjoin  = c.justforjoin
left outer join
(select monthno_in1y
,s as s_test
from ${t2}
) b
on b.monthno_in1y = c.monthno_in1y) d

这段代码整合了训练集中的参数,并计算了测试集相应的参数。

在“归一化还原时序”输入如下代码:

输入如下代码:
select distinct a.monthno
,a.dq_adj_p
,b.max
,b.min
,a.dq_adj_p*(b.max-b.min)+b.min as dq_p
from 
(select * from ${t1}) a
left outer join 
(select * from ${t2}) b
on a.r_test = b.justforjoin

这段代码根据公式 还原了序列。
单击“计算测试集T”从此处开始执行”。

预测线性回归销量

从左侧拖出一个“预测”,重命名为“线性回归模型销量”按如下方式连接。
在这里插入图片描述
单击“线性回归模型销量”,在右侧字段设置中,“特征列”选择‘flyer’,‘other_events’,’pcnt_price’。
在这里插入图片描述
原样输出列”选择‘monthno’,‘quantity’,‘flyer’,‘other_events’,‘regular’,‘unit_price’,‘pcnt_price’7个字段。
在这里插入图片描述
单击“线性回归模型销量”执行该节点”。

4.计算结果与有效性评估
从左侧拖出一个“SQL脚本”,按如下方式重命名并连接。
在这里插入图片描述
输入如下代码:`

select *
,abs((quantity-quantity_p)/quantity) as error
from
(select a.monthno
,a.prediction_result as quantity_linnermodel
,b.dq_p as quantity_timeseries
,a.prediction_result + b.dq_p as quantity_p
,a.quantity
from (select * from ${t1}) a
left outer join (select * from ${t2}) b
on a. monthno = b.monthno )c

这段代码计算了线性模型预测的销量与时序分解模型预测的销量之和,并计算了模型的误差。
执行该节点,待运行结束后,单击“预测销量”“查看数据”:

单击‘monthno’右侧的小三角,使其按月份排序。
在这里插入图片描述
从模型的预测准确率来看:
第一个月的误差在10%以内,为7.309%,预测的前两个月误差较小,到了第3个月误差较大,说明短期内模型的预测还是有一定效果的,但是无法保证长期预测准确率。由于长期预测准确率的下降,模型重跑的调度周期设为一个月比较好。

调度流程:

回到DataWorks的“数据开发”界面,“业务流程”,”新建业务流程”:
在这里插入图片描述
输入业务流程名称:
在这里插入图片描述

点击“新建”按钮,进入业务流程开发界面,随后从左侧“算法”菜单下,拖出“机器学习(PAI)”节点:
在这里插入图片描述
在这里插入图片描述
点击提交
在这里插入图片描述
双击“时间序列分解预测销量”节点,进入编辑界面,选择机器学习实验“时间序列”,如图:
在这里插入图片描述
点击右边的“调度配置”菜单
在这里插入图片描述
在“调度配置”处可以设置自己所需调度信息:重跑属性(必选)、生效日期、调度周期为“月”、指定时间 (假定每月1日)等信息;
在这里插入图片描述
由于该预测模型的调度实际上需要数据更新之后才有重跑的意义,但是本实验选择的是用CSV上传数据,所以这里实际上只是演示该模型如果需要在数据更新后自动调度的话,可以像上面这样设置。

============================================================================

到这里使用时间序列分解模型预测商品销量就已经完成了。

有什么错误的地方欢迎各位指出来。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值