Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

hannahguo,腾讯 PCG 推荐算法工程师作者

浅谈微视推荐系统中的特征工程

推荐系统中,特征工程扮演着重要的角色。俗话说数据和特征决定了机器学习算法的上限,而模型、算法的选择和优化只是在不断逼近这个上限。特征工程的前提是收集足够多的数据,使用数据学习知识,从大量的原始数据中提取关键信息并表示为模型所需要的形式。本文主要说明微视,这种富媒体形态的短视频平台,是如何通过视频内容特征以及用户属性和行为数据,来精准预测用户对短视频的喜好的。

引言

本文主要是跟各位读者分享特征工程领域的一些通用方法和技巧,以及微视在特征工程上的相关实践经验。微视作为一个短视频平台,存在其独有的业务特点,这也给特征构造带来了一定的难度。比如热目类目在播放时长、互动率等指标上表现出天然的优势,长视频相比于时长较短的视频在播放完成度、完播率等指标上存在明显的劣势,如何消除这些 bias 的影响都是特征构造时需要特别注意的地方,而对于我们线上的多目标排序模型来说,不同单目标对应的最优特征组合也不尽相同,这些不仅需要较强的专业领域知识,更重要的是对自身业务场景的深刻认知以及大量线上实验的探索尝试与验证。


一、特征提取

特征工程就是将原始数据空间映射到新的特征向量空间,使得在新的特征空间中,模型能够更好地学习数据中的规律。因此,特征提取就是对原始数据进行处理与变换的过程。常见的原始数据类型有数值型、离散型,还有文本、图像、视频等。如果将这些数据作为一个整体来看待的话,把用户、视频、作者看作节点,用户与视频、作者的交互看作边构建出的复杂网络也是我们的原始数据。

事实上,如果特征工程做的足够好,即使是简单的模型,也能表现出非常好的效果。而复杂的模型可以在一定程度上减少特征工程的工作量。例如,对于线性模型,我们需要将类别变量进行独热编码等处理,但对于复杂一些的模型如树模型,则可以直接处理类别变量。像推荐系统中常用的 LR 模型,需要手工构造组合特征,而 FM 模型可以解决特征组合的问题,直接输入原始特征。而更复杂的 DNN 模型,可以自动学习特征的表示。

在微视场景下,视频的播放时长、播放完整度、点赞、转发、分享、评论等多种互动行为都是推荐模型的训练目标,根据模型所要学习的目标和业务逻辑,我们需要考虑数据中有哪些可能相关的信息,从现有数据中挖掘出对模型预测有用的特征。比如在微视排序中,用户的兴趣,在 App 上的播放、互动等行为以及视频的类别、标签、热度等都是强相关的因素。在确定了哪些因素可能与预测目标相关后,我们需要将此信息抽取成特征,下面会对不同特征的处理方式做具体介绍。


1.数值特征

数值类型的数据具有实际统计意义,例如用户对不同类目下视频的兴趣分,或者是计数,例如一个视频被播放了多少次、被点赞、转发以及评论了多少次等。虽然一些机器学习模型可以直接输入数值类型的数据,但是通常情况下,对数值型数据进行适当的变换和处理能带来更优的效果。对于数值特征,我们主要考虑的因素是它的大小和分布。下面介绍几种我们用到的数值特征的处理方法。

1)分桶比如视频一周内被播放次数应该是一个有用的特征,因为播放次数跟视频的热度有很强的相关性,但是如果不同视频的播放次数跨越不同的数量级,则很难发挥想要的作用。例如 LR 模型,模型往往只对比较大的特征值敏感。对于这种情况,通常的解决方法是进行分桶分桶操作可以看作是对数值变量的离散化,之后通过二值化进行 one-hot 编码。

分桶的数量和宽度可以根据业务领域的经验来指定,也有一些常规做法。(1)等距分桶,每个桶的值域是固定的,这种方式适用于样本分布较为均匀的情况;(2)等频分桶,即使得每个桶里数据一样多,这种方式可以保证每个桶有相同的样本数,但也会出现特征值差异非常大的样本被放在一个桶中的情况;(3)模型分桶,使用模型找到最佳分桶,例如利用聚类的方式将特征分成多个类别,或者树模型,这种非线性模型天生具有对连续型特征切分的能力,利用特征分割点进行离散化。

分桶是离散化的常用方法,将连续特征离散化为一系列 0/1 的离散特征,离散化之后得到的稀疏向量,内积乘法运算速度更快,计算结果方便存储。离散化之后的特征对于异常数据也具有很强的鲁棒性。需要注意的是:1)要使得桶内的属性取值变化对样本标签的影响基本在一个不大的范围,即不能出现单个分桶的内部,样本标签输出变化很大的情况;2)使每个桶内都有足够的样本,如果桶内样本太少,则随机性太大,不具有统计意义上的说服力;3)每个桶内的样本尽量分布均匀。

2)截断。对于连续型数值特征,有时精度太高可能只是噪声,并不具备太多的信息,也使得特征维度急剧上升。因此可以保留一定的精度,之后当作类别特征进行处理。对于长尾的数据,可以先进行对数缩放,再进行精度截断,之后可以当做类别变量做二值化处理,这也是我们实际应用中的做法。

