关于机器学习:工业级推荐系统中的特征工程

7次阅读

共计 6229 个字符,预计需要花费 16 分钟才能阅读完成。

摘要:深度学习期间,与 CV、语音、NLP 畛域不同,搜推广场景下特色工程依然对业务成果具备很大的影响,并且占据了算法工程师的很多精力。数据决定了成果的下限,算法只能决定迫近下限的水平,而特色工程则是数据与算法之间的桥梁。本文尝试总结一些在举荐场景下做特色工程的罕用套路,包含罕用的特色变换算子、Bin-Counting 技术以及特色查漏补缺的办法。

读者受害

  1. 深刻了解罕用的特色变换操作。
  2. 理解优质特色工程的判断规范。
  3. 把握举荐场景下构建高质量特色的个别办法。

一、为什么要精做特色工程

在残缺的机器学习流水线中,特色工程通常占据了数据科学家很大一部分的精力,一方面是因为特色工程可能显著晋升模型性能,高质量的特色可能大大简化模型复杂度,让模型变得高效且易了解、易保护。在机器学习畛域,“Garbage In, Garbage Out”是业界的共识,对于一个机器学习问题,数据和特色决定了机器学习的下限,而模型和算法只是迫近这个下限而已。

在一个残缺的机器学习流水线中,特色工程处于上游地位,因而特色工程的好坏间接影响后续的模型与算法的体现。另外,特色工程也是编码领域专家教训的重要伎俩。

对于特色工程的三个误区:

1. 误区一:深度学习时代不须要特色工程

深度学习技术在计算机视觉、语音、NLP 畛域的胜利,使得在这些畛域手工做特色工程的重要性大大降低,因而可能会有人感觉深度学习时代不再须要人工做特色工程。而后,在搜寻、举荐、广告等畛域,特色数据次要以关系型构造组织和存储,在关系型数据上的特色生成和变换操作次要有两大类型,一种是基于行(row-based)的特色变换,也就是同一个样本的不同特色之间的变换操作,比方特色组合;另一种是基于列(column-based)的特色变换,比方类别型特色的分组统计值,如最大值、最小值、平均值、中位数等。

模型能够肯定水平上学习到 row-based 的特色变换,比方 PNN、DCN、DeepFM、xDeepFM、AutoInt 等模型都能够建模特色的穿插组合操作。尽管如此,模型却很难学习到基于列的特色变换,这是因为深度模型一次只能承受一个小批次的样本,无奈建模到全局的统计聚合信息,而这些信息往往是很重要的。综上,即便是深度学习模型也是须要精准特色工程的。

2. 误区二:有了 AutoFE 工具就不再须要手工做特色工程

3. 误区三:特色工程是没有技术含量的脏活累活

很多学生和刚加入工作不久的共事会有一种偏见,那就是算法模型才是高大上的技术,特色工程是脏活累活,没有技术含量。因而,很多人把大量精力投入到算法模型的学习和积攒中,而很少化工夫和精力去积攒特色工程方面的教训。其实,算法模型的学习过程就好比是西西弗斯推着石头上山,石头最终还会滚落下来,这是因为算法模型的更新迭代速度太快了,总会有效率更高、成果更好的模型被提出,从而让之前的积攒变得无用。另一方面,特色工程的教训积淀就好比是一个滚雪球的过程,雪球会越滚越大,最终咱们会成为一个业务的领域专家,对业务奉献无可代替的价值。

机器学习工作流就好比是一个厨师做菜的过程,简略来说,荡涤食材对应了荡涤数据,食材的去皮、切片和搭配就对于了特色工程的过程,食物的烹饪对应了模型训练的过程。如果你感觉数据荡涤和特色工程不重要,莫非是你想吃一份没有通过荡涤、去皮、切片、调料,而间接把原始的带着泥沙的蔬菜瓜果放在大锅里乱炖进去的“菜”? 先不说卫生的问题,能不能弄熟了都是个问题。

十分倡议大家浏览一下这篇文章《带你轻松看懂机器学习工作流——以“点一份披萨外卖”为例》。

二、什么是好的特色工程

