推荐系统(一):CTR在小样本中的修正

最近在做app推荐的时候,ctr模型遇到一个常见的badcase问题,模型会把下载曝光都少的app给推出来。因此查找了一些关于ctr修正的文章,来记录一下解决这个问题的一些方法(但是,并不能真的完全解决)。首先看一下ctr的公式:

CTR的计算公式:CTR=下载数 / 曝光数

这个公式中只考虑了比列的关系,没有考虑到样本数的大小。因此在小样本中,这个比例是不准确的,当样本越多,这个比例才会越准确,越反应真实情况。

举个例子,有三个app:

  • A: 下载数 10 曝光数 100
  • B: 下载数 100 曝光数 1000
  • C: 下载数 1000 曝光数 10000

它们三者的ctr都是0.01,但是从置信度来将,是C>B>A的,因为C的样本更多,更能反应真实情况。


这种情况下为了衡量样本数对于ctr置信区间的影响,可以引入“威尔逊区间”这一概念,公式如下:

威尔逊区间

p - 概率,指的是下载的概率,即ctr
n - 样本总数,这里指的是曝光数
z - 在正态分布里,均值 + z * 标准差 会有一定的置信度。例如 z取 1.96,就有 95% 的置信度

但是,这一方法适用于在相同CTR的情况下,通过考虑曝光数来修正CTR,使得样本多的CTR更置信。对于我们遇到的问题,小样本下的下载曝光都少,CTR远远高于平均水平,导致其成为badcase,仍然没有给出解决方法。


目前一种可取的做法就是对下载或者曝光都很少但CTR高的样本进行过滤,直接干掉。但是阈值如何选取是一个问题,只能通过拍脑袋决定。
这种做法对于长尾部分的样本有作用,但是对于下载曝光处于中后段如:(B类样本)并没有起到作用,因此再加入一种做法,就是over sample过采样,对于负样本过采样。仍用上面A,B,C的例子来说明,如果加入1000个负样本,那么:

  • A:10 正 1100 负
  • B:100 正 2000 负
  • C: 1000 正 11000 负

这样经过处理可以发现CTR
A:10/1100=0.009
B:100/2000=0.05
C:1000/11000=0.09

对于大样本CTR基本不变,对于长尾的进行了打压,对于中间段的也进行了一定的修正。

这是样本层面的修正,但是有时候特征维度也会存在上述CTR的问题,举个例子:
如果样本只有两种特征 性别【男/女】和 商品 【nike】,对于性别与商品的交叉特征,男+nike 与 女+nike,如果有1000个男曝光了nike 购买 为100个,那么ctr为10%;10个女的曝光了nike 购买为2个,那么ctr也为20%;如果仅仅只看统计ctr那么就应该将nike推送给女性,这么做肯定是有问题。

这个时候如果按上面的负样本过采样就会出现问题,因为除了男女商品还有别的特征,直接复制样本会对其他特征的ctr造成影响。

一种在LR中值得尝试的做法是在做sgd梯度下降的时候,如果来了该特征维度上的一个负样本时,根据想要负采样的样本数/原本样本数,如100个负女性+nike /(除以) 原本10个负样本 = 10 倍,那么在负样本梯度更新时 乘以 10,将该负样本的影响增大,相当于起到了增加了负样本的作用。


你可能感兴趣的:(推荐系统(一):CTR在小样本中的修正)