Fork me on GitHub

阿里健康医药电商销量预测算法方案

以下文章来源于 https://zhuanlan.zhihu.com/p/616096903

导读: 大家好,本次分享题目为阿里健康医药电商领域的销量预测。

主要分三大模块进行介绍:

  1. 医药电商供应链预测的业务背景

  2. 阿里健康的预测算法方案

  3. 细分场景预测探索


分享嘉宾|王朝君 阿里健康 算法工程师

编辑整理|river

出品社区|DataFun


01/医药电商供应链预测的业务背景


首先来介绍一下医药电商供应链预测的相关业务背景。我们这里讲的预测是服务于供应链的,供应链从计划到执行面临的最大挑战,就是各个环节的不确定性。



1. 供应链存在的问题

供应链存在的主要问题是牛鞭效应非常严重。牛鞭效应是指上游的一些波动经过层层传导,到下游会逐级放大,波动越到后端的需求侧的变化幅度会越大。因此,对于供应链预测,我们所要面对的一个问题就是如何最大限度地减小需求波动对这些决策质量的影响。如果能做到这一点,其实就决定了整个供应链的成本、效率和服务水平。

2. 供应链预测

面对需求的不确定性,预测是供应链管理的第一道防线,供应链预测要基于数据,通过算法能够相对准确地去预测未来需求的波动。这样我们就可以提前去准备一些合适的资源,从而实现资源的利用、效率的提高和成本的降低。在这个过程中的核心是预测算法,预测算法是通过大量的数据去刻画历史规律,利用统计、机器学习等一系列算法工具,精准预测出未来的需求量。

3. 供应链预测任务的理解

在整个的供应链路上,涉及到的预测场景很多,我们可以通过指标的粒度乘上时间的粒度乘以空间的粒度来理解预测任务。

**(1)指标的粒度:**就是我们现在预测目标的目标量到底是一个什么值,它具体在业务当中有什么含义。比如在电商的供应链场景当中常见的一个预测标记是 GMV,可能是商品的销量,货品的销量或者仓库的单量等等。

**(2)时间的粒度:**是指预测任务需要预测的未来时长到底是多久。比如在有的场景中,我们需要提供较长时间的预测。像零售公司会做一些长期的经营计划制定,可能就会涉及到一年或者一个季度。这种属于长期的预测任务。服务与补货,可能会需要提供月度的,或者两周维度的,这种属于中短期的预测任务。还有一些需求度更高的场景,像仓库单量的预测,需要支持排班人员的排班,支持资源调配,可能是天维度,甚至可能是实时粒度的。

**(3)空间粒度:**确定了一个标的之后,可以在不同的层级下去划分要做的预测场景。比如 GMV,既可以是店铺的,又可以是行业的,也可以是各个类目的,甚至最后下钻到最细粒度。商品的销量,既可以是全国粒度,又可以是下钻到某一个省、某一个市的销量单量。

我们还需要关注一个问题,就是从预测场景出发,预测的结果到底是被谁使用。这决定了预测模型的倾向性。比如如果下游是一些优化的决策算法,那么预测算法会更注重准确度、稳定性和实时性;如果下游是为业务同学服务,那么更敏感的会是预测结果的白盒化,以及对预测结果的可解释性。

整体上,我们的任务可以简单抽象成,回溯一段时间的历史数据,在某一个时刻上要预测未来某一个时间长度内一个目标值的量。这也就是时序预测任务。

--

02/阿里健康的预测算法方案


1. 时序预测任务技术演进



时序预测任务有三大类时序预测算法。

**(1)时序统计方法:**该类方法具有稳定性高以及易理解的特点。缺点是准确度低,单序列执行。严重依赖后处理的规则,同时,其技术局限表现在无法引入协变量,无法表征交叉影响,难以拟合脉冲性波动。

**(2)特征工程 + 机器学习模型:**相比于前一种方法,它不是直接用历史的情况来推演未来,而是在大量历史时间切片中找到预测标的和各种影响因子的一个相对稳定的关系,并把这个关系推演到未来。这种算法准确性较高,执行效率高,但牺牲了一定的稳定性和可解释性。并且需要手工调参,依赖人工经验/业务理解和数据敏感度。其技术局限在时序关系表征弱,无法表征类别编码,模型改动空间小。