高质量特色须要满足以下规范:

  1. 有辨别性(Informative)
  2. 特色之间互相独立(Independent)
  3. 简略易于了解(Simple)
  4. 伸缩性(Scalable):反对大数据量、高基数特色
  5. 高效率(Efficient):反对高并发预测
  6. 灵活性(Flexible):对上游工作有肯定的普适性
  7. 自适应(Adaptive):对数据分布的变动有肯定的鲁棒性

参考:《何谓好的特色》

三、罕用的特色变换操作

1. 数值型特色的罕用变换

a) 特色缩放

为什么要做特色缩放?

如果不做特色缩放,取值范畴较大的特色维度会摆布梯度更新的方向,导致梯度更新在误差超平面上一直震荡,模型的学习效率较低。另外,基于间隔度量的算法,如 KNN,k-means 等的成果也会很大水平上受到是否做特色缩放的影响。不做特色缩放,取值范畴较大的特色维度会摆布间隔函数的计算,使得其余特色失去本应有的作用。

罕用的特色缩放办法如下:

只管这些特色缩放的办法操作起来都很简略,属于一学就会的内容,但想要达到纯熟利用的水平还是比拟难的,须要有肯定的业务教训的积攒,“知行合一”是一种很高的境界。关键在于是否晓得在什么场景下该用什么样的特色缩放办法。上面咱们通过几个思考题来测试一下本人的把握水平。

思考题 1:如何量化短视频的风行度(假如就用播放次数来代替)?

参考答案:短视频的播放次数在整个样本空间上遵循幂律散布,大量热门的视频播放次数会很高,大量长尾的视频播放次数都较少。这个时候比拟好的做法是先做 log based 的变换,也就是先对播放次数取 log,再对 log 变换之后的值做 z -score 标准化变换。如果不先做 log 变换,就间接做 z -score 或者 min-max 变换,会导致特征值被压缩到一个十分狭隘的区域。

思考题 2:如何量化商品“贵”或者“便宜”的水平

参考答案:商品的价格自身无奈掂量商品“贵”或“便宜”的水平,因为不同品类的商品价格区间原本就可能差别很大,同样的价格买不同类型的产品给顾客的感触也是不一样的,比方,1000 块钱买到一部手机,顾客感觉很便宜;但同样 1000 块钱买一只鼠标,顾客就会感觉这个商品的定价很贵。因而,量化商品“贵”或者“便宜”的水平时就必须要思考商品的品类,这里举荐的做法是做 z -score 标准化变动,但须要留神的是 商品价格的均值和标准差的计算都须要限度在同品类的商品汇合内

思考题 3:如何量化用户对新闻题材的偏好度

参考答案:为了简化,假如咱们就用用户一段时间内对某类新闻的浏览数量示意用户对该类新闻题材的偏好度。因为不同用户的活跃度是不同的,有些高活跃度用户可能会对多个不同题材的新闻浏览量都很大,而另一些低活跃度的用户可能只对无限的几种类型的新闻有中等的浏览量,咱们不能因为高活跃度的用户对某题材的浏览量大于低活跃度用户对雷同题材的的浏览量,就得出高活跃度用户对这种类型的偏好度大于低活跃度用户对同类型题材的偏好度,这是因为低活跃度用户的尽管浏览量较少,但却简直把无限精力全副奉献给了该类型的题材,高活跃度的用户尽管浏览量较大,但却对多种题材“雨露均沾”。倡议做 min-max 归一化,但须要留神的是计算最小值和最大值时都限度在以后用户的数据上,也就是 依照用户分组,组内再做 min-max 归一化

思考题 4:当存在异样值时如何做特色缩放

当存在异样值时,除了第 6 种 gauss rank 特色变换办法外,其余的特色缩放办法都可能把转换后的特征值压缩到一个十分狭隘的区间内,从而使得这些特色失去区分度,如下图。这里介绍一种新的称之为 Robust scaling 的特色变换办法。$$x_{scaled}=\frac{x-median(x)}{IQR}$$

四分位距(interquartile range, IQR),又称四分差。是形容统计学中的一种办法,以确定第三四分位数和第一四分位数的差值。

