前言
在一些特征极度稀疏的情况下,甚至是one-hot编码下,也很难对整个模型起到作用,但如果组合分析,可能会对拟合数据起到作用,但是如何特征组合?组合的依据是什么?本文就来讲解这些。
场景
在电影的推荐场景中,用户的维度特别大,电影的维度也非常大,例如下图:
特征中:
- 前四列表示用户u(one-hot编码,稀疏)
- 五列表示电影i(ont-hot编码,稀疏)
- 五列表示用户u对电影i的打分(归一化特征)
- 一列表示时间(连续特征)
- 五列表示用户u对电影i打分前评价过的最近一部电影(one-hot编码,稀疏)
- 最后一列表示用户对item的评价
这样一个稀疏的特征,我们要估计用户A和电影ST的关系系数 w w w以更好地预测y,如果是简单地考虑特征之间的共现情况来估计 w w w,从已有的训练样本来看,这两者并没有共现,因此学习出来的 w = 0 w=0 w=0。而实际上,A和ST应该是存在某种联系的:
- 从用户角度来看,A和B都看过SW,而B还看过ST,说明A也可能喜欢ST,说明A很有可能也喜欢ST。
- 而通过向量v来表示用户和电影,任意两两之间的交互都会影响v的更新,从前面举的例子就可以看过,A和B看过SW,这样的交互关系就会导致v(ST)的学习更新.
因此通过向量v的学习方式能够更好的挖掘特征间的相互关系,尤其在稀疏条件下。所以我们假设每个特征都有一个隐藏向量
v
v
v,利用隐藏向量来分析两个特征之间的关系,公式:
y
=
w
0
+
∑
i
=
1
w
i
x
j
+
∑
i
=
0
n
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
y=w_0+\sum_{i=1}w_{i}x_j+\sum_{i=0}^{n}\sum_{j=i+1}^{n}<v_i,v_j>x_{i}x_j
y=w0+i=1∑wixj+i=0∑nj=i+1∑n<vi,vj>xixj
后半部分表示组合特征,通过拆解可以将复杂度从
O
(
k
n
2
)
O(kn^2)
O(kn2)降低到
O
(
k
n
)
O(kn)
O(kn),主要参考后面的博文,这里不具体详解,
可以给
<
v
i
,
v
j
>
<v_i,v_j>
<vi,vj>表示点乘,可以初始化
v
i
v_i
vi,然后在损失函数中利用梯度下降法来更新
v
i
v_i
vi。
进阶算法
FFM算法、DeepFM算法等,
参考博客
python机器学习案例系列教程——CTR/CVR中的FM、FFM算法
FM算法解析
FM算法原理分析与实践
FM算法(一):算法理论
DeepFM算法解析及Python实现
FM系列算法解读(FM+FFM+DeepFM)