14

当我们训练一个 ctr(click through rate) 模型时,有时我们需要从历史数据中计算出真正的 ctr,像这样

                 #(点击)
    ctr = ----------------
              #(展示次数)

我们知道,如果展示次数太少,则计算出的 ctr 是不真实的。所以我们总是设置一个阈值来过滤掉足够大的展示次数。

但我们知道,展示次数越高,对 ctr 的信心就越高。然后我的问题是:是否有一种印象归一化统计方法来计算 ctr?

谢谢!

4

3 回答 3

14

您可能需要估计 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)
"""
于 2012-10-25T06:20:02.247 回答
7

如果将其视为二项式参数,则可以进行贝叶斯估计。如果您在 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)。这样,由于样本量有限,您的阈值自然会包含估计的不确定性。

于 2012-10-25T14:05:59.447 回答
0

有很多方法可以计算这个置信区间。威尔逊分数的替代方法是 Clopper-Perrson 区间,我发现它在电子表格中很有用。

上界方程

下界方程

在哪里

  • B()是逆 Beta 分布
  • alpha是置信水平误差(例如,对于 95% 的置信水平,alpha 为 5%)
  • n是样本数(例如印象数)
  • x是成功次数(例如点击次数)

在 Excel 中,公式B()提供了一个实现。BETA.INV

Google 表格中没有 B() 的等效公式,但可以从 JavaScript 统计库改编 Google Apps 脚本自定义函数(例如,在 github 中搜索 jstat)

于 2016-08-25T19:07:14.130 回答