zoukankan      html  css  js  c++  java
  • 正负例优化

    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 网络更好?

     

  • 相关阅读:
    代码质量与上线压力
    出版业的新商业模式
    为什么程序员的工作效率跟他们的工资不成比例
    电吉他和效果器入手
    2011年的经验教训
    英语中年份的发音
    最后还是使用了sphinxforchinese
    Centos5.7 在SecureCRT里显示中文
    十大堕落表现
    复习一下Java中继承关系的类的初始化顺序
  • 原文地址:https://www.cnblogs.com/toonice/p/14926730.html
Copyright © 2011-2022 走看看