这个问题超有趣,推荐系统里有类似的场景,即只有用户点击浏览购买的正样本,却没有显性负样本,这样该如何学习呢? 我们假设下面几种方案:对于一个用户,用他所有没有过行为的数据作为负样本对于一个用户,从他没有过行为的负样本中均匀采样出一些作为负样本对于一个用户,从他没有过行为的负样本中均匀采样出一些作为负样本, 且保证正负样本比为1:1对于一个用户,从他没有过行为的负样本中均匀采样出一些作为负样本,但采样时,偏重采样那些热门却没有点击的样本。对于第一种方法,缺点太明显,在实际样本中,负样本数量远远超过正样本,正负样本比例太悬殊,效果最差。而第三种方法好于第二种,因为第三种样本比例比较平衡。最有趣的莫过于第四种方案了,在2011年举办的KDD cup的Yahoo!music推荐比赛中,大家发现选取热门却没有行为的样本进行负采样效果最好!因为热门物品大概率曝光过,而用户没有点,说明用户不感兴趣;而冷门物品,用户压根就没见到过,根本谈不上是否感兴趣。一个看似简单的办法,背后却是对用户及数据逻辑深刻的洞察,这才是机器学习最有魅力的地方。
实践
直播推荐ctr预估,时长样本优化:
* 用户点击推荐流,但是没曝光或者很短的时间就退出,可以考虑为真实负样本。如果只考虑曝光和点击样本,则会将一些封面主播推出,ctr虽高,实际观看效果不好。
* 用户的推荐列表中有英雄联盟,dota。用户经常看英雄联盟,没有一次点击 dota 或者 dota 累计观看时长小于k=10分钟。可以考虑删除这些样本,或者采样作为负样本。
* 推荐列表所在的session,如果用户只点击了英雄联盟,可以只考虑英雄联盟类别或者当前session时效下点击的样本为正样本,未点击的为负样本。
互动交友推荐:
用户点击曝光列表多,但是基本没有回应,可以删除这些用户的样本,可能是骗子。
用户有点击曝光列表,但是从未发送过消息。可以删除这些用户的样本,可能不是真实用户。
用户有点击曝光列表,但是发送过消息。则是大概率是真实用户,也需采样用户发送的条目数(骗子用户可能一天发送很多用户),全部作为样本训练问题较大。
参考
[1]. 只有正样本和未标签数据的机器学习怎么做?
[2]. 加权随机抽样算法
[3]. 加权随机采样 (Weighted Random Sampling)