当我们训练一个 ctr(click through rate) 模型时,有时我们需要从历史数据中计算出真正的 ctr,像这样
#(点击) ctr = ---------------- #(展示次数)
我们知道,如果展示次数太少,则计算出的 ctr 是不真实的。所以我们总是设置一个阈值来过滤掉足够大的展示次数。
但我们知道,展示次数越高,对 ctr 的信心就越高。然后我的问题是:是否有一种印象归一化统计方法来计算 ctr?
谢谢!
当我们训练一个 ctr(click through rate) 模型时,有时我们需要从历史数据中计算出真正的 ctr,像这样
#(点击) ctr = ---------------- #(展示次数)
我们知道,如果展示次数太少,则计算出的 ctr 是不真实的。所以我们总是设置一个阈值来过滤掉足够大的展示次数。
但我们知道,展示次数越高,对 ctr 的信心就越高。然后我的问题是:是否有一种印象归一化统计方法来计算 ctr?
谢谢!
您可能需要估计 ctr 的置信区间表示。威尔逊得分区间是一个很好的尝试。
您需要以下统计数据来计算置信度分数:
\hat p
是观察到的 ctr(#clicked 与 #impressions 的分数)n
是总展示次数z
α/2是(1-α/2)
标准正态分布的分位数python中的一个简单实现如下所示,我使用z
(1-α/2) =1.96,对应于95%的置信区间。我在代码末尾附上了 3 个测试结果。
# clicks # impressions # conf interval
2 10 (0.07, 0.45)
20 100 (0.14, 0.27)
200 1000 (0.18, 0.22)
现在您可以设置一些阈值来使用计算的置信区间。
from math import sqrt
def confidence(clicks, impressions):
n = impressions
if n == 0: return 0
z = 1.96 #1.96 -> 95% confidence
phat = float(clicks) / n
denorm = 1. + (z*z/n)
enum1 = phat + z*z/(2*n)
enum2 = z * sqrt(phat*(1-phat)/n + z*z/(4*n*n))
return (enum1-enum2)/denorm, (enum1+enum2)/denorm
def wilson(clicks, impressions):
if impressions == 0:
return 0
else:
return confidence(clicks, impressions)
if __name__ == '__main__':
print wilson(2,10)
print wilson(20,100)
print wilson(200,1000)
"""
--------------------
results:
(0.07048879557839793, 0.4518041980521754)
(0.14384999046998084, 0.27112660859398174)
(0.1805388068716823, 0.22099327100894336)
"""
如果将其视为二项式参数,则可以进行贝叶斯估计。如果您在 ctr 上的先验是均匀的(带有参数 (1,1) 的 Beta 分布),那么您的后验是 Beta(1+#click, 1+#impressions-#click)。如果您想要这个后验的单个汇总统计信息,您的后验平均值是 #click+1 / #impressions+2,但您可能不需要,原因如下:
我不知道您确定 ctr 是否足够高的方法是什么,但假设您对 ctr > 0.9 的所有内容感兴趣。然后,您可以使用 beta 分布的累积密度函数来查看概率质量的比例超过 0.9 阈值(这将只是 1 - cdf 为 0.9)。这样,由于样本量有限,您的阈值自然会包含估计的不确定性。
有很多方法可以计算这个置信区间。威尔逊分数的替代方法是 Clopper-Perrson 区间,我发现它在电子表格中很有用。
在哪里
B()
是逆 Beta 分布alpha
是置信水平误差(例如,对于 95% 的置信水平,alpha 为 5%)n
是样本数(例如印象数)x
是成功次数(例如点击次数)在 Excel 中,公式B()
提供了一个实现。BETA.INV
Google 表格中没有 B() 的等效公式,但可以从 JavaScript 统计库改编 Google Apps 脚本自定义函数(例如,在 github 中搜索 jstat)