3)缺失值处理。实际问题中经常会遇到特征缺失的情形,对于特征缺失,可以选择补一个值,例如使用均值,中位数,众数等进行替代,需要视具体情况进行选择;也可直接忽略,即将缺失作为一种信息进行编码输入模型让其进行学习,比如用户性别缺失,可以直接将未知作为一种类别进行处理;还可以使用模型预测缺失值,当然也有一些模型可以直接处理缺失值特征,比如 XGBoost

4) 特征交叉。特征交叉可以表示特征之间的相互作用,有助于表示非线性关系,增强对问题的刻画,缺点是维度快速增长,需要更多的训练样本。提升模型表达能力常见的关联方式有内积、笛卡尔积、哈达玛积等。内积是将两个或多个特征相乘,若向量 a=(a1,b1),向量 b=(a2,b2),则向量 a·向量 b=a1a2+b1b2;笛卡积是将所有元素两两相乘,例如,A={a,b},B={0,1,2},则 A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)} ;Hadamard 积是将对应位置的元素相乘,例如,A={a,b},B={0,1},则 A×B={(a, 0) (b, 1) } 。下图旨在说明笛卡尔积与 Hadamard 积在具体特征构造上的差异。


特征交叉可以通过一些特征选择方法来选择有效的组合特征,比如卡方检验、特征相关性分析等;也可以根据经验进行组合, 有些 cross 特征,虽然可能没有直观的解释,但也常常会给模型带来很大的效果提升。除了手工构造交叉特征外,有些模型可以自动进行特征的交叉组合,比如常用的 FM 和 FFM 模型等。

5)标准化与缩放。数据的标准化或者归一化是将数据按比例缩放,将其转化为无量纲的纯数值,使得不同单位或量级的特征之间具有可比性,对于利用梯度下降来训练模型参数的算法,有助于提升模型的收敛速度。需要强调的是,不同业务的数据,其数据分布是不同的,缩放的方法一定要符合其特定的数据分布。一般会根据实际数据的情况,对常规做法或者公式进行调整,但大体思路上还是一致的,下面介绍 3 类相对通用的做法。

  • 0-1 标准化,是对原始数据的线性变换,使结果落到[0,1]区间,其中 max 为样本数据的最大值,min 为样本数据的最小值。这种方法有一个缺陷就是当有新数据加入时,可能会导致 max 值和 min 值的变化,需要重新定义。如果 max 值和 min 值波动较大,容易使得标准化结果不稳定,因此在实际使用中常用经验常量值来替代最大最小值。

  • z-score 标准化,经过处理的数据符合标准正态分布,即均值为 0,标准差为 1,其中 μ 为所有样本数据的均值,σ 为所有样本数据的标准差。这种标准化方式要求原始数据的分布可以近似为高斯分布,否则效果会变得很糟糕。

  • 非线性标准化,这种方法一般使用在数值差异较大的场景,通过一些数学函数,比如对数、指数、正切等,将原始值做映射变换。实际使用中,需要根据不同业务的数据分布来选择,比如对数缩放,对数缩放对于处理长尾分布且取值为正数的数值变量非常有效,可以压缩数据范围,将长尾变为短尾,像 log2 和 log10 转换在微视中也都有使用,是一种方差稳定的变换。

6)数据平滑。

常用的行为次数与曝光次数比值类的特征,由于数据的稀疏性,这种计算方式得到的统计量通常具有较大的偏差,需要做平滑处理,比如广告点击率常用的贝叶斯平滑技术。而在我们推荐场景中,也会用到很多统计类特征、比率特征。如果直接使用,比如由于不同 item 的下发量是不同的,这会让推荐偏向热门的类目,使得越推越窄,无法发现用户的个体差异,也不利于多样性的探索。我们可以把曝光量进行分段,同一个曝光量级的指标进行比较,也可以用该 item 所属类目统计量的平均值进行平滑处理。对于离群值较多的数据,我们会使用更加健壮的处理方法,比如使用中位数而不是均值,基于分位数而不是方差。而在短视频业务上较短或较长的视频在播放完成度上存在天然的差距,我们按视频本身长度离散,观看时长做分位数处理,同时做威尔逊置信区间平滑,使得各视频时长段播放完成度相对可比,避免出现打分因视频长度严重倾斜的情况。以及短视频 app 的投稿数量大,对于长尾的视频和类目都是需要做平滑处理的。下面介绍两种较为常用的平滑技术。

  • 贝叶斯平滑

电商领域中经常需要计算或预测一些转化率指标,比如 CTR。这些转化率可以是模型的预测值,也可以作为模型的特征使用。以商品点击率预测为例,CTR 的值等于点击量除以曝光量。理想情况下,例如某个广告点击量是 10000 次,转化量是 100 次,那转化率就是 1%。但有时,例如某个广告点击量是 2 次,转化量是 1 次,这样算来转化率为 50%。但此时这个指标在数学上是无效的。因为大数定律告诉我们,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。后者点击量只有 2 次,不满足“重复试验多次”的条件。如果对于一个新上线的商品,其曝光为 0,点击量也为 0,此时这件商品的 CTR 应该设为 0 还是赋一个初始值?初始值设 0 是可以的,但不太合理。当 CTR 作为特征使用时,表示这个商品完全没有点击,不太符合日常推断,通常是赋一个大于 0 的初始值。