参考答案:存在异样值,应用 Robust scaling 或者 gauss rank 的特色缩放办法

b) 特色分箱(binning)

数值型特色的分箱即特色离散化,依照某种办法把特征值映射到无限的几个“桶(bin)”内。

比方,能够把 1 天 24 个小时依照如下规定划分为 5 个桶,使得每个桶内的不同工夫都有相似的指标预测能力,比方有相似的购买概率。

  1. 0-3 Night: 较低的购买概率
  2. 4-7 Early morning: 中等的购买概率
  3. 8-14 Morning/Lunch: 较高的购买概率
  4. 15-20 Afternoon: 较低的购买概率
  5. 21-23: Evening: 高购买概率

为什么须要做特色分箱?

  1. 映入非线性变换,可加强模型的性能
  2. 加强特色可解释性
  3. 对异样值不敏感、避免过拟合
  4. 分箱之后能够对不同的桶做进一步的统计和组合(与其余特色的穿插)

有哪些分箱办法?

  • 无监督分箱

    • 固定宽度分箱(等宽)
    • 分位数分箱(等宽)
    • 对数转换并取整(对数)
  • 有监督分箱

    • 卡方分箱
    • 决策树分箱

思考题 1:如何度量用户的购买力?如何给用户的购买力划分档位?

背景:用户的购买力掂量的用户的生产偏向,度量用户是违心花高价买高质量商品还是违心花高价买便宜商品。购买力属于用户画像的一部分,是比拟长期的稳固的,跟近期用户在平台上的生产金额无关。

参考答案:
第一步是给商品划分价格档位。依据商品的类目分组,组类依照商品价格排序,并依照等频或者等宽的分箱形式,失去价格档位。
第二步是聚合用户的购买力档位。依据用户的历史消费行为,把购买商品的价格档位聚合到用户身上。

思考题 2:地理位置(经纬度)如何做分箱?

参考答案:一个物理量如何有多个维度能力示意,那么在做分箱时不能拆分成独立的多个变量来独自做分箱,而要这些变量当成一个整体来思考。经纬度的分箱有一个成熟的算法叫做 GeoHash,这里就不开展了。

在举荐零碎中,用户的统计特色须要依照用户分组后再做分箱,不倡议全局做分箱。在下面的例子中,Bob 对不同 Category 的行为次数都比拟高,但却“雨露均沾”,不如 Alice 对 Beauty 类目那么专一。如果全局分箱,<Alice, Beauty>、<Bob, Sport> 的桶号是不同的,然而 Alice 对 Beauty 类目标偏好水平与 Bob 对 Sport 类目标偏好水平是差不多的,这两个类目都是彼此的首选。全局分箱会让模型学习时比拟困惑。

2. 类别型特色的罕用变换

a) 穿插组合

如上图,mean 示意预测指标 target(二分类)的均值,特色 f1 和 f2 独自存在时都不具备很好的辨别性,但两种组合起来作为一个整体时却可能对 target 有很好的预测性。

如上图,当只有 $x_1$ 和 $x_2$ 时,指标(用蓝色和黄色别离示意正样本和负样本)不是线性可分的,当引入一个组合特色 $x_3=x_1x_2$ 时就能够用 $sign(x_3)$ 来预测指标了。

b) 分箱(binning)

高基数(high-cardinality)类别型特色也有必要做特色分箱。这是因为高基数特色绝对于低基数特色处于摆布位置(尤其在 tree based 模型中),并且容易引入乐音,导致模型过拟合。甚至一些值可能只会呈现在训练集中,另一些可能只会呈现在测试集中。

类别型特色的分箱办法通常有如下三种:

  1. 基于业务了解自定义分箱规定,比方能够把城市划分为华南区、华北区、华东区等。
  2. 基于特色的频次合并低频长尾局部(back-off)。
  3. 基于决策树模型。

c) 统计编码

  1. Count Encoding

统计该类别型特色不同行为类型、不同工夫周期内的产生的频次。

  1. Target Encoding