**(3)深度学习时序模型:**在图像、NLP 和搜索推荐这三个应用领域可以取得比较好的结果,分别对应的网络结构是 CNN、RNN 和 Attention。准确性高、可调整性高。但在实际工作中我们发现,这类模型在迁移到时序预测场景后,并没有展现出准确性的优势,同时稳定性降低了。其原因在于,数据规模的限制。相对久远的历史数据所蕴含的信息对当前的预测是否有帮助值得怀疑。其技术局限在时序关系表征弱,无法表征类别编码,模型改动空间小。

2. 阿里健康电商销量预测算法方案

接下来,介绍阿里健康电商业务场景下的一些销量预测的算法方案。整体上我们会建立一个从基础数据到数据处理到特征工程模型构建和预测的一个 Pipeline。基于 Pipeline,建立模型迭代机制。

具体 Pipeline 组成有:基础数据、数据处理、特征工程、模型构建和预测调整。



**(1)基础数据:**从基础数据来说,主要有出库数据、订单数据、商品属性、价格信息、营销活动、渠道流量、天气数据等。

**(2)数据处理:**这里主要是对数据做一些特征处理,比如销量平滑、订单拆解、属性规范化、价格校验、日期对齐和异常值处理。

3)特征工程: 该部分主要是对数据做一些特征工程的工作。主要分 4 个模块特征:销量特征、商品特征、类目特征和营销特征。其中,销量特征 主要涉及异常检测、缺失值处理、数据平滑和统计指标。商品特征 主要涉及商品状态、上下架时间、商品各类价格和属性及品牌特征。类目特征 主要涉及类目商品/销量数及其占比,类目相关统计指标以及类目与商品的交叉特征。营销特征主要涉及促销类型及活动价格、促销时间及进度、促销力度及参与度、以及渠道相关特征抽取。

**(4)模型构建:**该部分主要从业务出发,考虑实际场景,考虑业务形态和商品形态两大场景。从业务角度出发,日常预测和大促盘货-预热期预测。从商品角度来看,常规品、长尾品、新品和季节品。从模型侧来说,第一大类就是之前提到的常规时序模型,第二大类是机器学习模型,第三大类是深度学习模型,比如依据业务特点,构建 DeepAR 模型等。构建模型之后,预测模式有三种:点估计、区间预测和概率预测。对于该模型的好坏,可以通过 WMAPE、MIN/MAX 准确度、偏差归因等方式来进行衡量。

**(5)预测调整:**主要有近期短期趋势捕获、预测值校验、渠道流量趋势捕获、长期大促后预测值调整。

接下来我们对时序变点估计进行详细说明。

3. 时序变点检测



比如,左上图,该场景是指如果某一个商品新品上架,但是突然给了一些营销活动或者优惠,其生命周期发生了一些变化。蓝色的部分和红色的部分,属于不同的数据分布空间。如果在预测算法中,不做这样的一个识别和检测,直接把所有数据都拿过来用,对于预测模型来说,可能是有偏的。具体该如何解决这个问题呢?

我们的解法是,模型训练阶段,将序列在变点处切割,当作不同的序列构造样本;预测阶段,取原序列最近的变点作为起始点,构造预测特征。具体来说,回溯历史序列,看这个序列本身在某些时刻有哪些变点,变点的判定是在这一时刻前后序列的统计特性发生了比较大的变化。然后把序列做切割,把同质化的序列聚合到一起,对同质化的序列做特征抽取或者特征工程,会得到更好的效果。

基于此思路,提出**变点检测方案。**该方案是指在一段序列 s 上,观察 t 时刻相邻的两个子序列之间的统计特性 (均值/方差/相关性/频谱密度...),如果变化很大则判定 t 为序列 s 的一个变点。这里我们需要注意三个问题:损失函数、搜索方法和约束条件。

**(1)损失函数:**参数方法(e.g.极大似然估计)、非参方法(e.g.基于排序);

**(2)搜索方法:**最优搜索(e.g. Pelt)、近似搜索(e.g. 滑动窗口);

**(3)约束条件:**变点个数指定、变点个数不定(e.g. L1正则)。