以上两个问题可以使用平滑技术来解决。贝叶斯平滑的思想是给 CTR 预设一个经验初始值,再通过当前的点击量和曝光量来修正这个初始值。如果某商品的点击量和曝光量都是 0,那么该商品的 CTR 就是这个经验初始值;如果商品 A 和商品 B 的曝光量差别很大,那么可以通过这个经验初始值来修正。贝叶斯平滑就是确定这个经验值的过程。贝叶斯平滑是基于贝叶斯统计推断的,因此经验值计算的过程依赖于数据的分布情况。对于一件商品或一条广告,对于某次曝光,用户要么点击,要么没点击,这符合二项分布。因此对于点击率类的贝叶斯平滑,都可以基于以下假设:对于某件商品或广告,其是否被点击是一个伯努利分布。伯努利分布的共轭分布就是 Beta 分布,也就是说,点击率服从 Beta 分布。而所有的数据有一个自身的点击率分布,这个分布可以用不同的 beta 分布来拟合。beta 分布可以看做是对点击率的一个先验知识,我们可以根据观测来修改我们的先验,所以贝叶斯平滑就是估计 Beta 分布中的参数 α 和 β,其中 C 和 I 是点击次数和曝光量。实际应用时根据历史数据得到的 α 和 β 可以帮助确定平滑参数的大致范围,防止设置参数时偏离过大。

  • 威尔逊区间平滑

在现实生活中我们会接触到很多评分系统,如豆瓣书评、YouTube 影评,在这些评分中有 1 个共同问题是每个 item 的评分人数是不同的,比如 10000 个人打了 90 分似乎比只有 10 个人打了 90 分更能被相信该 item 是 90 分的。威尔逊区间法常用来解决此类问题,是一种基于二项分布的计算方法,综合考虑评论数与好评率,平滑样本量对评价的影响,我们画像兴趣分上也用到了威尔逊区间平滑。

假设 u 表示正例数(好评),n 表示实例总数(评论总数),那么好评率 p 就等于 u/n。p 越大,表示这个 item 的好评比例越高,越应该排在前面。但是,p 的可信性,取决于有多少人,如果样本太小,p 就不可信。我们已知 p 是二项分布中某个事件的发生概率,因此我们可以计算出 p 的置信区间置信区间实际就是进行可信度的修正,弥补样本量过小的影响。如果样本多,就说明比较可信,不需要很大的修正,所以置信区间会比较窄,下限值会比较大;如果样本少,就说明不一定可信,必须进行较大的修正,所以置信区间会比较宽,下限值会比较小。威尔逊区间就是一个很好的修正公式,在小样本上也具有很强的鲁棒性。

在下面的公式中, p 表示样本的好评率,n 表示样本的大小,z 表示对应某个置信水平的 z 统计量,是一个常数。一般情况下,在 95%的置信水平下,z 统计量的值为 1.96。可以看到,当 n 的值足够大时,这个下限值会趋向 p 。如果 n 非常小,这个下限值会远小于 p,起到了降低好评率的作用,使得该 item 的打分变低、排名下降。

7)bias 消除。微视会用到一些不同时间窗口以及实时的统计特征,比如不同类目或者不同时长区间下的完播率、平均播放时长等,考虑到冷热门类目以及长短视频在统计量上本身存在明显的差异,平滑之后我们会用统计量均值进行消偏,这也相当于有一个对热门视频降权,对长视频提权的作用。

8)多维度定义。有些特征可以结合多个属性或者统计量来定义,比如用户所属用户群特征,用户群可以从画像、操作系统等维度来定义;比如用户的活跃度特征可以从周/月登录次数、日播放时长、日播放个数、平均完播率等维度联合定义。

9)根据目标定制。有效的特征应该是与模型训练目标、样本定义紧密相关的,需要从数据中发掘与模型目标强相关的因素。比如视频的播放时长、播放完整度是我们的直接学习目标,同时考虑到用户在短视频 app 上的互动类型比较多,包括点赞、评论、分享、关注等,而不同的行为对于用户有着不同的价值,点赞表示兴趣偏好,评论反映用户的真实感受,分享利于传播分发,关注建立了一种好友兴趣关系,我们会同时利用这些用户互动行为进行建模。与广告点击率预估中的 ctr 特征类似,我们可以根据不同目标正负样本的定义,分别为每个单目标模型构造正样本率特征。以及比如从评论文本中分析用户对视频的“内容、bgm、速度、清晰度”等属性的情感倾向,对评论文本进行情感分析,让文本评论好评率来指导模型根据真实评价推荐视频就显得很有意义。


2.类别特征

类别特征可以是标签、属性、类型 ,比如在微视应用中,视频的 id、作者、类别、标签、清晰度、质量、topic、bgm 曲风与速度等视频属性特征。同时也可以将数值特征离散化,从定量数据中获得定性数据。下面介绍几种我们对类别变量的处理方法。

