推荐系统之---正负样本构造trick

1.说明

  • 在推荐系统的排序阶段,有一个很重要的步骤就是,构造用户-物品的特征向量,这个过程可以说直接决定了模型的优劣情况。正所谓 “数据是模型的上限”

  • 在后续的时间会持续更新一些小trick。

2.Some Tricks

2.1 Feed流场景下构造样本

  • 在Feed流场景下,使用曝光(展示)日志时,应该选择APP的SDK埋点的日志,而不是服务器Web接口返回的日志,因为Web接口返回的日志中的接种是会增加很多无效负样本;举个栗子,Web接口每次返回10条数据,但是APP屏幕最多展示3条数据,剩下的7条数据需要用户在Feed中滑动窗口后,才能算真正的曝光,但是很多用户可能并不会滑动窗口或者滑动幅度比较下,导致剩下的7条数据并未真正的在APP上曝光。针对上述问题,有如下几个解决方案:
    • 针对同一个内容在不同时间对同一个用户曝光多次的情况,这时候训练集中可能出现同一个用户对同一个内容点击与不点击并存的情况,如果多次曝光的间隙非常短,考虑只使用其中的一次曝光数据。
    • 根据YouTube的早期论文中描述,他们为了避免高度活跃用户对loss的影响,在训练集中对每个用户提取相同数量的训练样本。
    • 根据《美团机器学习实战》书中所说,他们在Feed流场景中采用了Skip-Above的方式来提高效果。具体的做法就是,根据用户最后一次点击行为的位置,过滤掉最后一次点击之后的展示,可以人认为用户没有看到。当然可以选择,保留最后一次点击后的少数几个
    • 保留有行为的用户的负样本,其他负样本(没有过对应的正样本),进行随机负采样,实践证明这样做效果要优于只保留有行为的用户的负样本。
    • 与上一个方式对立的,可以考虑去除只有曝光但没有点击操作的用户的样本(也就是说有的用户只有负样本,没有正样本),不过去除的话,那模型就只能够学习到活跃用户或者有意向用户的行为习惯,这就导致线下数据与线上数据分布有偏差,所以需要根据线上的AB-test测试效果来决定最终是否去除。

2.2 训练样本的构造时机

  • 训练样本的构造方法,尽可能的采用线上模型预测样本时刻的特征作为之后训练样本中的数据,而不是使用离线回溯的方式去拼接训练样本中的各个特征,这就要求当线上模型在预测时,需要将喂给模型的特征做一次落地,比如传到kafka,后续再由相应程序进行解析生成之后的的训练样本。

2.3 在线学习策略

  • 收到正样本:可以直接进行训练。
  • 收到负样本(展示了但是没有行为):等待30分钟后按一定比例采样作为负样本进行训练。负样本在这里的含义是只有曝光没有行为,那么负样本的数量可能会很多,如果直接拿去训练是不合理的,所以需要等待一段时间,然后在这个时间段内,保证正负样本的比例再进行训练。
  • 同一个request中,如果收到某样本后面样本的展示或者点击事件,5min后还没有收到该样本的点击事件,则作为负样本进行训练;如果在作为负样本训练之后,在一段时间之后又收到该样本的正例行为,则需要作出补偿。

3.平衡正负样本问题

  • 机器学习的训练数据不是看它分布是否平衡,而是看它是否符合原来的分布。如果符合原来的分布,那么训练误差最小化也就意味着整体分布误差的最小化,也就没必要进行平衡。

3.1什么好的训练集?不平衡的训练集是否一定需要平衡?

  • 如果正负样本不是极端的不平衡,不太会影响模型学习效果。相反修改全量数据的原始分布,改的不好的话,有可能会降低模型的性能。
  • 样本均衡的处理,一般很多机器学习案例数据都会叫做“专家样本”,会融入很多的业务洞察,专家样本做得好,几百个样本的模型,能击败几万甚至几十万样本的模型。
  • 所以什么是好的训练集,没办法给一个准确的定义。那坏数据集相对来说就比较容易归纳了。