统计该类别型特色不同行为类型、不同工夫周期内的指标转化率(如指标是点击则为点击率,如指标是成交则为购买率)。
指标转化率须要思考置信度的问题,当置信度不够的时候,须要做平滑,拿全局或者分组的均匀转化率当以后特色的转化率做一个平滑,公式如下。

  1. Odds Ratio

劣势比是以后特色取值的劣势(odds)与其余特色取值的劣势(odds)的比值,公式为:$$\theta=\frac{p_1/(1-p_1)}{p_2/(1-p_2)}$$

假如用户对类目标行为统计数组如下:

User,Category Number of clicks Number of non-clicks
Alice,1001 7 134
Bob,1002 17 235
Joe,1101 2 274

那么劣势比的计算方法如下:
$$\frac{(5/125)/(120/125)}{(995/19875)/(18880/19875)}=0.7906$$

  1. WOE(weight of evidence)

WOE 度量不同特色取值与指标的相干水平,越正示意越正相干,越负示意越负相关。

$$WOE=ln\left(\frac{Event\%}{NonEvent\%} \right)$$

3. 时序特色

  • 历史事件分时段统计

    • 统计过来 1 天、3 天、7 天、30 天的总(均匀)行为数
    • 统计过来 1 天、3 天、7 天、30 天的行为转化率
  • 差别

    • 环比、同比
  • 行为序列

    • 须要模型配合

四、搜推广场景下的特色工程

在搜寻、举荐、广告场景下高基数 (high-cardinality) 属性示意为特色时的挑战

  • Scalable: to billions of attribute values
  • Efficient: ~10^(5+) predictions/sec/node
  • Flexible: for a variety of downstream learners
  • Adaptive: to distribution change

为了克服这些挑战,业界最罕用的做法是大量应用统计特色,如下:

对各种类别型特色或离散化之后的数值型特色,以及这些特色之间的二阶或高阶穿插组合,依照不同行为类型、不同工夫区间、不同指标(针对多指标工作)别离统计正样本和负样本的数量。这些统计量通过特色缩放 / 分箱和指标编码后能够作为最终特征向量的一部分。举荐的特色缩放办法为gauss rank,或者应用分箱操作。举荐的指标编码方法包含 Target Encoding、劣势比、WOE 等。

在统计正负样本数量之前,须要对工作波及的不同实体(如,用户、物品、上下文等)进行分箱,再统计分箱变量的正负样本数量。该操作方法叫做 bin counting。这里的binning 操作能够是任意的映射函数,最罕用的依照实体的天然属性来分箱,比方商品能够依照类目、品牌、店铺、价格、好评率等属性分箱,用户能够依照年龄、性别、职业、喜好、购买力等分箱。

另外,为了避免 label leakage,各种统计量的统计时间段都须要放在在样本事件的业务工夫之前( 留神图片下方的时间轴)。最初把各种粒度的统计量解决(缩放、分箱、编码等)后的值拼接起来作为特征向量的一部分。

那么,怎么样能力把所有可能的特色都想全了,做到不重不漏呢?能够依照如下形容的结构化办法来枚举特色。

  1. 列存实体(entity);如果广告业务场景的用户、广告、搜索词、广告平台。
  2. 实体分箱 & 单维度统计 / 编码
  3. 特色穿插 & 多维度统计 / 编码

对实体分箱能够玩出很多花色,比方能够从文本形容信息中抽取关键词作为分箱后果;或者能够基于 embedding 向量聚类,聚类的后果簇作为分箱后果。而后须要对这些分箱后果进行多轮两两穿插失去二阶、三阶或更高阶的组合特色。最初,对这些单维度(一阶)特色和各种高阶组合特色别离统计不同行为类型(点击、珍藏、分享、购买等)、不同工夫周期(最近 1 天、3 天、7 天、30 天等)、不同学习指标(点击、转化等)下的正、负样本数量,对这些统计量进行特色缩放、分箱、编码后作为最终的特色。

五、总结

搜推广场景下的罕用特色工程套路能够总结为一个词“bin-counting”,也就是先做binning,再做counting,当然别忘了做cross counting

原文链接:https://zhuanlan.zhihu.com/p/518308463

本文由 mdnice 多平台公布

正文完
 0