我们在做回归模型的时候,通常会遇到数据不平衡问题。该不平衡问题是指销量数据具有明显的偏斜分布,导致基于 L1-norm (Laplace 噪声假设)或 L2-norm(Gaussian 噪声假设) 做损失函数做训练,得到的回归模型预测有偏。接下来,对该问题进行介绍。

4. 不平衡数据的回归模型



这一不平衡问题的处理方式分为基于数据和基于模型两种方案。

**(1)基于数据:**Log 变换、Box-cox 变换、标签分布平滑 LDS;

**(2)基于模型:**Poisson 回归、Tweedie 回归、特征分布平滑 FDS。

重点介绍以下三种方法。

**(1)Tweedie 回归:**Tweedie 分布是一种 Poisson 分布和 Gamma 分布的复合分布,其特点是会以一定概率生成一些值为 0 的样本,这正符合电商销量的场景,我们可以在回归模型中把 Tweedie Loss 作为损失函数来做训练。

**(2)LDS:**根据标签的数据分布,利用非线性核函数对连续标签做一维卷积,进而得到对应的训练样本权重,再训练模型。

**(3)FDS:**类比标签分布平滑,在特征空间用对称核函数来平滑特征均值和协方差的分布,在最后插入特征校准层。每个 Epoch 动量更新,稳定训练。

5. 基于时序聚类的多模型融合



对于不同的场景会有不同的适配模型,我们希望设计一套多模型融合的框架,对于不同形态的时间序列,把各类模型融合。其中要解决的问题是基于什么方式来做时间序列的聚类,在类中怎么选择模型。

具体解决方案是对时间序列做检测 & 切割,构造时序特征用于无监督聚类。针对聚类簇维度回测预测残差,并以此做多模型选择和 stacking 融合。整体流程如上图右侧所示。

--

03/细分场景预测探索


接下来,对季节性预测和 Seq2Seq 预测两个模块进行讲解。

1. 季节性预测

部分药品存在比较明显的季节特征,比如藿香正气水只是在夏天卖的比较多,而一些小儿感冒相关的药品则是在冬天卖的比较多。我们希望在应季和淡季前能够提前捕捉到销量的变化,从而降低缺货和高周转的风险。



理想的季节性是周期性明显、周期长度稳定、序列连续、数据噪声少。但实际上季节性是周期模式复杂、周期长度未知、序列存在缺失、脉冲噪声多。解决这一问题的核心思路有 3 点:

**(1)判断序列是否存在周期性:**主要通过人工经验(基于商品属性和关键词)、时域分析(历史销量的月销占比)和时频结合(离散傅立叶变换 + 滞后自相关系数)

**(2)检测序列中的周期长度:**时频变换 + 自相关函数的检验,减少误召回,得到检测的周期长度。

**(3)构建季节性预测模型:**STL 分解和引入协变量序列(e.g. 天气温度),转换到打平时序的思路。

2. Seq2Seq 长时序预测

在一些场景中,需要提供一段较长时间的预测。



长时序预测面临的问题主要有:

(1)观测数据足够多时,真实数据分布和模型假设分布之间的差异开始变得更加明显。

(2)观测样本量增加,模型参数的优化变得更加耗时。

(3)预测误差会随着预测时长的增加而逐渐累积。

该问题的解决方案有三种:

**(1)Seq2Seq+Attention:**利用 LSTM 捕捉长短期时序特征,在 Encoder 的时间步维度应用注意力机制,对历史销量序列分配权重系数。

**(2)Informer:**通过概率自注意机制(复杂度 O(nlogn)) 将级联层输入减半,突出主导注意,有效处理极长输入。在推理上,通过生成式解码器大大提高了推理速度。

**(3)MedFac:**团队自研模型。使用 LSTM 去捕捉商品的长周期特性,使用 CNN 提取近期特征;在 CNN 之后加入 SENet,对其特征维度进行对应的 Attention,用以对近期的特征进行相关评分;最后对 Seq2Seq 和 CNN 的信息进行融合。

以上就是分享的全部内容,谢谢大家。


分享嘉宾



本文地址:https://www.6aiq.com/article/1679486707453
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出