3.2 坏数据集

  • 抽样不当的数据:
    • 抽样数量太少,数据量太小不能代表全体样本。或者说正样本太少,就无法体现所有正样本的特性。但是具体的抽样数据量该多少没有一个具体的标准。有的文献说几十个样本就足够了,但是有的文献说需要几万个样本,所以没有统一的说法。但是,统一明确的一点是,抽样的数量一定要尽量的去代表全体数据。
    • 抽样偏差。这个就比较容易理解了,抽样的数量要保证,同时质量也要保证。举个栗子,我们要通过一些穿着特征去或外貌特征判断一个人的性别,这时候如果去艺术学校去抽样,这时候艺术系的男生也会留长发、化妆等,这时候就会与社会整体的男性产生严重的偏差,没有办法表征全部样本。
  • 不满足模型需求的的数据:
    • 有些算法对数据的平衡性非常的敏感,以及对特征分布或者特征分段要求很高。对于这样的模型,就需要注意正负样本比例,否则性能可能显著下降。
  • 不满足业务需求的数据:
    • 在特定的业务场景下,正样本本来就很少,此时训练出来的参数表达能力有限,模型是否会不符合业务的召回率需求。
    • 举个栗子,在信用卡欺诈模型中,对于召回率的要求比较高(不希望漏掉一个欺诈用户),并且预测出来的数据还会经过人工审核,相对的对于准确率要求就低一些。但是在我们的原始数据中,正样本的比例本身就占比非常小了,或者正样本本身就是正太分布部分,但是在预测的时候,连长尾分布的部分也不能放过,(尽量的把所有欺诈用户召回),比如信用卡欺诈里有的超级用户虽然数量小,但是一次违约就是几十万,比几百个普通用户还严重,这种时候是否要用权值设置或者复制正样本的方式,来做识别增强。
    • 像上面的栗子中,就很有必要通过提高正样本的数量,来覆盖所有正样本的情况,并降低负样本的数量,使得正样本特征得到更强的表达。

3.3解决样本不均衡问题的具体方法

3.3.1 采样处理

采样是解决样本不均衡问题的相对简单且常用的方法,包括过采样和欠采样两种
【过采样】

  • 过采样(也叫上采样,over-sampling)方法通过增加分类中少数类样本的数量来实现样本数量的均衡,最直接的方法是简单赋值少数类样本形成多条记录。
  • 这种方法的缺点是如果样本特征少,很可能导致过拟合问题。
  • 改进的过采样方法,通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。
  • 产生新的合成样本的算法有SMOTE算法。

【欠采样】

  • 欠采样(也叫下采样,under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机的丢掉一些多数类样本来减少多数类样本的规模。
  • 缺点是会丢失多数类样本中的一些重要信息。

总体而言,过采样和欠采样更适合大数据分布不均衡的情况,尤其是过采样方法应用更加广泛。

3.3.2 类别权重
  • 通过正负样本的惩罚权重解决样本不均衡的问题的思想是在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量的类别权重高,大样本量的类别权重低),然后进行计算和建模。
  • 使用这中方法时不需要对样本本身做额外处理, 只需要在算法模型的参数中进行相应的设置即可。(调整超参数)
  • 很多算法中都有基于类别参数的调整设置,以sklearn中的SVM为例,通过在class_weight:{dict,'balanced'}中针对不同类别针对不同权重,来手动的指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为:n_samples/(n_classes * np.bincount(y))
  • 如果在算法本身实现的时候有这样的参数可以调整,这样的方法更加简单且有效。
3.3.3 集成方法
  • 组合/集成方法指的是在每次生成训练集是使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集,从而训练处多个模型。最后在应用时,使用组合/集成的方法(比如,投票,加权投票等)产生分类预测结果。
  • 例如,在数据集中的正、负样本分别为100和10000条,比例为1:100,此时可以将负样本随机切分为100份,每份100条数据,然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的训练数据集。如此反复可以得到100个模型。然后继续集成表决。
  • 这种解决问题的思路类似于随机森林,在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小决策树”组合形成“森林”就具有良好的模型预测能力。
  • 如果计算资源充足,并且对于模型的时效性要求不高的话,这是一个不错的选择。
3.3.4 特征选择方法
  • 上述的集中方法都是基于数据行的操作,通过不同的方法来使得不同类别的样本数据行记录均衡,除此以外,还可以考虑使用或辅助与基于猎德特征选择的方法。
  • 一般情况下,样本不均衡也会导致特征分布不均衡(表征正样本的特征肯定和表征负样本的特征不同,否则就无法区分了),但是如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可以通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。
  • 怎么理解上面的意思呢,非常简单,如果某些特征分布极其不均匀,说明这个会造成分类的不稳定,那么我们就需要吧这样的特征剔除,选择哪种具有很好的表征正样本(小类样本)的特征。以便提高模型的性能。

未完待续~~~~

  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值