CTR中的特征哈希

在CTR预估中,一种做法是采用人工来做feature engineering,将一些非线性的feature转换为线性的feature,然后喂给LR之类的线性model来做在线学习,在这个过程中,对于一些categorical feature,比如user_id,advertisement_id,直接做one-hot encoding(一般还会对feature做笛卡尔积)会导致维度爆炸,hashing trick通过对feature先做hash之后取模降低维度,缓减这一问题。

具体来说:假设原始特征向量 ,我们希望将他降为 维( << ),定义一个hash function ,一般为了保证内积的无偏,会再定义一个hash function ,最终对于 有:

其实在做feature hashing的时候,很少会直接去写哈希函数,现有的package里面都定好了哈希函数的,可以调的参数基本就是最终的维度 ,一般为了将特征均匀的映射到列上,需要使用2的幂作为参数,然后再看模型评价指标来确定最终的值。

优点:

1.相比较与one-hot encoding,不需要预先维护一个变量表。

2.在线学习方便,在模型训练的时间和空间复杂度上降低。

缺点:

1.hash冲突,一般来说这个影响不会很大,很多实验表明并不太会影响模型的精度。个人觉得这可能是产生冲突的那些值本身就比较“相似”,所以才对精度影响不大。

2.失去了feature的解释性,没有办法从hash之后的向量找到原始的feature。

例如,LZ在脉脉做职言的点击率预估,因为拿到的数据基本都是user_id,item_id等,其中user_id表示用户,item_id表示具体的消息。因为user_id和item_id有很多,用one-hot独热编码方式,会导致维度灾难,那么首先可以将这些id通过哈希方法映射到某一个数值上去即可。但是因为user_id和item_id都会有一些重复的标签,所以需要我们首先分组,例如user_id为1001组,item_id为1002组;那么某一个user_id为50的人,其标签为1001:50;如果某个消息的标签也为50,则将其整理完后的新的标签为:1002:50。有组号的话,就能将不同类别的相同的编号整理成不同。那么最后就可以拿带有组号的新的标签去做哈希,生成新的哈希编码。

你可能感兴趣的:(机器学习)