1)独热编码独热编码通常用于处理类别间不具有大小关系的特征,每个特征取值对应一维特征,能够处理缺失值,在一定程度上也起到了扩充特征的作用。但是当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用 PCA 等方法进行降维

2)散列编码。对于有些取值特别多的类别特征,使用独热编码得到的特征矩阵非常稀疏,再加上如果还有笛卡尔积等构造的组合特征,会使得特征维度爆炸式增长。特征数量多的问题自古有之,目前也已经有很多用于降维的方法。比如聚类、PCA 等都是常用的降维方法。但这类方法在特征量和样本量很多的时候本身就计算量很大,所以对大问题也基本无能为力。特征哈希就是一种简单的降维方法,在微视使用也较多,特征哈希法的目标就是是把原始的高维特征向量压缩成较低维特征向量,且尽量不损失原始特征的表达能力,其优势在于实现简单,所需额外计算量小;降低特征维度,从而加速算法训练与预测的时间,以及降低内存消耗;但代价是通过哈希转换后学习到的模型变得很难检验,我们很难对训练出的模型参数做出合理解释。特征哈希法的另一个问题是它会把多个原始特征哈希到相同的位置上,出现哈希 collision 现象,但实际实验表明这种 collision 对算法的精度影响很小。

3)打分排名编码。比如在对用户画像的使用上,我们既直接使用了连续值画像特征,同时考虑到画像兴趣分之间天然的序列关系,分别对用户一、二级类目的 top1~top10 兴趣进行 one-hot,利用打分的排名对类别特征进行编码,强化兴趣打分排名的信号,且这种方式对于异常点较为不敏感;还有比如用户活跃度较高的前 topn 类目和不活跃度较高的前 topn 类目也可按次序排名作为离散特征。

4)异常值处理。实际应用中,我们常常关心的一个点是异常值对整个统计以及离散化的影响,对于数值变量我们可以把绝对值处理为一个相对值,作为一个次序变量进行 one-hot 编码,或者做分箱离散化,都可以较好的减轻离群点的影响。对于分类变量,可以考虑神经网络中常见的做法,将分类变量做特征嵌入。比如说这里有 1 万个不同的标签,把它投影到 64 维或者 128 维的 vector 上面,相当于原来一个 1 万维的 one-hot 特征,现在只需要 64 维或 128 维就可以进行表示,将原本十分稀疏的向量空间转换到语义更为丰富且低维的特征 embedding 空间,且内存需求更少,精度也会更高。

5)类别特征之间交叉组合。比如用户性别、操作系统 cross 得到用户分群特征,视频类别与标签之间的组合特征。在实际应用中,类别特征之间的组合方式千变万化,这类特征一般从业务逻辑的角度出发进行构造。相比类别特征之间的笛卡尔积操作,基于分组统计的特征组合方式计算更加复杂,需要对业务数据有较好的理解。

6)类别特征和数值特征之间交叉组合。这类特征通常是在类别特征某个具体类别中计算一些统计量。例如用户对不同类目视频的完播率、平均播放时长,不同用户群体的互动指标等利用数值特征对类别特征进行处理。

例如我们构造了视频一二级类目的曝光次数 cross 快划次数的组合特征,这个可以有很直观的解释,比如分析某个用户的样本发现类似王者荣耀_31_31 的组合,即我们的推荐系统给这个用户曝光了 31 个王者荣耀的视频,但是每个都快速划过了,如果还是继续推,这个用户体验将会是极度糟糕的,而这个特征会很大程度的解决这个问题,使得尽可能的给这个用户曝光感兴趣的类目。这个特征可以进一步细化为类目曝光次数 cross 一些统计量,比如完播次数、互动次数等,因为没有快划可能是用户愿意尝试去看,完播可能是喜欢这个视频内容,而互动比如说转发或者点赞,可以看做是用户表现出了更为强烈的兴趣。

比如为了提升视频的清晰度,我们给视频清晰等级打标签,但是发现直接加入清晰度属性特征后,清晰视频分布和线上指标并没有改善。通过对终端屏幕匹配情况,视频相比于屏幕过度拉伸比例的分析,我们发现约有十分之一的播放体验表现出过度拉伸,对于部分大屏幕用户,过度拉伸比例会更高,于是我们进一步尝试了视频清晰度分别与用户手机屏幕拉伸度和手机型号的笛卡尔积特征,清晰视频播放占比有了较为明显的提升,这对用户体验起到了一定的优化作用。


3.Embedding 特征

1)视频 embedding

视频 embedding 分为基于内容的 embedding 和基于行为的 embedding,前者使用视频的标题、封面、图像,音频等视频自身属性信息,通过 nlp、图像视觉等技术获得 embedding,后者是基于用户与视频的交互行为数据获得,比如我们发现用户在一个 session 中,前后点击的视频存在一定的相似性,通常会表现出对某类型视频的兴趣偏好,可能是同个风格类别,或者是相似的话题人物等。因此我们将一段时间内用户点击的视频 id 序列作为训练数据,使用 skip-gram 模型学习视频的 embedding 特征。由于用户点击行为具有上下文承接关系,因此得到的 embedding 特征有很好的聚类效果,使得在特征空间中,同类目的视频聚集在一起,相似类目的视频在空间中距离相近。在微视推荐系统里,视频 embedding 不仅可以作为排序特征,利用用户最近点击过视频的平均 embedding 进行召回,也是带来了效果提升。

