反事实预测应该是一个非常有意思的话题,笔者也是由一篇盒马的文章出发,对这个模块先行进行简答的学习。主要参考:
KDD2021论文推荐:盒马-融合反事实预测与MDP模型的清滞销定价算法
盒马这篇论文的地址:
https://arxiv.org/pdf/2105.08313.pdf
这个团队另外一篇也很给力,是非常通用的营销预测框架类,很给力了:
关联文章:
因果推断笔记——DML :Double Machine Learning案例学习(十六)
来看来自zhangyuguo的对该篇的解读: Markdowns-in-E-Commerce-Fresh-Retail-A-Counterfactual-Prediction-and-Multi-Period-Optimization-Approach
这篇文章中了KDD2021,是做阿里盒马生鲜的折扣定价问题。
我个人很早之前也关注过电商商品定价的问题,之前看过比如说rue lala、一号店、zara的一些动态定价的方法,心里有些比较模糊的想法,当时想的大概是用choice-model来刻画商品互补替代效应的同时,加入价格的影响,然后在某个周期内求解最优化模型。由于种种原因,当时并没有深入思考算法细节以及针对实际问题进行实践,这类问题主要有三个比较棘手的问题:
这篇文章有很多细节&落地的工作,本文的几个主要贡献:
在生鲜零售的场景,商品的新鲜程度是消费者最关心的问题,很多有保质期的商品,比如说蔬菜、肉类、鸡蛋、面包,都是只有有限的销售周期,为了提供新鲜、高质量的商品,控制库存就变得十分重要,如果一个商品在过期之前还没有卖完,那么零售商就会有损失,生鲜零售商往往会采用促销的手段来最大化总利润,但却很难知道最优的价格折扣是什么。
本文中,我们考虑有两种渠道销售商品的生鲜零售商,其中一个是正常价格销售,另一个渠道是折扣商品,其中消费者可以在购满一定销售额的基础上,以一定折扣购买商品。
反事实预测问题的目标是在干预d_i 和条件X=x_i 下预估需求/销量
的期望\mathbb{E}[Y_i|do(d_i),x_i] ,此处我们假设满足unconfoundness假设。
因为历史上一个商品很少有多种折扣的数据,所以我们无法拟合单个商品的价格需求函数,为了解决这个问题,我们使用数据聚合的方式,我们把所有商品用类目信息进行聚合,然后联合学习多个商品的价格弹性。
我们假设模型结构为\mathbb{E}\big[\ln(Y_i/Y_i^\text{nor})\big] =g(d_i;L_i,\theta) + h(d_i^\text{o},x_i) - g(d_i^\text{o};L_i,\theta)
其中:
为了顾及价格弹性,我们用所有样本最小化均方误差来拟合模型,在现实电商场景中,一个更好的方式是在线实时更新参数:\underset{\theta,c}{\min} \sum_{i=1}^N\sum_{j=1}^t\tau^{t-j} \|\ln\frac{Y_{i,j}}{Y_{i,j}^\text{nor}} - \theta^\mathsf{T}\hat{L}_i \ln d_{i,j} - c\|^2_2 +\lambda\|\theta\|^2_2 其中\lambda>0 是正则系数,0<\tau\leq1 为忘记因子,为了避免较遥远历史数据的影响。
最终的预测模型为\ln Y_{i,t}(d_i)=\hat{\theta}_t^\mathsf{T}L_i (\ln d_i -\ln d_{i,t}^\mathsf{o}) + \ln Y_{i,t}^\mathsf{o} 此处只是建模了商品的价格弹性,忽略了商品之间的互补替代效应。
商品价格为p_0 ,这个价格是常规渠道的销售价格,且价格固定,用d_t 表示商品在周期t 时的折扣,对应的价格为p_t=p_0d_t ,我们对于常规渠道的销量预测为Z_{j,t},\forall j,t ,反事实的销量预测为Y_{jt}(d_t) ,同时考虑到最后浪费的损失,优化问题为:
其中w_j 是浪费损失的权重,[\cdot]^+ 为非负运算符,lb_{jt} 和ub_{jt} 是折扣最大和最小的上下限制,因为Z_{jt} 和B_j 是独立于决策变量的,所以可以简化上述问题为:
对于上面这个问题,我们并不准备直接求解,考虑到可以打的折扣是是有限的,我们将这个问题转化成离散优化问题。虽然模型已经给出了Y_{jt}(d_t) 和Z_{jt} 的预估,但是仍会有随机的误差,所以我们需要考虑上述问题的不确定性,我们用MDP来建模整个决策过程。
定义每个门店j 在常规渠道和折扣渠道的真实销量为a^y_{jt} 和a^z_{jt} ,用s_{jt} 表示商品t 时刻在门店j 的库存:
其中s_{jt} 是个单调递减的序列,候选折扣集合\mathcal{D}=\{d^1, \cdots,d^M\} 。
为了建模销量的不确定性,我们从历史数据中发现,大部分情况下销量服从泊松分布,期望参数为Y_{jt}(d_t) 和Z_{jt} (此处假设Y_{jt}(d_t) 和Z_{jt} 是a^y_{jt} 和a^z_{jt} 的无偏估计)
定义a_{jt}=a^y_{jt}+a^z_{jt} ,销量不会高于库存,所以我们定义状态转移矩阵
期望状态转移后的奖励为R(s_{j,t},d_t,s_{j,t+1})=(p_0d_t,+w_j)[s_{j,t}-s_{j,t+1}-Z_{jt}]^+ 所以多阶段的优化问题变成一个选择策略\pi(\cdot) 来最大化累计奖励的问题\sum_{j\in\mathcal{J}}\sum_{t=1}^{T_j}R(s_{j,t},d_t,s_{j,t+1}), d_t=\pi(s_t)
为了求解这个MDP的问题,我们提出了一种两阶段的算法,分开反向求解和联合优化两步:
对于每个门店,单独进行更新
联合优化,对于所有店铺联合优化,并在单个阶段求最优d_1^*=\underset{d_t\in\mathcal{D}}{\arg\max}\sum_{j\in\mathcal{J}} Q(s_{j,1}=B_j,_t) 所以我们可以得到最优定价p_1^*=p_0d_1^* ,因为这个算法每天会重新更新训练,所以只需要每天重新计算第一阶段的最优值。
文中对比了不同模型:Xgb、DeepIV和提出的结构化的回归模型:
论文内容部分讲完了,总体是一篇很踏实的文章,一个业务有接近20%的GMV提升,可以说是非常“有效”的解决了问题,但这篇文章仍然有些缺点,或者说没有放在论文里的点,再回顾一下最开始的三个问题:
KDD2021论文推荐:盒马-融合反事实预测与MDP模型的清滞销定价算法
研究问题:如何动态决策滞销商品(在保质期内无法以原价销售完)的折扣力度以获取最大收益?滞销定价策略通过在商品生命周期的不同阶段动态调整折扣额以实现库存成本的降低和 GMV 收益的提升。滞销品定价所面临的核心问题在于商品历史价格点稀疏且噪声较大导致难以确定合适的价格。
产品形态:盒马App的商品销售页面有2种,一种是商品原价的正常频道页,一种是满x元换购折扣商品的降价频道页。
整体思路/框架:将滞销商品定价流程拆解为两步,
技术亮点:
①在因果建模中使用参数模型解决技术挑战1中的价格稀疏性;
②在优化过程中考虑需求的不确定性,通过不确定建模解决技术挑战2中的预估不准确的问题;
总体ML建模思路:基础销量预估模型+价格弹性模型
为了解决商品历史价格稀疏(1-2个)的问题,会在因果模型中引入聚合类信息-商品品类信息Li(品类层级越高,sku个数越多,sku间的差异也越大),同时,借鉴文献31中的边际因果结构模型,提出一个半参数结构模型来学习单个商品的因果效应。公式中,Yi-nor 作为归一化因子,Yi/Yi-nor 表示折扣价和原价下的销量比值,采用比值而不是绝对值的原因是,比值能够规避“不同商品销量绝对值差异过大”的问题。
其中, ( ; , )是商品i的参数化价格弹性模型,增加可解释性,参数θ表示价格弹性向量,θ为所有商品所共享;
基础销量预估模型:
ℎ( - ) 是无参数的ML预估模型,用于预估在近期平均折扣力度di下销量的对数比,模型选择不限,本文实验中选择的是XGB;
价格弹性模型:
构建一个双对数结构嵌套平均模型来预估用户对指定商品的平均价格敏感度。该模型会同时学习1~3级品类各自的弹性参数。
反事实预估:
将公式(3)和(4)带入(1)可以得到反事实销量预估公式,将0,1的折扣值带入即可,如下:
\mathbb{E}\big[\ln(Y_i/Y_i^\text{nor})\big] =g(d_i;L_i,\theta) + h(d_i^\text{o},x_i) - g(d_i^\text{o};L_i,\theta) 函数h(d_i^\text{o},x_i) 为非参数预测模型,用于预测某个商品平均折扣h(d_i^\text{o},x_i) 下的销量, 如果h(d_i^\text{o},x_i) ,那么\mathbb{E}\big[\ln(Y_i/Y_i^\text{nor})\big|d_i^\text{o}]=h(d_i^\text{o},x_i) 如果d_i !=d_i^\text{o} ,那么g(d_i) -g(d_i^\text{o}) 代表的是,特别折扣下的增量(新折扣增量),所以通俗来说就是:
\ln(Y_i/Y_{i,T+1}^\text{nor})=h(d_i^\text{o},x_{i,T+1}),i=1,...,N
论文提到了,为什么不能直接使用 E\big[\ln Y_i|do(d_i)\big]=h(d_i,x_i) ,把treatment = d_i
当做一个特征和混杂因子x_i 一起放入模型预测销量\ln Y_i ?
贴一下原话,其实就是treatment=折扣 和 混杂因子也有强关联关系,所以除非你更新了折扣,也把关联的混杂因子也关联上,不然估计有偏。
Because transactional features, such as historical sales, are affected by the historical discount. If we do an intervention on the discount 𝑑𝑖 , i.e. varying the discount, we also need to change the relevant historical features 𝒙𝑖(𝑑𝑖) which is impossible.
同时为什么有\ln(Y_i/Y_i^\text{nor}) 是一种标准化的手法,消除不同商品之间销量的差异;
这里只用了d_i^\text{o} 平均折扣,来计算平均折扣下的销量。
上面有提到,不同折扣会带动一系列混杂因子的改变以及销量的改变,这里借用价格弹性
来还原,不同折扣下的销量变化情况。
其来自双log结构的nested模型
g(d_i;L_i,\theta)=\mathbb{E}\big[\ln(Y_i/Y_i^\text{nor})\big]=(\theta_1+\theta_2^\mathsf{T}L_i)\ln d_i +c
将其转化为指数形态:Y_i=Y_i^\text{nor} e^c d_i^{\theta_1 +\theta_2^\mathsf{T}L_i},\forall i 其中,来解读一下这个式子,总销量 = 原价销量 * 销量变化量(价格弹性-折扣):
为由三级one-hot变量组成,它是折扣的effect modifiers
,而这个修饰器不仅由当个商品,还由所有category属性共同决定,算是一种global effect modifiers
就是价格弹性,所以每个独立SKU的价格弹性是由类别的价格弹性组成的。
假设我们获得了从时间1到时间𝑡-1
的观测数据,我们的目的:
预测不同折扣的产品𝑖 在时间𝑡时的反事实需求量。
将上面提到的核心式子2+3 带入式子1 式子2:\ln(Y_i/Y_{i,T+1}^\text{nor})=h(d_i^\text{o},x_{i,T+1}),i=1,...,N 式子3: g(d_i;L_i,\theta)=\mathbb{E}\big[\ln(Y_i/Y_i^\text{nor})\big]=(\theta_1+\theta_2^\mathsf{T}L_i)\ln d_i +c 式子3的变形:Y_i=Y_i^\text{nor} e^c d_i^{\theta_1 +\theta_2^\mathsf{T}L_i},\forall i . 带入半参模型式子1:
$\mathbb{E}\big[\ln(Y_i/Y_i^\text{nor})\big] =g(d_i;L_i,\theta) + h(d_i^\text{o},x_i) - g(d_i^\text{o};L_i,\theta) $
可以得到最终的反事实需求预测模型为\ln Y_{i,t}(d_i)=\hat{\theta}_t^\mathsf{T}L_i (\ln d_i -\ln d_{i,t}^\mathsf{o}) + \ln Y_{i,t}^\mathsf{o} 这里解决了【2.2 核心式子2:销量预测模块】提到的问题,可以自由改变折扣来进行销量预测。 不过这个式子,可以看做某商品:
待续的是MDP部分,后面会单独沿着动态规划做学习,先放一下
基于反事实预估得到的销量不可避免存在一定的不确定性(ML中存在偏差和方差),为了提高优化算法的鲁棒性,需要将需求的不确定性考虑进去。基于MDP提出了一种多阶段联合价格优化方法。
来解读一下:
对于上面这个问题,我们并不准备直接求解,考虑到可以打的折扣是是有限的,我们将这个问题转化成离散优化问题。
虽然模型已经给出了Y_{jt}(d_t) 和Z_{jt} 的预估,但是仍会有随机的误差,所以我们需要考虑上述问题的不确定性,我们用MDP来建模整个决策过程。
笔者来理解一下,目标函数的含义:
到此笔者就没仔细往后看,因为涉及到MDP,可能是后面的功能,
看到这先给自己留下几个之前的问题:
看实验对比,主要看他实操的时候有什么训练技巧
跟预测任务一样,评估模型的指标:RMAE,以当天的实际折扣来预测第二天降价渠道的销售
本模型是半参数模型,上图是顺着使用数据的比例增加三个模型的RMAE,
对比方案1-XGB:将折扣Treatment作为特征放入模型中预估销量值,但是这个模型本身存在混杂因子,估计是有偏的;
对比方案2-DeepIV:将三级品类的平均价格(treatment)作为工具变量,建模深度学习模型刻画折扣和销量的关系,其中折扣Treatment建模成高斯分布;
几个评价:
该文章有提到:
反事实预测和优化框架是相当通用的,可以应用于电子商务平台的其他场景:
在上述三个例子中,处理分别为价格、优惠券和补偿支付,结果分别为产品销售、用户转化率和满意度,优化目标分别为总体利润、ROI和满意度。为了解决这些问题,我们首先基于半参数模型建立了治疗与结果之间的因果关系,然后利用预算或库存约束对目标进行优化。值得注意的是,我们在之前的工作中已经为第二种情况提出了一个营销预算分配框架
在营销场景中,该团队之前的一篇文章我也学习过,都是非常通用的营销预测框架类,很给力了:
特征工程,四大类: