特征"/>
机器学习面试:交叉特征
1.困惑之源
半年前第一次做推荐算法,无意中碰到了一个问题,我使用LR模型对用户和商品进行联合打分,其中使用了所谓的交叉特征
,这个问题思考了大半年终于有了一些思路。
问题是这样的,我统计了不同用户在不同类目上的点击率,以此作为所谓的交叉特征,并且将点击率做了一个线上表,当用户请求时,直接查询用户历史所有的类目偏好。其中 u c uc uc表示用户(user)和类目(cate)的交叉特征,这里为点击率,下标表示用户id和类目id
用户 | 数码 | 女装 | 美妆 |
---|---|---|---|
u 1 u_1 u1 | u c 11 uc_{11} uc11 | u c 12 uc_{12} uc12 | u c 13 uc_{13} uc13 |
u 2 u_2 u2 | u c 21 uc_{21} uc21 | u c 22 uc_{22} uc22 | u c 23 uc_{23} uc23 |
u 3 u_3 u3 | u c 31 uc_{31} uc31 | u c 32 uc_{32} uc32 | u c 33 uc_{33} uc33 |
u 4 u_4 u4 | u c 41 uc_{41} uc41 | u c 42 uc_{42} uc42 | u c 43 uc_{43} uc43 |
但是受到了其他同事的质疑,他说交叉特征是确定某个用户和某个类目之后,再去确定的某一个特征,例如在我们针对用户 u 1 u_1 u1推送了类目 c 3 c_3 c3,此时可以确定一个交叉特征 u c 13 uc_{13} uc13,这一个特征才是交叉特征。我觉得非常奇怪,为什么不可以把用户所有类目的偏好放到LR模型中呢?
2.特征处理
我将特征分层了三个部分
- 用户特征,包括用户性别,登陆次数,RFM等
- 商品特征,包括商品是否包邮,商品价格,商品类目等
- 交叉特征,这里主要用户和类目的交叉
为了简单,假设这里用户特征只有性别,商品特征只有类目,交叉特征就是性别和类目,由于都是离散特征,需要做onehot编码
类目 | c 1 c_1 c1 | c 2 c_2 c2 | c 3 c_3 c3 |
---|---|---|---|
数码 | 1 | 0 | 0 |
女装 | 0 | 1 | 0 |
美妆 | 0 | 0 | 1 |
性别 | s 1 s_1 s1 | s 2 s_2 s2 |
---|---|---|
男 | 1 | 0 |
女 | 0 | 1 |
性别x类目 | s 1 c 1 s_1c_1 s1c1 | s 1 c 2 s_1c_2 s1c2 | s 1 c 3 s_1c_3 s1c3 | s 2 c 1 s_2c_1 s2c1 | s 2 c 2 s_2c_2 s2c2 | s 2 c 3 s_2c_3 s2c3 |
---|---|---|---|---|---|---|
男x数码 | 1 | 0 | 0 | 0 | 0 | 0 |
男x女装 | 0 | 1 | 0 | 0 | 0 | 0 |
男x美妆 | 0 | 0 | 1 | 0 | 0 | 0 |
女x数码 | 0 | 0 | 0 | 1 | 0 | 0 |
女x女装 | 0 | 0 | 0 | 0 | 1 | 0 |
女x美妆 | 0 | 0 | 0 | 0 | 0 | 1 |
3. LR模型
我之前最熟悉的是LR模型,可解释性强,有大规模训练库,并且可以快速上线。特征处理好之后就可以直接输入到LR模型之中了
y = σ ( x ) = 1 1 + e − ∑ w i x i y=\sigma(x)=\frac{1}{1+e^{-\sum w_ix_i}} y=σ(x)=1+e−∑wixi1
做一个非常有趣的变换
f ( y ) = l n ( y 1 − y ) = ∑ w i x i f(y)=ln(\frac{y}{1-y})=\sum w_ix_i f(y)=ln(1−yy)=∑wixi
为什么做这个变换呢?我们知道推荐系统的目标是排序,预测概率是为排序服务的,例如我们有两个物品 i 1 , i 2 i_1,i_2 i1,i2,如果有 y 1 > y 2 y_1>y_2 y1>y2,那么给用户推荐商品的时候就是先推 i 1 i_1 i1,然后再推 i 2 i_2 i2,这个没有任何问题。有趣的地方来了,如果 y 1 > y 2 y_1>y_2 y1>y2, f ( y 1 ) f(y_1) f(y1)和 f ( y 2 ) f(y_2) f(y2)的大小关系是什么呢?
f ( y 1 ) − f ( y 2 ) = l n ( y 1 1 − y 1 ) − l n ( y 2 1 − y 2 ) = l n ( y 1 − y 1 y 2 y 2 − y 1 y 2 ) > 0 \begin{aligned} f(y_1)-f(y_2)&=ln(\frac{y_1}{1-y_1})-ln(\frac{y_2}{1-y_2})\\ &=ln(\frac{y_1-y_1y_2}{y_2-y_1y_2})>0 \end{aligned} f(y1)−f(y2)=ln(1−y1y1)−ln(1−y2y2)=ln(y2−y1y2y1−y1y2)>0
所以当 y 1 > y 2 y_1>y_2 y1>y2时,有 f ( y 1 ) > f ( y 2 ) f(y_1)>f(y_2) f(y1)>f(y2),函数变换之后并不会影响大小顺序。这样做有什么好处呢?原本我们需要去计算 σ ( x ) \sigma(x) σ(x),然后去比较概率大小,现在我们直接计算 ∑ w x \sum wx ∑wx后排序就可以了,最重要的是线性函数有更强的可解释性。
之后可以将特征进行分组,例如分为用户特征,商品特征,交叉特征等等,可以写成
∑ w i x i = ∑ w j x j + ∑ w k x k + . . . \sum w_ix_i=\sum w_jx_j+\sum w_kx_k +... ∑wixi=∑wjxj+∑wkxk+...
3.无交叉特征
特征现在有性别和类目,我们先不使用交叉特征直接训练一个LR模型试试。
f u ( i ) = w s 1 ∗ s 1 + w s 2 ∗ s 2 ‾ + w c 1 ∗ c 1 + w c 2 ∗ c 2 + w c 3 ∗ c 3 ‾ = c t r u s e r + c t r i t e m \begin{aligned} f_u(i)&=\underline{w_{s1}*s_1+w_{s2}*s_2} +\underline{{w_{c1}*c_1+w_{c2}*c_2}+w_{c3}*c_3}\\ &= ctr_{user} + ctr_{item} \end{aligned} fu(i)=ws1∗s1+ws2∗s2+wc1∗c1+wc2∗c2+wc3∗c3=ctruser+ctritem
当模型训练完成之后,各个维度的权重就固定下来了。针对不同的用户,相同类目的权重是一样的,没有任何差异性
假如有一个用户 u 1 u_1 u1,有三个待推荐的商品,分别属于三个类目 i 1 : c 1 = 1 , i 2 : c 2 = 1 , i 3 : c 3 = 1 i_1:c_1=1,i_2:c_2=1,i_3:c_3=1 i1:c1=1,i2:c2=1,i3:c3=1。我们首先对用户 u 1 u_1 u1推荐商品,
i ∗ = a r g m a x ( f ( u 1 , i 1 ) , f ( u 1 , i 2 ) , f ( u 1 , i 3 ) ) = a r g m a x ( c t r u 1 + c t r i 1 , c t r u 1 + c t r i 2 , c t r u 1 + c t r i 3 ) = a r g m a x ( w s 1 + w c 1 , w s 1 + w c 2 , w s 1 + w c 3 ) = a r g m a x ( w c 1 , w c 2 , w c 3 ) \begin{aligned} i^*&=argmax(f(u_1,i_1),f(u_1,i_2),f(u_1,i_3))\\ &=argmax(ctr_{u_1}+ctr_{i1},ctr_{u_1}+ctr_{i2},ctr_{u_1}+ctr_{i3})\\ &=argmax(w_{s1}+w_{c1},w_{s1}+w_{c2},w_{s1}+w_{c3})\\ &=argmax(w_{c1},w_{c2},w_{c3}) \end{aligned} i∗=argmax(f(u1,i1),f(u1,i2),f(u1,i3))=argmax(ctru1
更多推荐
机器学习面试:交叉特征
发布评论