我们使用 TSNE 对视频 embedding 进行降维,从可视化结果来看,同一个类目下的视频是聚在一起的;相似的类目在特征空间中离得较近,如“猫”和“狗”,“亲子互动”和“亲情”;差异较大的类目离得较远,如“旅行 Vlog”和“猫”。这还是很符合预期的,一个用户的主要兴趣可能就集中在某几类,比如有的用户喜欢“猫”,那这个用户很大可能对“猫”的视频有大量的播放以及互动行为,那我们学习出来关于猫这个类目的视频 embedding 就会很相似,表现出在嵌入空间中聚集在一起的情形。

但是如果只是简单的对视频 id 序列学习 embedding 特征,我们是无法获得新视频 embedding 的。针对这个问题,我们使用了 side information 来解决视频冷启动问题,side information 指的是视频的一、二级类目、视频标签、视频时长、清晰度、距离发布的时间等视频属性信息,像距离发布的时间属性对于新闻资讯类视频,提升视频时新性有一定的帮助,尤其我们发现用户比较偏爱新发布的视频。我们将视频 embedding 特征转化为视频属性的 embedding 特征,取一段时间内同属性视频的平均 embedding 作为这个属性的 embedding 特征。这样当有新的视频进入到推荐库时,可以计算出新视频的视频属性 embedding。这样做的好处是在同一个语义空间做运算,排序模型不需要再重新学习 embedding 的空间分布。

基于 side information 获得的视频 embedding 区分能力还是受到一定限制的,只要视频属性相同,不同视频 embedding 是完全一样的,而且如果增加了新的类目标签或者其他属性分类也是没有办法处理的。针对以上情况,实际使用中我们采用增量式 skip-gram 模型学习视频的 embedding,使用推荐库最新资源线上实时训练,将新入库的视频加入到模型中做增量式学习。Incremental skip-gram 模型与传统 skip-gram 模型的不同之处在于 embedding 空间分布是动态更新的。

2)user embedding

想让 embedding 表达什么,主要在于选择哪一种方式构建语料,不同的用户行为序列,表达的兴趣也不同,比如快速划过行为、完播行为,点赞转发行为等表达的兴趣以及程度也都是不同的。因此视频 embedding 向量最终的作用,是不同 item 在用户兴趣空间中的位置表达。目前使用较多的主要是基于 word2vec 以及相应衍生的 embedding 技术和基于图神经网络的 embedding 技术,像我们在隐式画像上就使用了基于异构图的 user embedding。

我们也可以把推荐问题建模成一个大规模的多分类问题,使用 softmax loss 学习一个 DNN 模型,即在某一时刻某一上下文信息下为用户在视频推荐库中精准地预测出下一次播放视频的类别,最后把训练好的 DNN 模型最后一层隐层输出作为 user embedding。深度学习模型虽然能够减少一部分特征工程的工作,但有些原始数据是不能直接输入到 DNN 中,与 CV、NLP 不同的是,推荐系统特征工程格外依赖,好的特征能够起到非常关键的作用。我们的输入融合多种信息,主要包括人口统计学信息,播放历史,搜索历史,上下文信息,兴趣画像等,同时使用全场景数据而不是只使用用户播放数据。同时考虑了一些泛化能力比较强的数值和时间特征,比如完播该类目的视频数,最近一次播放该类目视频距离现在的时间等刻画用户与视频类别关系的特征。除了这些偏正向的特征,用户对于一些类目曝光但不点击快速划过等负反馈的信号同样非常重要。

简单一点的做法也可以将一段时间内用户点击过的视频的平均 embedding 作为该用户的 embedding 特征,当然这里的“平均”可以是简单的算术平均,也可以是根据视频的热度和时间属性等进行加权平均或者尝试用 RNN 替换掉平均操作。同时将时间跨度取长一点,可以表达用户的长期兴趣;取短一点,可以用于刻画用户的短期兴趣,当然用户覆盖率也会随之降低。比如用户最近一周内主要点击观看的都是关于“猫”的视频,那该用户 embedding 特征,就会跟“猫”的向量很相近。我们也尝试将用户点赞或者分享转发过的视频序列作为训练数据,为用户互动过的视频提权。这里需要注意的是,有时单个用户行为序列太稀疏了,无法直接训练,一般可以先对用户做聚类再训练。

3)作者 embedding

可以取作者近一个月内发布视频的平均 embedding,作为该作者的 embedding 特征。这样做的出发点是,如果两个作者发布的视频相似,那么这两个作者的 embedding 向量也应该是相近的。假设此时某个用户喜欢作者 A,那么我们可以试着把与作者 A 相似的作者 B 发布的视频推荐给该用户。

4.context 特征

context 特征通常是客户端带的信息,在用户授权的前提下可以直接获取,比如请求时间、用户手机品牌、手机型号、操作系统、当前网络状态(3g/4g/wifi)、用户渠道等实时属性特征以及之间的 cross 特征。

5.session 特征

