为什么需要平滑?
某个物品CTR(click-Through-Rate)定义为“物品被点击的概率”。CTR是某个物品在其他条件保持不变下自身的属性。但是概率我们不好确定,能确定的是频率。根据大数定理,随着实验次数的增加,频率会逐渐稳定到概率附近。所以我们用一般物品被点击的频率
我们当然希望CTR越大越好,由上面的公式我们可知CTR的大小实际上由两部分决定。首先是展示的次数,英文里用了impression,直译为给人留下的印象,我们可以理解为曝光并且被用户看到,是有效的曝光。其次是被点击的次数。如果有一件物品a 曝光了1次,并且被点了,那它的CTR就是100%。而另外一件物品b曝光了1000次,被点击了100次,它的CTR就是10%。那我们能说物品a的CTR比物品b的CTR更高吗?显然不能,一次被曝光并且被点击,这其中包含了很大的不确定性。根据大数定律,在实验次数不断增加下,频率才会稳定在概率附近。显示CTR等于100%这个数据,只是在一次实验中得到,它偏离真实CTR的可能性非常高。
那么怎么能获得更可靠的结论呢?一种显然的想法是提高物品a的曝光,增大实验次数,让频率更接近概率。但是大多数时候曝光不是你想增加,增加就能增加的。
指数平滑
另外一种朴素的想法是我们假定物品的CTR在一定时间内是不变的,我们可以利用历史的数据来修正今天的CTR。今天的CTR实际上CTR的观测值。根据这个思路我们首先想到了指数平滑
可以看出来随着时间的推移,历史的信息在很快的衰减。
为什么利用beta分布得到的结果是
beta分布是在0-1之间
我们假设某件物品的CTR服从参数为
那么每次曝光可以看成从服从
曝光
明确我们的目标是要求在已知曝光
其中B表示Beta函数,可见新的点击率也服从Beta分布,当我们得到
对于参数为
如何计算
假设我们拥有的是时间序列格式的数据,每天点击数独立同分布,所以有如下的概率密度函数,根据极大似然估计的原理。我们使下式取到最大值
上式对
其中
对
import scipy.special as special
def update(clicks,imps,init_alpha,init_beta,epoches,epsilon):
assert len(clicks) == len(imps), print("length not equal")
alpha, beta = init_alpha, init_beta
last_alpha = last_beta = 0
for i in range(epoches):
normalization = sum([special.digamma(imps[i]+alpha+beta) - special.digamma(alpha+beta) for i in range(len(clicks))])
alpha = alpha * (1/normalization) * sum([special.digamma(clicks[i] + alpha)-special.digamma(alpha) for i in range(len(clicks))])
beta = beta * (1/normalization) * sum([special.digamma(imps[i]-clicks[i]+beta)-special.digamma(beta) for i in range(len(clicks))])
if abs(last_alpha - alpha)<epsilon or abs(last_beta-beta)<epsilon:
break
last_alpha = alpha
last_beta = beta
return alpha,beta
写在最后
计算
参考文献
Environmental I S . Click-Through Rate Estimation for Rare Events in Online Advertising[J]. Online Multimedia Advertising Techniques & Technologies, 2011.
如何理解Beta分布和Dirichlet分布?-czxttkl-搜狐博客
博客围绕CTR(点击通过率)展开,指出因概率难确定,常用频率代替,但单次实验得出的CTR有很大不确定性。为获更可靠结论,可增加曝光或利用历史数据修正。介绍了指数平滑法,还阐述了利用Beta分布计算CTR,新点击率也服从Beta分布,并提及计算方法。
732

被折叠的 条评论
为什么被折叠?



