有时连续特征需要进行离散化处理,比如视频在一段时间内的播放量对于视频点击CTR预估可能是一个重要的特征,因为播放次数跟视频的热度有很强的相关性,但是如果不同视频的播放次数的数量级相差巨大(实际情况确实是这样,热门视频比冷门视频播放量大若干个数量级),该特征就很难起作用(比如 LR 模型,模型往往只对比较大的特征值敏感)。对于这种情况,通常的解决方法是进行分桶。分桶操作可以看作是对数值变量的离散化,之后再进行 one-hot 编码。分桶的数量和宽度可以根据业务知识和经验来确定,一般有三种分桶方式:(1) 等距分桶,每个桶的长度是固定的,这种方式适用于样本分布比较均匀的情况;(2) 等频分桶,即每个桶里样本量一样多,但也会出现特征值差异非常大的样本被放在一个桶中的情况;(3) 模型分桶,使用模型找到最佳分桶,例如利用聚类的方式将特征分成多个类别,或者利用树模型,这种非线性模型天生具有对连续型特征切分的能力,利用特征分割点进行离散化。分桶是离散化的常用方法,连续特征离散化是有一定价值的:离散化之后得到的稀疏向量,运算速度更快,计算结果易于存储。离散化之后的特征对于异常值也具有更强的鲁棒性。需要注意的是:(1) 每个桶内都有足够多的样本,否则不具有统计意义;(2) 每个桶内的样本尽量分布均匀。
5.2.3 特征交叉
对于连续特征x、y,通过非线性函数 f 的作用,我们将 z=f(x,y) 作为交叉特征,一般 f 可以是多项式函数,最常用的交叉函数是 f=xy ,即两个特征对应的值直接相乘。通过特征交叉可以为模块提供更多的非线性,可以更细致地拟合输入输出之间的复杂关系,但非线性交叉让模型计算处理变得更加困难。我们也可以进行类别特征与数值特征之间的交叉,只不过这种交叉一般是统计某个类别具体值对应的数值特征的统计量(次数、和、均值、最值、方差等等)。拿电影的语言和用户的年龄两个特征交叉来说,我们可以分别统计看过语言是中文、英语等的电影中用户的平均年龄。根据大家的经验,我们知道年轻人受教育程度高,英语会更好,所以看过英语电影的人的平均年龄比看中文的平均年龄低。这类特征的交叉也需要基于具体业务场景及领域知识来做,否则获得的交叉特征可能无效,甚至给模型引入噪音。