session 特征一般是基于用户最近的行为流水,常见的 session 划分方法有以下几种:

  • 固定行为数窗口,例如最近 100 条行为中分视频类别的完播个数、快速划过个数;

  • 固定时间窗口,例如最近 3 天里有过正向行为的 item id 或者一些统计量;

  • 连续行为窗口,例如用户 1 次打开 app 到关闭 app 期间的播放互动行为。

如上几种 session 定义的方法没有优劣之分,一般会结合具体业务场景做混合定义。在获取到用户的 session 数据后,可以直接将 session 里对应的 item id 序列作为特征,或者是 session 内的类别统计数据,也可以将预训练好的 item embedding 构造成 session 特征。


二、特征选择

特征选择是指选择相关特征子集的过程,好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。特征选择主要有以下两个目的:

  • 简化模型,节省存储和计算开销;

  • 减少特征数量、降维,改善通用性、降低过拟合的风险。

下面介绍几种特征选择的常用方法。

1.过滤式(Filtering)

过滤式特征选择独立于学习算法,不需要依赖任何模型,直接由数据集求得,评估依赖于数据集本身。一般主要考虑特征变量和目标变量之间的相关性以及特征变量之间的相互关系,一般认为相关度大的特征或者特征子集会对后续学习算法带来较高的准确率。这类方法在预处理时也使用较多,优点是计算效率高、复杂度低,独立于算法,但也可能选出冗余的特征。

  • 覆盖率。首先计算每个特征的覆盖率,覆盖率很小的特征对模型的预测效果作用不大,可以剔除。

  • 方差分析。分析特征的数据分布,比如说某个特征方差接近于 0,说明不同样本在这个特征上基本没有什么差异,可以说这个特征是对于样本区分基本没有太大作用的无关变量。因此通常可以选择方差大于某个阈值的特征,去掉取值变化小的特征。

  • Pearson 相关系数。皮尔森相关系数是一种简单的,能帮助理解特征和目标变量之间关系的方法,用于衡量变量之间的线性相关性,取值区间为[-1,1],-1 表示完全的负相关,+1 表示完全的正相关,0 表示没有线性相关。通过分析特征与目标之间的相关性,优先选择与目标相关性高的特征。

  • 假设检验。假设特征变量和目标变量之间相互独立,选择适当检验方法计算统计量,然后根据统计量做出统计推断。例如对于特征变量为类别变量而目标变量为连续数值变量的情况,可以使用方差分析,对于特征变量和目标变量都为连续数值变量的情况,可以使用皮尔森卡方检验。卡方统计量取值越大,特征相关性越高。

  • 互信息。在概率论和信息论中,互信息用来度量两个变量之间的相关性。互信息越大则表明两个变量相关性越高,互信息为 0 时,两个变量相互独立。

2.封装式(Wrapping)

与过滤方法不同,封装式特征选择直接使用机器学习算法评估特征子集的效果,直接面向算法优化,效果好,缺点是需要对每一组特征子集训练一个模型,计算复杂度高。常用的特征子集搜索算法有:完全搜索;基于贪心的启发式搜索(前向/后向搜索等);随机搜索(模拟退火、遗传算法等)。

3.嵌入式(Embedding)

过滤式方法与模型算法相互独立,不需要交叉验证,计算效率比较高,但是没有考虑具体模型算法的特点。封装式方法使用模型来评估特征子集的质量,需要多次训练模型,计算效率很低。嵌入式方法将特征选择本身作为组成部分嵌入到学习算法里,速度快,效果好,不足是与算法绑定,需要知识调整结构和参数配置。

  • 基于正则化

    使用带正则惩罚项的模型,比如 L1 正则化,通过对回归系数添加 L1 惩罚项来防止过拟合,因产生稀疏解,天然具有特征选择的作用。

  • 基于树模型

    基于决策树的算法,如随机森林、GBDT,xgboost,在每次选择分类节点时,都会选择最佳分类特征来进行切分,重要的特征更有可能出现在分裂较早的节点,作为分裂节点的次数也越多。因此,可以基于树模型中特征出现次数等指标对特征重要性进行排序。


三、特征重要性分析

特征重要性分析是用来判断哪些变量对模型预测的影响力最大,可以帮助我们理解数据,指导模型参数的设置以及特征的选择,使模型具有良好的可解释性。

  • 单特征 auc。

对每个单特征训练模型,计算每个特征的 auc 或 gauc,并对其进行排名,精度越高表示该特征重要程度越高。这个方法需要训练多个模型,效率较低。实际应用中,可以有选择的对某些特征子集进行实验。
(1) 特征值置为 0。在预测时可以依次将某个特征取值置为 0,即不考虑该特征对模型的影响,计算模型 auc,精度降低越多,表示这个特征对于模型预测越重要;

(2)特征取随机值。将某个特征取随机值,可以使用均匀或者高斯分布随机抽取值,然后计算模型的准确率。对于某个特征,如果用一个随机值替代后表现比之前差很多,说明该特征很重要;

