背景
分享一篇Google在做用户LTV预估方面的文章。LTV(life time value) 意为用户生命周期价值,每个人或者公司对价值的定义不一样,传统市场下,LTV的定义为
在传统的经济学、市场学当中,LTV经常会被应用的场景是:在一个超市中去分析来这个超市的人的整体的LTV,即LTV=Average Value of Sale *Number of Transactions * Retention Time Period,然后再做一个宏观的数据统计和预测。(ref: datafun&快手LTV )
在这里,我姑且定义为某种生命周期内所创造的价值,比如GMV,对应到本问题,就等于预测某个人在未来一段时间内的GMV、购买量或者其他你所定义的价值标准,一般来说,这是个回归问题。
那么诸如此类建模问题,最为头疼的就是整个数据分布糅杂了多种分布:
出现这样的分布的原因是:
- 他可能是可新客户 (0价值部分极端膨胀)
- 他可能只来了一次之后很长时间也没动静,或者来了就给你搞个大的,然后销声匿迹(尾部价值存在峰值)
- 有些人来多次,但每次价值很小(指数分布)
综合来看,这些原因导致了LTV预估难以预测,而且大部分模型实验mse作为代价函数,而mse恰巧无法准确的拟合0膨胀问题,且对于极值部分又极端敏感,因此G家这篇文章特意提出了
处理这种混合分布的概率估计算法:zero-inflated lognormal (0膨胀对数正态分布, ZILN)。
此前,这种0值比较多的回归问题也被称作0膨胀泊松分布问题,具体是使用两个模型,一个分类模型预测是否是0, 另一个回归模型预测回归值,但如此分开建模的方式对分类模型的准确率要求比较高。
对数正态分布 (lognormal dist)
我们先了解一下对数正态分布, 简单的理解就是任意随机变量取对数后服从正态分布,则认为这个随机变量服从对数正态分布:
对数正态分布的概率密度函数为:
\[f(x; \mu, \sigma) = \frac{1}{x\sigma \sqrt{2\pi}} e^{-(\ln x - \mu)^2/2\sigma^2}, \quad\quad x>0 \]其中,\(\mu\)和\(\sigma\) 分别是均值和标准差。该pdf的期望为:
\[E(X)=e^{\mu+\sigma^2/2} \]\[VAR(X)=(e^{\sigma^2}-1)e^{2\mu+\sigma^2} \]ZILN Loss
上面说的mse面临的一些问题,诸如无法准确的拟合0值,对高价值用户敏感,然而0膨胀的方式又比较麻烦,需要维护2个模型,容易造成误差累计,由此提出了对数正态参数估计模型
首先对概率密度取负对数简化计算:
这部分的参数会用于拟合指数分布部分,实操中,需要对label取个对数以满足正态分布的hyposis,对于0的部分,则用2分类交叉熵就ok了,那么我们就得到end2end的loss:
\[L_{ZILN}(x; \mu,\sigma)=-Sign_{\{x=0\}} log(1-p)-Sign_{\{x>0\}}(log p - L_{lognormal}(x; \mu,\sigma)) \]\[L_{ZILN}(x; \mu,\sigma)=L_{CrossEntropy}(Sign_{\{x>0\}})+Sign_{\{x>0\}}L_{lognormal}(x; \mu,\sigma) \]其中,交叉熵部分表示是否为0。
如何估计pdf中的三个参数:\(p,\mu 和 \sigma\)
谷歌这里使用nn来预估三个值,其loss定义已推出
实际效果
从累计增益曲线可以看到,ZILN的效果会优一些,该曲线可以理解为用于评价连续值上的排序能力,因为本身LTV的预估不可能精准
具体画法为:
- 先把label将序排列,然后分成多个percent,或者可以理解为等宽buckets,这里是100,每个buckets里存储LTV的总和
- 把预测的LTV也丢到buckets里,算总和
- 得到一条累计分布曲线,曲线下的面积即为GINI系数,用这个系数的大小来表示模型的性能。
从中也可以观察到,大约20%的用户贡献了超80%的LTV,所以label曲线最上面是平的。
标签:CUSTOMER,ZILN,Google,LTV,mu,对数,sigma,正态分布 From: https://www.cnblogs.com/zhouyc/p/16943042.html