机器学习(三十三)— 机器学习中如何利用id类特征
参考文献:https://www.zhihu.com/question/34819617
id 类特征 会极大提高模型的个性化能力和实际效果。而且可以对抗热度穿透现象。 假设一个最简单的问题,预估广告的点击率CTR。为了便于讨论,假设你只有一个特征,就是每次展现广告在过去一个时间窗内的历史点击率ctr,现在目标是预测下一次点击的ctr。简单起见,不妨假设系统中只有两条候选广告。 显而易见,预测分数是和ctr正相关的。如果你使用的是离散LR,那么在分段之后,显然ctr越高的分段上权重越大。这个模型实际跑起来就是最简单的“热门广告”的效果。 现在你加入了一个新的特征,叫做设备id(更理想的情况当然是用户id)。那么你会发现,对于不同的用户id,也许能学出来一些权重。但是模型打分的排序应该基本是不变的。那么你会问:那这特征加进来有蛋用?
当然有,假设最极端的情况,整个广告系统只有2个设备,一个设备属于普通用户,一个设备属于一个恶意的刷子(他专门用脚本点击某个广告以使得这条广告有更高几率被浮现)。那么由于普通用户他看到广告后实际点击率是比刷子低的。那么模型就学到了:导致广告更高点击率的原因其实是用户id。那么经过机器学习之后,刷子这个id的权重就高了,而ctr的权重就低了。那么相对来讲,尽管每个人看到的排序是一样的,但是其中刷子的刷分行为效果就被大大降低了。
所以你在这里看到了第一个有趣的现象:直接加入id类特征,尽管并不能实现完全的个性化,但是可以把每个用户的行为模式区分开,从而提高了其他特征的泛化能力。
再进一步地想:每个人对广告的喜好是一样的,这科学吗?那我希望模型对每个人的排序效果都不一样,这样广告系统就更加个性化了呀! 于是你又增加了一个特征,叫做 设备id x 历史ctr。那么因为有了这个组合特征,LR就能学习到组合的信息。他实际的效果,就相当于对每个设备id建立了一个只有一个历史ctr作为特征的LR模型。那么这个模型,想必是比原始的模型效果更好的了。 所以到这里你应该能发现加入id类特征的价值了:
- 可以使得在学习过程中,每个人的信号更合理地影响整体模型,使得模型泛化能力更好
- 可以使得模型能够对每个id有更细粒度的排序能力,使得模型的个性化效果更好。
1. id类特征上的信号是极其稀疏的,所以这意味着我们需要更大量的数据。但是其实这并没有想象中的难,计算广告、推荐系统这种机器学习场景中,单个id上收集的数据其实非常多。但是一定要通过正则的方法来限制以使得id类特征不过拟合。
2. id类特征在预测中的命中率可能并不高,但这其实也不是问题。因为一个特征就是一个体系,一个体系化的特征是通过层次化的特征设计来达到命中率和个性化的综合。比如说 用户id->用户GPS坐标+用户喜好Tag+用户最近行为->用户年龄、用户性别。通过分层的,由最细粒度到最粗粒度的特征搭配来保证特征命中率
3. 组合。单独的id类特征是意义并没有那么高,有意义的是不同层次的交叉组合。这取决于业务理解和特征工程手法。
模型和算法。实际上,LR是适合使用ID类特征的,原因在于LR适合接受超高维度的特征输入。对于XGBoost、DNN,这么高维度的特征进来,在工程和算法上都有挑战。然而其实针对这种超高维度特征灌入Tree、NN模型的方法,并不难想到,就是Embedding。