(3)特征值随机打乱。随机打乱验证集中某一特征变量的值,使用训好的模型进行预测,精度损失越多,说明该特征对于预测结果的影响越大,可以按照精度损失的多少对特征重要性进行排序。这个方法比随机取值更科学,保证了与原始特征分布是一致的。举个例子说明一下,我们有一个已经训练好的模型以及评估该模型表现的评价指标(如 RMSE)。假设这是一个短视频播放时长的预测模型,本来在验证集上的 RMSE 是 200,然后我们把某一个变量的值(如性别)全部打乱重新做预测,比如说此时 RMSE 变成了 500,那么性别这个变量的重要性就可以记为 300,即让 loss 增加了 300。

四、结语

在实际的工程应用中,具体采用什么特征处理方式不仅依赖于业务和数据本身,还依赖于所选取的模型,因此首先要理解数据和业务逻辑以及模型的特点,才能更好地进行特征工程。通常可以考虑对样本做归一化、离散化、平滑处理以及特征变换与特征交叉,我们也会使用一些跨场景的特征迁移方法,复用现有知识域数据,比如手 Q 场景下的特征数据,具体方法的选择依赖于数据、资源等实际因素,复杂的模型虽然可以减轻我们在特征工程上的工作,但这并不代表我们不需要特征工程了。我们只是把更多的精力放在了模型难以直接从原始数据中学习到,需要借助对业务的理解与外部知识的特征构造上。

特征工程不仅与模型算法相关,与实际问题更是强相关的。针对不同场景,特征工程所用的方法可能相差较大,所以很难总结出适用于不同业务的一套比较通用的方法。尽管如此,但仍然有很多特征工程的方法和技巧在不同问题中都适用。本文把微视排序中一些特征工程的实践经验跟各位读者分享,希望对大家能有所帮助。

腾讯技术工程
腾讯技术工程

腾讯技术工程事业群在机器之心的内容专栏

理论推荐系统特征抽取数据挖掘贝叶斯平滑
31
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

卡方检验技术

卡方检验(Chi-Squared Test)是一种统计量的分布在零假设成立时近似服从卡方分布(X ^2 分布)的假设检验。在没有其他的限定条件或说明时,卡方检验一般指代的是皮尔森卡方检验。在卡方检验的一般运用中,研究人员将观察量的值划分成若干互斥的分类,并且使用一套理论(或零假设)尝试去说明观察量的值落入不同分类的概率分布的模型。而卡方检验的目的就在于去衡量这个假设对观察结果所反映的程度。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

二值化技术

二值化是将像素图像转换为二进制图像的过程。

高斯分布技术

正态分布是一个非常常见的连续概率分布。由于中心极限定理(Central Limit Theorem)的广泛应用,正态分布在统计学上非常重要。中心极限定理表明,由一组独立同分布,并且具有有限的数学期望和方差的随机变量X1,X2,X3,...Xn构成的平均随机变量Y近似的服从正态分布当n趋近于无穷。另外众多物理计量是由许多独立随机过程的和构成,因而往往也具有正态分布。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

推荐系统技术

推荐系统(RS)主要是指应用协同智能(collaborative intelligence)做推荐的技术。推荐系统的两大主流类型是基于内容的推荐系统和协同过滤(Collaborative Filtering)。另外还有基于知识的推荐系统(包括基于本体和基于案例的推荐系统)是一类特殊的推荐系统,这类系统更加注重知识表征和推理。

大数定律技术

在数学与统计学中,大数定律又称大数法则、大数律,是描述相当多次数重复实验的结果的定律。根据这个定律知道,样本数量越多,则其算术平均值就越趋近期望值。大数定律很重要,因为它“保证”了一些随机事件的均值的长期稳定性。

分桶技术

将一个特征(通常是连续特征)转换成多个二元特征(称为桶或箱),通常是根据值区间进行转换。例如,您可以将温度区间分割为离散分箱,而不是将温度表示成单个连续的浮点特征。假设温度数据可精确到小数点后一位,则可以将介于 0.0 到 15.0 度之间的所有温度都归入一个分箱,将介于 15.1 到 30.0 度之间的所有温度归入第二个分箱,并将介于 30.1 到 50.0 度之间的所有温度归入第三个分箱。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

随机森林技术

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而"Random Forests"是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的"Bootstrap aggregating"想法和Ho的"random subspace method" 以建造决策树的集合。

假设检验技术

假设检验是推论统计中用于检验统计假设的一种方法。而“统计假设”是可通过观察一组随机变量的模型进行检验的科学假说。一旦能估计未知参数,就会希望根据结果对未知的真正参数值做出适当的推论。

梯度下降技术

梯度下降是用于查找函数最小值的一阶迭代优化算法。 要使用梯度下降找到函数的局部最小值,可以采用与当前点的函数梯度(或近似梯度)的负值成比例的步骤。 如果采取的步骤与梯度的正值成比例,则接近该函数的局部最大值,被称为梯度上升。

特征工程技术

特征工程是利用数据所在领域的相关知识来构建特征,使得机器学习算法发挥其最佳的过程。它是机器学习中的一个基本应用,实现难度大且代价高。采用自动特征工程方法可以省去采用人工特征工程的需求。Andrew Ng 说“挖掘特征是困难、费时且需要专业知识的事,应用机器学习其实基本上是在做特征工程。”

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

启发式搜索技术

