预估CTR/CVR,业界常用的方法有人工特征工程 + LR(Logistic Regression)、GBDT(Gradient Boosting Decision Tree) + LR,该模型可以 半自动化 地做一些特征组合。FM(Factorization Machine)它可以 全自动化 地做特征组合。FFM(Field-aware Factorization Machine)模型。所有的 CTR 模型,它的核心就是特征组合,是怎么解决特征组合的问题,它的发展路径就按照这个方向发展。本文先介绍FM,然后介绍FM的改进FFM。
FM
基本思想
FM(Factorization Machine)的提出主要是为了解决稀疏数据下的特征组合问题。
下面我们通过一个例子来说明FM模型,根据用户的基本属性,预测用户是否点击了广告,有下面这样的数据(经过One-Hot编码):
age | city=Beijing | city=Shanghai | city=Shengzheng | sex=man | sex=woman | label | |
---|---|---|---|---|---|---|---|
user_1 | 20 | 1 | 0 | 0 | 0 | 1 | 1 |
user_2 | 25 | 0 | 0 | 0 | 1 | 0 | 0 |
由上表的数据可以看出,经过One-Hot编码之后的特征是比较稀疏的。城市和性别特征一共5维,但只有两个维度有非零值。在实际应用中CTR/CVR预测时,用户的性别、职业、教育水平、品类偏好,商品的品类等,经过One-Hot编码转换后都会导致样本数据的稀疏性。特别是商品品类这种类型的特征,如商品的末级品类约有550个,采用One-Hot编码生成550个数值特征,但每个样本的这550个特征,有且仅有一个是有效的(非零),这也说明了One-Hot编码的另一个特点就是导致特征空间大。
假设我们用最简单的线性拟合来预测y值:
y
^
=
w
0
+
∑
i
=
1
n
w
i
x
i
\hat{y}=w_0+\sum_{i=1}^n{w_ix_i}
y^=w0+i=1∑nwixi
上述这个模型的不足之处在于没有考虑到“北京的男性用户”、“上海的女性用户”这种组合特征可能是有用的,即
x
i
,
x
j
x_i,x_j
xi,xj,(
x
i
,
x
j
x_i,x_j
xi,xj都是one-hot特征)同时为1时可能是一个很有用的特征,这种组合特征是
x
i
,
x
j
x_i,x_j
xi,xj和的线性组合所无法表示的。所以,我们必须在模型中引入
x
i
,
x
j
x_i,x_j
xi,xj的组合特征。直接将二者的乘积
x
i
x
j
x_ix_j
xixj作为一个新的特征,即
x
i
x_i
xi 和
x
j
x_j
xj 都非零时,组合特征
x
i
,
x
j
x_i,x_j
xi,xj才有意义。
这种关联特征与label的正向相关性在实际问题中是普遍存在的,如“化妆品”类商品与“女”性,“球类运动配件”的商品与“男”性,“电影票”的商品与“电影”品类偏好等。因此,引入两个特征的组合是非常有意义的。同样道理我们组合任意三个特征、四个特征,随着阶数的提高,样本会显得非常稀疏,而且额外引入的参数呈指数增长。
所以新的模型长这样:
y
^
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
n
∑
j
=
i
+
1
n
w
i
j
x
i
x
j
\hat{y}=w_0+\sum_{i=1}^n{w_ix_i}+\sum_i^n{\sum_{j=i+1}^n{w_{ij}x_ix_j}}
y^=w0+i=1∑nwixi+i∑nj=i+1∑nwijxixj
注:我们穷举所有的i,j组合,若某些
x
i
,
x
j
x_i,x_j
xi,xj的组合不是有用特征,经过大量样本的训练,模型会把那些无用的特征的系数训练为0。
从上式可以看出组合特征的参数一共有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1)个,任意两个参数都是独立的,训练每个参数 w i j w_{ij} wij 需要大量的 x i 、 x j x_i、x_j xi、xj都不为0的样本,如果训练样本不足,容易导致 w i j w_{ij} wij不准确。
我们要在
w
i
j
w_{ij}
wij上做文章,将其表示成另外的形式,对每个特征分量
x
i
x_i
xi,引入辅助量:
v
i
=
(
v
i
1
,
v
i
2
,
…
,
v
i
k
)
T
\mathbf v_i = (v_{i1},v_{i2},\ldots,v_{ik})^T
vi=(vi1,vi2,…,vik)T
辅助量的长度为
k
k
k(k<<n),包含 k 个描述特征的因子。
将
w
i
j
w_{ij}
wij改写为:
w
^
i
j
=
v
i
T
v
j
=
∑
l
=
1
k
v
i
l
v
j
l
\hat w_{ij} = \mathbf v_i^T\mathbf v_j = \sum_{l=1}^k v_{il}v_{jl}
w^ij=viTvj=l=1∑kvilvjl
因此,FM的模型方程为:
y
^
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
n
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
<
v
i
,
v
j
>
=
∑
f
=
1
k
v
i
f
v
j
f
\hat{y}=w_0+\sum_{i=1}^n{w_ix_i}+\sum_i^n{\sum_{j=i+1}^n{<v_i,v_j>x_ix_j}}\\ <v_i,v_j>=\sum_{f=1}^k{v_{if}v_{jf}}
y^=w0+i=1∑nwixi+i∑nj=i+1∑n<vi,vj>xixj<vi,vj>=f=1∑kvifvjf
根据
x
x
x计算
y
^
\hat y
y^的时间复杂度是:
{
n
+
(
n
−
1
)
}
+
{
n
(
n
−
1
)
2
[
k
+
(
k
−
1
)
+
2
]
+
n
(
n
−
1
)
2
−
1
}
+
2
=
O
(
k
n
2
)
\{n+(n-1)\} + \{\frac{n(n-1)}{2}[k+(k-1)+2] + \frac{n(n-1)}{2} -1\}+2=O(kn^2)
{n+(n−1)}+{2n(n−1)[k+(k−1)+2]+2n(n−1)−1}+2=O(kn2)
第一个花括号对应
∑
i
=
1
n
w
i
x
i
\sum_{i=1}^n w_ix_i
∑i=1nwixi的加法和乘法操作数,第二个花括号对应
∑
i
n
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
\sum_i^n{\sum_{j=i+1}^n{<v_i,v_j>x_ix_j}}
∑in∑j=i+1n<vi,vj>xixj的加法乘法。
所有二次项参数 w i j w_{ij} wij 可以组成一个对称阵 W \mathbf W W(对角元素可以设置为正实数)。这个矩阵可以分解为 W = V T V \mathbf{W} = \mathbf{V}^T \mathbf{V} W=VTV,这里的 V \mathbf{V} V是由上面的辅助量 v i \mathbf v_i vi组成的矩阵。这样模型的参数就变成了 V \mathbf{V} V,二次项的参数数量减少为 k n kn kn个,其中 k k k是辅助量的长度, n n n是特征的个数。远少于多项式模型的参数数量。
参数因子化使得 x h x i x_h x_i xhxi的参数和 x j x i x_j x_i xjxi的参数不再是相互独立的,因此我们可以在样本稀疏的情况下相对合理地估计FM的二次项参数,具体来说, x h x i x_hx_i xhxi和 x i , x j x_i,x_j xi,xj的系数分别为 ⟨ v h , v i ⟩ ⟨vh,vi⟩ ⟨vh,vi⟩和 ⟨ v i , v j ⟩ ⟨vi,vj⟩ ⟨vi,vj⟩,它们之间有共同项 v i v_i vi。也就是说,所有包含“ v i v_i vi的非零组合特征”(存在某个 j ≠ i j≠i j=i,使得 x i x j ≠ 0 xixj≠0 xixj=0)的样本都可以用来学习隐向量 v i v_i vi,这很大程度上避免了数据稀疏性造成的影响。
又因为:
∑
i
=
1
n
∑
j
=
i
+
1
n
<
v
i
,
v
j
>
x
i
x
j
=
1
2
(
∑
f
=
1
k
(
∑
i
=
1
n
v
i
f
x
i
)
(
∑
j
=
1
n
v
j
f
x
j
)
−
∑
i
=
1
n
∑
f
=
1
k
v
i
f
v
i
f
x
i
x
i
)
=
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
f
x
i
)
(
∑
j
=
1
n
v
j
f
x
j
)
−
∑
i
=
1
n
v
i
f
2
x
i
2
)
=
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
f
x
i
)
2
−
∑
i
=
1
n
v
i
f
2
x
i
2
)
\sum_{i=1}^n{\sum_{j=i+1}^n{<v_i,v_j>x_ix_j}}\\ = \frac{1}{2}\left(\sum_{f=1}^k{\left(\sum_{i=1}^n{v_{if}x_i}\right)\left(\sum_{j=1}^n{v_{jf}x_j}\right)}-\sum_{i=1}^n{\sum_{f=1}^k{v_{if}v_{if}x_ix_i}}\right)\\ = \frac{1}{2}\sum_{f=1}^k\left(\left(\sum_{i=1}^n{v_{if}x_i}\right)\left(\sum_{j=1}^n{v_{jf}x_j}\right)-\sum_{i=1}^n{v_{if}^2x_i^2}\right)\\ = \frac{1}{2}\sum_{f=1}^k\left(\left(\sum_{i=1}^n{v_{if}x_i}\right)^2-\sum_{i=1}^n{v_{if}^2x_i^2}\right)
i=1∑nj=i+1∑n<vi,vj>xixj=21⎝⎛f=1∑k(i=1∑nvifxi)(j=1∑nvjfxj)−i=1∑nf=1∑kvifvifxixi⎠⎞=21f=1∑k((i=1∑nvifxi)(j=1∑nvjfxj)−i=1∑nvif2xi2)=21f=1∑k⎝⎛(i=1∑nvifxi)2−i=1∑nvif2xi2⎠⎞
注:上式右边展开可得到左边,原理是配方法。
这样根据
x
x
x计算
y
^
\hat y
y^的时间复杂度是
k
{
[
n
+
(
n
−
1
)
+
1
]
+
[
3
n
+
(
n
−
1
)
+
1
]
}
+
(
k
−
1
)
+
1
=
O
(
k
n
)
k\{[n+(n-1)+1]+[3n+(n-1)+1]\}+(k-1)+1=O(kn)
k{[n+(n−1)+1]+[3n+(n−1)+1]}+(k−1)+1=O(kn)
模型学习
引入二次项的FM模型,可以采用不同的损失函数用于解决回归、二元分类等问题,比如可以采用MSE(Mean Square Error)损失函数来求解回归问题,也可以采用Hinge/Cross-Entropy损失来求解分类问题。然后利用随机梯度下降学习模型。
(1)回归问题loss取最小平方误差
l
o
s
s
R
(
y
^
,
y
)
=
(
y
^
−
y
)
2
loss^R(\hat y,y) = (\hat y - y)^2
lossR(y^,y)=(y^−y)2
所以:
∂
l
o
s
s
R
(
y
^
,
y
)
∂
θ
=
2
(
y
^
−
y
)
∂
y
^
∂
θ
\frac{\partial loss^R(\hat y,y)}{\partial \theta} = 2 (\hat y - y)\frac{\partial \hat y }{\partial\theta}
∂θ∂lossR(y^,y)=2(y^−y)∂θ∂y^
(2)二分类问题loss取logit函数
l
o
s
s
C
(
y
^
,
y
)
=
−
ln
σ
(
y
^
y
)
loss^C(\hat y ,y) = -\ln \sigma(\hat y y)
lossC(y^,y)=−lnσ(y^y)
所以:
∂
l
o
s
s
C
(
y
^
,
y
)
∂
θ
=
[
(
σ
(
y
^
y
)
−
1
]
y
∂
y
^
∂
θ
\frac{\partial loss^C(\hat y,y)}{\partial \theta} = [(\sigma(\hat y y) - 1]y \frac{\partial \hat y }{\partial\theta}
∂θ∂lossC(y^,y)=[(σ(y^y)−1]y∂θ∂y^
其中:
∂
∂
θ
y
^
(
x
)
=
{
1
,
if
θ
is
w
0
x
i
,
if
θ
is
w
i
x
i
∑
j
=
1
n
v
j
,
f
x
j
−
v
i
,
f
x
i
2
,
if
θ
is
v
i
,
f
\frac{\partial}{\partial\theta} \hat y (\mathbf{x}) = \left\{\begin{array}{ll} 1, & \text{if}\; \theta\; \text{is}\; w_0 \\ \ x_i, & \text{if}\; \theta\; \text{is}\; w_i \\ \ x_i \sum_{j=1}^n v_{j, f} x_j - v_{i, f} x_i^2, & \text{if}\; \theta\; \text{is}\; v_{i, f} \end{array}\right.
∂θ∂y^(x)=⎩⎨⎧1, xi, xi∑j=1nvj,fxj−vi,fxi2,ifθisw0ifθiswiifθisvi,f
为了避免过拟合,也引入正则化。所以,FM的最优化问题就变成了:
θ
∗
=
arg
min
θ
∑
i
=
1
N
(
l
o
s
s
(
y
^
(
x
i
)
,
y
i
)
+
∑
λ
θ
θ
2
)
\theta ^* = \mathop{\arg\min}_{\theta} \sum_{i=1}^N\left(loss(\hat y(x_i) ,y_i)+ \sum \lambda_\theta \theta^2\right)
θ∗=argminθi=1∑N(loss(y^(xi),yi)+∑λθθ2)
注:
λ
θ
\lambda_\theta
λθ是正则化系数。
FM vs SVM
(1)SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量 v i 、 v j v_i、v_j vi、vj,交叉参数就不是独立的,而是相互影响的。
(2)FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
(3)FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量
FFM
基本思想
FFM(Field-aware Factorization Machine)是FM的升级版模型,通过引入field的概念,FFM把相同性质的特征归于同一个field。以上面的广告分类为例,“sex=man”、“sex = woman”这两个特征都是代表性别的,可以放到同一个field中。即同一个categorical特征经过One-Hot编码生成的数值特征都可以放到同一个field,包括用户性别、职业、品类偏好等。在FFM中,每一维特征 x i x_i xi,针对其它特征的每一种 f i e l d f i field \quad f_i fieldfi,都会学习一个隐向量 v i , f j v_{i,f_j} vi,fj。因此,隐向量不仅与特征相关,也与field相关。也就是说,“sex=man”这个特征与“city”特征和“age”特征进行关联的时候使用不同的隐向量,这与“city”和“age”的内在差异相符,也是FFM中“field-aware”的由来。
假设样本的
n
n
n 个特征属于
f
f
f 个field,那么FFM的二次项有
n
f
nf
nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个,二次项有n个隐向量。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。根据FFM的field敏感特性,可以导出其模型方程:
y
(
x
)
=
w
0
+
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
∑
j
=
i
+
1
n
⟨
v
i
,
f
j
,
v
j
,
f
i
⟩
x
i
x
j
y(\mathbf{x}) = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \langle \mathbf{v}_{i, f_j}, \mathbf{v}_{j, f_i} \rangle x_i x_j
y(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,fj,vj,fi⟩xixj
下面通过例子说明FFM:
user | movie | Genre | Price |
---|---|---|---|
user_1 | 3Idiots | Comedy, Drama | 9.99 |
这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,不用One-Hot编码转换。为了方便说明FFM的样本格式,我们将所有的特征和对应的field映射成整数编号。
Field name | Field index | Feature name | Feature index |
---|---|---|---|
User | 1 | User=YuChin | 1 |
Movie | 2 | Movie=3Idiots | 2 |
Genre | 3 | Genre=Comedy | 3 |
Genre | 3 | Genre=Drama | 4 |
Price | 4 | Price | 5 |
那么,FFM的组合特征有10项:
⟨
v
1
,
2
,
v
2
,
1
⟩
⋅
1
⋅
1
+
⟨
v
1
,
3
,
v
3
,
1
⟩
⋅
1
⋅
1
+
⟨
v
1
,
3
,
v
4
,
1
⟩
⋅
1
⋅
1
+
⟨
v
1
,
4
,
v
5
,
1
⟩
⋅
1
⋅
9.99
+
⟨
v
2
,
3
,
v
3
,
2
⟩
⋅
1
⋅
1
+
⟨
v
2
,
3
,
v
4
,
2
⟩
⋅
1
⋅
1
+
⟨
v
2
,
4
,
v
5
,
2
⟩
⋅
1
⋅
9.99
+
⟨
v
3
,
3
,
v
4
,
3
⟩
⋅
1
⋅
1
+
⟨
v
3
,
4
,
v
5
,
3
⟩
⋅
1
⋅
9.99
+
⟨
v
4
,
4
,
v
5
,
3
⟩
⋅
1
⋅
9.99
\langle \mathbf{v}_{{\color{blue}1}, {\color{red}2}}, \mathbf{v}_{{\color{blue}2}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}1}, {\color{red}3}}, \mathbf{v}_{{\color{blue}3}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}1}, {\color{red}3}}, \mathbf{v}_{{\color{blue}4}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}1}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}} \ {} \\+ \langle \mathbf{v}_{{\color{blue}2}, {\color{red}3}}, \mathbf{v}_{{\color{blue}3}, {\color{red}2}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}2}, {\color{red}3}}, \mathbf{v}_{{\color{blue}4}, {\color{red}2}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}2}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}2}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}} \ {} + \langle \mathbf{v}_{{\color{blue}3}, {\color{red}3}}, \mathbf{v}_{{\color{blue}4}, {\color{red}3}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} \\+ \langle \mathbf{v}_{{\color{blue}3}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}3}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}} \ {} + \langle \mathbf{v}_{{\color{blue}4}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}3}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}}
⟨v1,2,v2,1⟩⋅1⋅1+⟨v1,3,v3,1⟩⋅1⋅1+⟨v1,3,v4,1⟩⋅1⋅1+⟨v1,4,v5,1⟩⋅1⋅9.99 +⟨v2,3,v3,2⟩⋅1⋅1+⟨v2,3,v4,2⟩⋅1⋅1+⟨v2,4,v5,2⟩⋅1⋅9.99 +⟨v3,3,v4,3⟩⋅1⋅1+⟨v3,4,v5,3⟩⋅1⋅9.99 +⟨v4,4,v5,3⟩⋅1⋅9.99
其中,红色是field编号,蓝色是特征编号,绿色是此样本的特征取值。二次项的系数是通过与特征field相关的隐向量点积得到的,二次项参数共有 k n f knf knf 个( f f f是特征filds个数),相比FM参数扩大了F倍。
模型学习
FFM省略了常数项和一次项,模型方程如下:
ϕ
(
w
,
x
)
=
∑
j
1
,
j
2
∈
C
2
⟨
w
j
1
,
f
2
,
w
j
2
,
f
1
⟩
x
j
1
x
j
2
\phi(\mathbf{w}, \mathbf{x}) = \sum_{j_1, j_2 \in \mathcal{C}_2} \langle \mathbf{w}_{j_1, f_2}, \mathbf{w}_{j_2, f_1} \rangle x_{j_1} x_{j_2}
ϕ(w,x)=j1,j2∈C2∑⟨wj1,f2,wj2,f1⟩xj1xj2
其中,
C
2
\mathcal C_2
C2是非零特征的二元组合,
j
1
j_1
j1 是特征,属于field
f
1
f_1
f1,
w
j
1
,
f
2
w_{j_1,f_2}
wj1,f2 是特征
j
1
j_1
j1对field
f
2
f_2
f2的隐向量。此FFM模型采用logistic loss作为损失函数,和L2惩罚项,因此只能用于二元分类问题。
min
w
∑
i
=
1
L
log
(
1
+
exp
{
−
y
i
ϕ
(
w
,
x
i
)
}
)
+
λ
2
∥
w
∥
2
\min_{\mathbf{w}} \sum_{i=1}^L \log \big( 1 + \exp\{ -y_i \phi (\mathbf{w}, \mathbf{x}_i ) \} \big) + \frac{\lambda}{2} \| \mathbf{w} \|^2
wmini=1∑Llog(1+exp{−yiϕ(w,xi)})+2λ∥w∥2
其中,
y
i
∈
−
1
,
1
y_i∈{−1,1}
yi∈−1,1 是第 i 个样本的label,L 是训练样本数量,λ 是惩罚项系数。
接着通过梯度下降法训练得到最优参数。
在训练FFM的过程中,有许多小细节值得特别关注。
第一,样本归一化。
第二,特征归一化。
第三,省略零值特征。
双线性FFM(Bilinear-FFM)
双线性 FFM 主要是为了解决FFM参数增加的问题。核心思想是通过共享参数从而减少参数数量。基本思路如下图:
从上图可知:
v
i
,
v
j
v_i,v_j
vi,vj还是跟 FM 一样,还是用一个 vector 来表达,但是把两个交互的复杂特性放在大家共享参数里面去学,这就是双线性 FFM 的核心思想。如何共享参数W,又分为三种情况:
(1)共享同一个 W W W ,这是参数量最小的一种形式。 W W W的参数量是 k × k k\times k k×k, k k k是特征Embedding的size;
(2)每个field共享一个 W W W ,即每个field各自学各自的 W W W ;
(3)每两个fields对共享一个 W W W ,能更加细化地描述特征组合;
下图展示了FFM和双线性FFM模型的参数变化情况:
FFM应用
CTR和CVR预估模型采用的特征大同小异,主要分三类:
用户相关的特征
年龄、性别、职业、兴趣、品类偏好、浏览/购买品类等基本信息,以及用户近期点击量/购买量/消费额等统计信息
商品相关的特征
商品所属品类、销量、价格、评分、历史CTR/CVR等信息
用户-商品匹配特征
浏览/购买品类匹配、浏览/购买商家匹配、兴趣偏好匹配等
为了使用FFM方法,所有的特征必须转换成“field_id:feat_id:value”格式,field_id代表特征所属field的编号,feat_id是特征编号,value是特征的值。数值型的特征比较容易处理,只需分配单独的field编号,如用户评论得分、商品的历史CTR/CVR等。categorical特征需要经过One-Hot编码成数值型,编码产生的所有特征同属于一个field,而特征的值只能是0或1,如用户的性别、年龄段,商品的品类id等。除此之外,还有第三类特征,如用户浏览/购买品类,有多个品类id且用一个数值衡量用户浏览或购买每个品类商品的数量。这类特征按照categorical特征处理,不同的只是特征的值不是0或1,而是代表用户浏览或购买数量的数值。按前述方法得到field_id之后,再对转换后特征顺序编号,得到feat_id,特征的值也可以按照之前的方法获得。
参考文章: