概述
数据为王的当下,特征高效处理的重要性不言而喻,俗话说数据和特征决定了机器学习算法的上限,而模型、算法的选择和优化只是在不断逼近这个上限,因此,在对样本进行合理采样和处理之后,特征工程就显得尤为重要了。
本文主要分享推荐系统中常用的特征处理方法和技巧,不立足于某一个具象的推荐场景,而是从经验出发,介绍整体的方法论,内容涉及不少个人观点,如有疑问可评论探讨~
这篇博客介绍不同特征的基本处理方法,根据特征类型的不同,进行划分,后续会更新特征提取、特征编码、特征重要度评估等。
目前,常见的特征类型有:数值特征、类别特征、序列特征、k-v特征、embedding特征、交叉特征等
数值特征
数值特征最为常见,如一些统计类特征:ctr、click_num等,不同的业务场景,数值特征量不同,数值特征从特征获得方式上面又可以分成两类:一类是基础的统计特征,一类是根据业务场景,按照一定规则计算产出的复合特征。通常情况下,复合特征包含的信息会更多,更有效。下面对数值特征的常见处理方式进行总结。
特征分桶
针对于连续型特征,进行分桶操作简单有效,像点击量、点赞量、收藏量这类统计特征,直接拿去编码会造成编码空间的极大浪费,于是先进行分桶,同一个桶内的特征共用一个编码索引,既能够降低编码空间,又可以实现特征的高效处理。如此操作,将连续型特征映射到N个桶内,直接进行one-hot编码,简单方便。
既然需要将特征分桶,分桶的规则就起到了决定性作用——即分桶阈值的确定。这玩意儿说简单确实简单,但也比较容易被忽略,最近工作中就遇到了这个问题,之前的同事的分桶阈值设置的极其不合理,导致一些特征全部集中在几个桶里,这样会大大降低特征的区分度,影响模型效果。
其实说到这,最简单的一种处理方式已经出来了,就是先对数据进行基本的统计,然后直接将数据等分——等距分桶。但这种方式需要注意两个点:一是这个特征的数值分布是否平均,如果长尾严重,显然不合理;二十特征异常值对分桶的影响是否巨大,比如点击量中出现某个断层的最大值,会直接将其他的特征挤压到前面的桶里,后面的桶则很稀疏。
上述方式不推荐,常见且简单的方式是先对数据的等分点进行统计,然后根据每个特征等分点的情况大致确定分桶阈值——等频分桶,这样可以基本保证以下两个原则:
1.每个桶内的特征量级差不多
2.每个桶内的特征具有一定的区分度
细想一下,似乎还有更合理的处理方式——模型分桶。使用像聚类、动态规划这些算法获得特征分桶阈值,但这种方式明显有点小题大做了,毕竟整个特征池里面数值特征很多,按照第二种方式进行大致的确定就不错,当然还是要根据业务场景选择那种处理方式,具体情况具体分析。
特征截断
上面提到,特征中可能会出现异常值,这些异常值可能直接影响特征处理之后的结果,这种情况下,使用特征截断,移除异常值,可以使特征的准确性更高。
截断这里涉及到异常值检测,网上相关的资源不少,可以自行查找。
缺失值处理
这种情况也很常见,尤其是在推荐系统中,数据本身的稀疏性就会带来很多缺失值。
对于缺失值,处理方式有两种:一是进行补值,使用均值、中位数进行补值;二是直接使用0占位,因为这类值最后都是映射到编码空间的一个索引上,没有值直接置0.
标准化
原始特征空间维度较大,使用标准化操作之后对值空间进行压缩,常见的标准化方式有以下几种:
最大最小标准化
也叫0-1标准化,即将特征值映射到0~1之间,处理规则如下:
x
n
e
w
=
x
−
m
i
n
m
a
x
−
m
i
n
(1)
x_{new}=\frac{x-min}{max-min} \tag{1}
xnew=max−minx−min(1)
z-score标准化
经过处理的数据符合标准的正态分布,处理规则如下:
x
n
e
w
=
x
−
μ
σ
(2)
x_{new}=\frac{x-\mu}{\sigma} \tag{2}
xnew=σx−μ(2)
其中,
μ
\mu
μ 为样本数据的均值,
σ
\sigma
σ 为样本数据的标准差
数据平滑
对于比值型特征,小分母计算得到的特征值更不稳定,置信度低,这时候需要将数据进行平滑处理,使其更接近真实值。
wilson平滑
这个是本人最常用的平滑方式。比如对于ctr特征,有以下三个case:
case1:曝光100,点击3
case2:曝光10000,点击300
case3:曝光100000,点击3000
很明显,case3计算得到的ctr会更接近真实值,因为曝光基数足够大;而case1计算的数值最不稳定,多一个点击,ctr就变成了4%,因此,需要对case1和case2进行平滑操作。
使用wilson平滑就可以对这个数值进行修正,其计算公式如下:
p
^
+
z
2
2
n
1
+
z
2
n
±
z
1
+
z
2
n
p
^
(
1
−
p
^
)
n
+
z
2
4
n
2
(3)
\frac{\hat{p}+\frac{z^2}{2n}}{1+\frac{z^2}{n}} \pm \frac{z}{1+\frac{z^2}{n}} \sqrt{\frac{\hat{p}(1-\hat{p})}{n} + \frac{z^2}{4n^2}} \tag{3}
1+nz2p^+2nz2±1+nz2znp^(1−p^)+4n2z2(3)
其中,
p
p
p 为概率,在这里指点击的概率,也就是ctr,
n
n
n 为样本总数;
z
z
z 表示对应某个置信水平的z统计量。例如 z 取 1.96,就有 95% 的置信度。
贝叶斯平滑
r
=
C
+
α
I
+
α
+
β
(4)
r=\frac{C+\alpha}{I+\alpha+\beta} \tag{4}
r=I+α+βC+α(4)
类别特征
常见的类别特征有id特征、内容标签、性别、用户等级、操作系统等。
类别特征处理时候需要注意,类别本身的划分是否符合业务场景和业务逻辑,如果本身的划分就不带有区分度或者区分度很低,那这个特征的重要性也会随之降低。
类别特征相对会比较重要些,像用户id、内容标签特征都属于强相关特征,在某些场景,性别影响也很大
序列特征
如点击序列、浏览序列、转化序列等。这类特征能够反应用户的兴趣偏好,对于模型提供个性化推荐尤为重要。常见的序列特征处理方式有以下几种:
时序特征
按照时间序列对数据进行去重和排序,之后就可以直接丢给一些序列建模模型,像din等,简单方便又能提取到用户的兴趣习惯。
multi-hot编码
对于一些模型,处理序列特征会麻烦些,这是将序列特征进行multi-hot编码,相当于损失了行为顺序,但依旧有效
k-v特征
这类特征数据经过复杂逻辑计算得到的复合特征,如内容标签偏好等,在特征所属维度上,对于不同的key,都会有对应的value
embedding特征
万物皆可embedding,目前主流的方法也很多,有不少现成的api可以调用。常见的embedding可以分为item类和user类,具体的embedding特征产出之后会陆续整理。
常见的embedding特征处理方式有以下几种:
1.直接作为dense特征和其他特征concat一起,丢给模型训练
2.在模型dense layer之后再concat
3.穿插在模型的各个中间结构中
交叉特征
在FM系列模型出现之前,交叉特征尤为重要,因为当时的主流模型基本上是LR,LR只能对单特征进行处理,不能有效的提取交叉信息,之前总结的【推荐算法】ctr预估模型总结(LR、FM、FFM、NFM、AFM、WDL、DCN、DeepFM、FwFM、FLEN) 文章中有介绍。
目前,在WDL模型中,还需要交叉特征,其他复杂模型可以自动完成高阶交叉信息提取,一般不需要额外人工生产交叉特征。