计算机科学的两大基础目标,就是发现可证明其运行效率良好且可得最佳解或次佳解的算法。而启发式算法则试图一次提供一个或全部目标。例如它常能发现很不错的解,但也没办法证明它不会得到较坏的解;它通常可在合理时间解出答案,但也没办法知道它是否每次都可以这样的速度求解。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

置信区间技术

在统计学中,一个概率样本的置信区间(Confidence interval),是对这个样本的某个总体参数的区间估计(Interval Estimation)。置信区间展现的是,这个总体参数的真实值有一定概率落在与该测量结果有关的某对应区间。置信区间给出的是,声称总体参数的真实值在测量值的区间所具有的可信程度,即前面所要求的“一定概率”。这个概率被称为置信水平。举例来说,如果在一次大选中某人的支持率为55%,而置信水平0.95上的置信区间是(50%, 60%),那么他的真实支持率落在50%和60%之区间的机率为95%,因此他的真实支持率不足50%的可能性小于2.5%(假设分布是对称的)。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

先验知识技术

先验(apriori ;也译作 先天)在拉丁文中指“来自先前的东西”,或稍稍引申指“在经验之前”。近代西方传统中,认为先验指无需经验或先于经验获得的知识。先验知识不依赖于经验,比如,数学式子2+2=4;恒真命题“所有的单身汉一定没有结婚”;以及来自纯粹理性的推断“本体论证明”

操作系统技术

操作系统(英语:operating system,缩写作 OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

分类问题技术

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

卡方技术

卡方常常与卡方分布和卡方检验联系在一起: 卡方分布(chi-square distribution)是常用于概率论和统计检验中的一种概率分布;卡方检验是(chi-square test)是一种基于卡方分布的常用的统计检验,其统计量在原假设(null hypothesis)成立时服从卡方分布。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

降维技术

降维算法是将 p+1 个系数的问题简化为 M+1 个系数的问题,其中 M<p。算法执行包括计算变量的 M 个不同线性组合或投射(projection)。然后这 M 个投射作为预测器通过最小二乘法拟合一个线性回归模型。两个主要的方法是主成分回归(principal component regression)和偏最小二乘法(partial least squares)。

正则化技术

当模型的复杂度增大时,训练误差会逐渐减小并趋向于0;而测试误差会先减小,达到最小值后又增大。当选择的模型复杂度过大时,过拟合现象就会发生。这样,在学习时就要防止过拟合。进行最优模型的选择,即选择复杂度适当的模型,以达到使测试误差最小的学习目的。

word2vec技术

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。 训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。 Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。该算法渐渐被其他人所分析和解释。

随机搜索技术

特征选择技术

在机器学习和统计学中,特征选择(英语:feature selection)也被称为变量选择、属性选择或变量子集选择。 它是指:为了构建模型而选择相关特征(即属性、指标)子集的过程。

遗传算法技术

遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。 遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解可抽象表示为染色体,使种群向更好的解进化。

交叉验证技术

交叉验证,有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是定义一个数据集到“测试”的模型在训练阶段,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。

信息抽取技术

信息/数据抽取是指从非结构化或半结构化文档中提取结构化信息的技术。信息抽取有两部分:命名实体识别(目标是识别和分类真实世界里的知名实体)和关系提取(目标是提取实体之间的语义关系)。概率模型/分类器可以帮助实现这些任务。

XGBoost技术

XGBoost是一个开源软件库,为C ++,Java,Python,R,和Julia提供了渐变增强框架。 它适用于Linux,Windows,MacOS。从项目描述来看,它旨在提供一个“可扩展,便携式和分布式的梯度提升(GBM,GBRT,GBDT)库”。 除了在一台机器上运行,它还支持分布式处理框架Apache Hadoop,Apache Spark和Apache Flink。 由于它是许多机器学习大赛中获胜团队的首选算法,因此它已经赢得了很多人的关注。

独热编码技术

独热编码是将分类变量转换为可提供给机器学习算法更好地进行预测的形式的过程。 一种稀疏向量,其中:一个元素设为 1;所有其他元素均设为 0。 one-hot 编码常用于表示拥有有限个可能值的字符串或标识符。例如,假设某个指定的植物学数据集记录了 15000 个不同的物种,其中每个物种都用独一无二的字符串标识符来表示。在特征工程过程中,您可能需要将这些字符串标识符编码为 one-hot 向量,向量的大小为 15000。

信息论技术

信息论是在信息可以量度的基础上,研究有效地和可靠地传递信息的科学,它涉及信息量度、信息特性、信息传输速率、信道容量、干扰对信息传输的影响等方面的知识。通常把上述范围的信息论称为狭义的信息论,又因为它的创始人是香农,故又称为香农信息论。

聚类技术

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法。聚类分析起源于分类学,但是聚类不等于分类。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类分析内容非常丰富,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预报法等。

点击率预测技术

在在线广告中,点击率(CTR)是评估广告效果的一个非常重要的指标。因此,点击预测系统是必不可少的,并广泛用于赞助搜索和实时出价。

算术技术

算术(英语:arithmetic)是数学最古老且最简单的一个分支,几乎被每个人使用着,从日常生活上简单的算数到高深的科学及工商业计算都会用到。一般而言,算术这一词指的是记录数字某些运算基本性质的数学分支。