天天看点

【推荐系统】推荐系统中一些常用的技术方法1、威尔逊区间平滑

本文主要总结了一些推荐系统中用来解决实际问题常用的技术方法。

1、威尔逊区间平滑

威尔逊区间平滑可以用来修正item的点击率CTR。

Click-Through-Rate,即点击率,是推荐系统中一项重要的衡量指标。

原始的CTR计算公式:  CTR = 点击数 / 曝光数。这样的计算方式只考虑了相对值,没有考虑绝对值,即没有考虑曝光的数值大小。因为,在曝光很少的情况下,计算出的CTR并不真实可靠,而样本数越大,CTR的比例才越准确,更能反应真实情况。

举个例子,有三个广告:

A:点击数   5     曝光数   10

B:点击数   50     曝光数   100

C:点击数   500     曝光数   1000

这三个广告的CTR 都是0.5 ,但是按照实际表现,从置信的角度分析,应该是C>B>A,因为C的样本数更多,可信度更高。

为了衡量样本数对于CTR信区间的影响,我们引入"威尔逊(Wilson)区间"的概念。Wilson区间的含义就是,就是指在一定置信度下,真实的CTR范围是多少。

具体的公式如下:

【推荐系统】推荐系统中一些常用的技术方法1、威尔逊区间平滑
  • p:ctr
  • n:样本总数,即曝光数
  • z:正态分布里的参数,在正态分布里,均值 + z * 标准差会有一定的置信度。例如z取1.96,就有95%的置信度。

Wilson CTR修正的源码如下:(实现方法大同小异,网上有很多,随便贴两个版本的代码)

import numpy as np

def walson_ctr(num_click, num_pv, z=1.96):
    p = num_click * 1.0 / num_pv
    if p > 0.9:
        return 0.0
    
    n = num_pv
    
    A = p + z**2 / (2*n)
    B = np.sqrt(p * (1-p) / n + z**2 / (4*(n**2)))
    C = z * B
    D = 1 + z**2 / n

    ctr = (A - C) / D
    return ctr
           
double walson_ctr(int num_pv, int num_click) {
    if (num_pv * num_click == 0 || num_pv < num_click) {
        return 0.f;
    }
    double score = 0.f;
    double z = 1.96f;
    int n = num_pv;
    double p = 1.0f * num_click / num_pv;
    score = (p + z*z/(2.f*n) - z*sqrt((p*(1.0f - p) + z*z /(4.f*n))/n)) / (1.f + z*z/n);
    return score;
}
           

利用Wilson CTR修正公式计算出的score分数越高,表明item的表现越好。通过上面的公式计算出来的三个广告的例子的结果:

walson_ctr(5,10):0.2365895936154873

walson_ctr(50,100):0.40382982859014716

walson_ctr(500,1000):0.4690690341793595

在实际的模型训练中,我们一般选择平滑后的CTR作为样本的输入。

继续阅读