正负例优化

baseline

hourly train;

观察到 show 没有观察到 click,则按照负样本计算;

观察到 show & click,则按照正样本计算;

正样本回溯4个小时的负样本进行 join;

已经按照负样本进行训练的正样本,按照2个正样本进行补充。

优点:实时性高。但不准确。

缺点:不准确,低估了ctr,且改变了正负样本的分布。

  

负例矫正

大概有4种方法:对feedback delay 直接建模;fake negative weighted; false negative calibration; pu learning

feedback delay 建模

用指数分布去拟合:X(特征),Y (该样本是否已经发生点击), C(该样本最终是否会发生点击)

模型会去估算,针对该样本,最终转化的概率,用来加权样本。如果该样本转化概率很低,会被当成是负样本。

faked negative weighted

对正例进行了 (1+p) 加权,对负样本进行了 (1-p^p) 的加权。结论可由 importance sampling 进行推导。

其中 p = 点击率真值。

fake negative calibration

直接学习 biased distriubtion: 假如收到一个 show 即按照负例训练;收到 click 之后再按照负例计算;

即 m / (m + n)  其中 m 为正例个数;但是真实的分布是:m / n 。所以可以得到 biased, true 之间的关系式。

positive-unlabeled learning

主要思想就是:既然之前作为负样本已经计算了一个梯度。如果这是一个假负样本,那就再下次遇见正例的时候,加上一个梯度反方向。

reference: https://mp.weixin.qq.com/s/_ZJBxkvETBpT_X0prMsT_A

实验结果

1. 都没有提升。

2. 怀疑对负例矫正影响到的比例比较少。对全局影响不大?

push : feed = 1:10 ; push 以一天为时间窗口进行join: 20% > 4 hours,在现有的情况下是被丢弃了。70% 是负例补充的。 10%是可以当下 join 上的。所以受影响的样本量 = 0.1*0.7 = 7%。

3. 原始的 baseline 是给假负例,补充2个正例。而这些方法都是补充1个正例。在 ctr已经被低估的情况下,又被再低估。

4. 【思考】有没有一劳永逸的办法?

之所以用不上 4hour 之外的样本,是因为 join 实时特征是有问题的。工程上,除非把特征也一起打包存客户端?然后消费的时候,连同 label 和 特征一并消费了。那结合方法一,就可以不用无线等下去了。

改变正负例的个数

我们没有用上的正例:非个性化的 push(主要是没有用户侧的实时特征)。

扩充非个性化的push正例

1. 没走 ranker的,其实是一种多样性的补充。

2. 用户画像其实相对稳定,不会根据你几个小时发生猛烈的变化。所以 user 端的特征可以近似用。

动态降采样

提高假负例的 sample 采样。

实验效果:初期效果好,后期涨势不明显。恐怕随着模型见到的参数越来越多,动态采样的高参可能不合适了。

可能引入 teacher 网络更好?

 

原文地址:https://www.cnblogs.com/toonice/p/14926730.html