南京诺唯赞生物科技有限公司完成5.5亿元C轮融资
06-17
0上的实践。简介 项目得分的计算通常用于召回,并与用户兴趣画像结合使用。
计算项目得分的方法可以分为三类: 千人同(最常用):通常是CTR流行度,会基于整个用户而变化,但波动不大。千人:折衷方案,通过用户分组找到有代表性的用户。
千人千面:消耗大量资源,一般不可能。本文围绕“千人”项目评分计算方法简单谈谈贝叶斯平滑在CTR上的实践。
1、以内容分发为例。在计算item评分时,可以有很多维度,比如item的交互流行度、变化率、创建时间、CTR、负面反馈等。
如果以CTR作为召回item的评分依据,我们希望召回一批点击率高、数据相对可信的项目。这时可能会出现以下两个问题:新商品没有曝光点击数据,所以不会有评分。
(当然这也可以通过一些冷启动策略来解决)两个项目,第一个CTR=10/20,第二个CTR=/。此时的CTR分数是完全一样的,但是很明显后者的数据更有信心。
2、思维简单。最简单的想法是,我们可以人为地设置两个值a和b,将CTR转化为:CTR=\frac{click+a}{imp+b}。
然而,这样的改造只能解决问题。 1.问题2的解决方案不太好。
所以我们想,我们可以在这里做一些不那么“暴力”的事情吗?一个更简单的变换是取历史日志的平均点击量和曝光量,但还是不够优雅,而且如果给定的a和b值太大,所有item的分数都会向平均值集中。我们知道,一项是否被点击符合伯努利分布,而伯努利分布中只有一个参数P。
我们可以通过取一些log来计算P,然后得到后验,然后后验可以作为下一次迭代的先验,但这很难计算。 3. beta分布的改进因此,我们希望先验和后验属于同一个分布,但参数不同。
这样我们在实现的时候只需要更新参数就可以了,不需要进行大量的计算。伯努利分布的共轭分布是β分布,因此β分布可以用于贝叶斯平滑,CTR得分可以转化为:CTR=\frac{click+\alpha}{imp+\alpha+\beta}其中α β是通过矩估计得到的,具体为: \alpha=\mu\times [\frac{\mu\times(1-\mu)}{\sigma^{2}}-1 ]\beta=(1-\ mu)\times [\frac{\mu\times(1-\mu)}{\sigma^{2}}-1 ]其中 μ 是平均值,σ 是方差。
4. Beta分布图 Beta分布的横轴和纵轴分别代表随机变量的值和概率密度函数(PDF)的值。横轴表示 Beta 分布中随机变量的值。
取值范围为[0,1],可以理解为某个事件发生的概率,比如CTR。 Beta分布中,横轴的取值范围由Beta分布的参数α和β决定。
纵轴表示随机变量在 Beta 分布中取特定值的概率密度。取值范围为[0,∞),表示横轴上某一点的概率密度。
使用 python 绘图:代码语言:python 代码运行次数:2 Copy Cloud Studio code run import numpy as npfrom scipy.stats import betaimport matplotlib.pyplot as pltab_pairs = [(2.81,21.92), (14.19,.57)]x = np .linspace(0, 1, )[1:-1]对于 ab_pairs 中的 a, b: print(a, b) dist = beta(a, b) y = dist.pdf(x) plt.plot(x, y , label=r'$\alpha=%.1f,\ \beta=%.1f$' % (a, b))# 设置标题 plt.title(u'Beta Distribution')# 设置 x, y轴值范围 plt.xlim(0, 1)plt.ylim(0, 25)plt.legend()plt.savefig("./beta.svg", format="svg")4.1 beta 分布示例图 当 alpha 时beta分布的 和 β参数较小时:表示分布的概率密度函数在中心点较高,但尾部的概率密度函数下降较快。这通常被解释为分布方差较大,即数据相差很大,没有明显的趋势或结论。
因此,当α和β参数很小时,通常意味着我们对数据的先验知识很少,或者数据源不可靠。当β分布的α和β参数较大时:意味着分布的峰值比较尖锐,方差较小,分布趋于对称。
这反映出样本数据对真实参数的估计非常准确,使得数据置信度非常高。 (这里先埋个坑,后面详细解释) 5.工程实践 接下来我们要计算α和β。
此时,我们可以根据粒度想到三种选择:仅对所有项计算一组α和β作为平滑参数(粗粒度)。对于每个类别,计算一组 α 和 β 作为每个类别的平滑参数(折衷)。
对于每个项目,根据平滑参数(细粒度)计算一组 α 和 β 很明显,无论从实现还是贝叶斯平滑的角度来看,方法 3 都是错误的。【我们希望的是】:我们可以用一批“有代表性”的item来找到它们的beta分布,平滑所有item。
同时,如果一个item的曝光点击数据很小,我们认为它的数据不够自信,那么我的先验(α和β)应该起主导作用;如果一个物品的曝光点击数据足够大,我们认为它足够有信心,那么先验(α和β)效应几乎没有用处。因此,可以采用方法1和方法2。
下面还将讨论这两种方法。 5.1 方法1仅计算一组α和β作为所有项目的平滑参数(粗粒度)。
实际中通常取一个周期(比如7天),然后每天根据uid、itemid、traceid进行去重。 ,然后分别计算每个item的CTR,然后根据这些CTR计算当天的方差和均值,根据方差和均值计算每天的α和β,然后求出7个的平均值α和β天。
使用SparkSQL实现,代码如下: 代码语言:sql copy SELECT AVG(alpha) AS avg_alpha, AVG(beta) AS avg_betaFROM( SELECT ftime,mean,variance,mean*(mean*(1-mean) /variance- 1) AS alpha , (1-mean)*(mean*(1-mean)/variance-1) AS beta FROM( SELECT ftime , AVG(ctr) AS 均值 , VARIANCE(ctr) AS 方差 FROM ( SELECT ftime 、 item_id 、 imp 、 clk 、 ctr 来自 mid_tb WHERE imp> ) GROUP BY ftime ) WHERE NOT isnan(variance))WHERE alpha 不为空且 beta 不为空。这里应该注意的是,在计算方差和平均值时,曝光可能会被卡住。
该阈值消除了长尾数据。例如,这里是 WHERE imp>。
如果不消除长尾数据,CTR的方差就会太大,导致矩估计计算出的平滑参数太小,从而导致平滑效果失效。下图反映了卡门槛前的贝塔分布和卡门槛后的贝塔分布: 5.1 卡门槛前后的贝塔分布。
上图可以看出,黄色曲线没有刷卡门槛,并且有很多长尾数据,比如3次曝光、2次点击。 ,点击率=2/3。
结果计算出来的α=0.1、β=2.3基本没有平滑作用。原因是长尾数据的点击率不可信增加了方差。
但实际上不难发现,即使曝光阈值卡在方法一中,计算出来的α和β仍然不是很大,平滑力度仍然有限??。 5.2 方法二:计算一组α和β作为桶分类下每个类别的平滑参数(折衷)。
方法一实现起来比较简单,在线项目部署也比较方便,因为只需要一组α和β。但它也有一定的局限性:不同品类的商品的CTR分布自然会有所不同,而这种差异与产品形态有关。
例如:对于一款主打交友的产品,“交友”类帖子的点击率可能普遍高于“体育”类帖子的点击率。下图展示了产品中不同类别的CTR差异。
横轴为类别,纵轴为CTR: 5.2 不同类别下的CTR(纵轴CTR) 基于上述情况,如果直接使用方法1,计算出的方差仍然较大,导致平滑粒度不够。解决这个问题的一个简单方法是人为放大平滑参数,增强平滑强度,但会改变其原有的分布。
例如,方法一中α=1.7,β=35.9,人为放大4倍,则变为α=6.8,β=.6。 5.3 放大4倍后的β分布的一个更优雅的方法是:由于每个类别CTR的分布差异很大,所以可以针对每个类别分别计算α和β。
一方面可以减少方差,增加平滑强度。另一方面,它也考虑了每个类别本身不同的CTR分布。
然而,这里有一个陷阱(在第 4 章末尾提到)。如果类别(或标签)过多,即划分过于详细,可能会导致每个类别(或标签)下的商品数量较少。
长尾类别出现。这时候如果计算每个类别下的α和β,很可能会发现α和β特别大,因为可能只有一两个数据,而且方差很小,导致β分布认为数据足够有信心,但事实上却不够。
解决这种情况的方法是采用粗粒度的类别体系,保证每个类别下的数据量充足。或者退回并使用 5.1 中的方法 1。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-21
06-18
06-17
06-18
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用