特征工程沉思录
1.综述
More data beats clever algorithms, but better data beats more data“,更多的数据打败聪明的算法,更好的数据打败更多的数据。这也是在强调特征工程的重要性。
如何评估一个特征,这个可以用于特征选择
“引入了某个信息量很大的特征之后,模型效果提升明显。“这里的信息量是对特征的修饰,代表着引入了这个特征,提高了模型预估的准确性,降低了算法预估的不确定性。
“特征A的信息量比特征B的信息量更大。”这里是引入特征A和引入特征B相比,引入特征A对于模型效果提升更加明显。
”引入新特征效果不明显,新特征信息量几乎为零。“这里的意思是新的特征中蕴含的信息在老的特征中已有,所以引入新的特征没有意义。
我在考虑各种算法系统的时候,都是在用信息量的视角去思考的,哪些处理可以更好利用信息量,哪些数据引入可以更大程度提高信息量。
1.1了解有哪些坑
非常的最前面提到的谷歌的那篇论文,写得是真的很好。自己实践中无数的痛点
把一个机器学习算法用到工程上,有多少隐藏的坑,首先必阅读
1.2 DL cheatsheet
https://stanford.edu/~shervine/teaching/cs-229/cheatsheet-deep-learning
1.3 书籍的知识体系(精通特征工程)
1.4 其它人的总结
1.特征工程精囊
<一些很实用的特征工程技巧>
https://github.com/Pysamlam/Tips-of-Feature-engineering2.阿里的特征交叉
想为特征交互走一条新的路 - 周国睿的文章 - 知乎 https://zhuanlan.zhihu.com/p/287898562
2.评估
okay...那感觉这个新特征也不是特别显著的重要性啊。要我做的话会针对性看这个特征可能带来收益的各个分组的指标变化,比如新加特征是希望区分年龄组的,就看下各个年龄组的acc/auc前后的变化看是否有效果。
2.1. 影响点击率的主要特征
什么是“主要特征”?如果该特征取不同的值可能会导致点击率有十倍百倍的差异,且该特征的不同取值在样本中的占比都比较大。按照这个定义,你可能会发现like_words和key_words的交集并不是主要特征,而图书的展现位置才是,第2页的点击率跟第一页的点击率可能会差10倍之多。
如果不把主要特征加进来,模型可能就是失效的。
2.2. 把统计特征换为表态特征
如果某些比较好的特征甚至是主要特征,刚好是统计类特征,怎么办?尽量找到表态特征替代它。举例:
用户过去1个月登录过几次 --> 用户的app版本号。这两个特征都可以把比较活跃和非常不活跃的用户区分开。
用户下单频率 --> 用户的会员等级。这两个特征都可以把经常购物和不经常购物的用户区分开。
3. 数据清洗
3.1. word2vec 特征构建
构建 session 过程中怎么过滤异常的数据?
答:这里我提出几个比较典型的异常情况:
- 异常点击 ( 时间太短的点击 )
- 异常 item ( 更新异常频繁的 item )
- 异常用户 ( 点击量异常多的 user )
3.2 Two tower 中的 user scene vector 和 item scene vector 的区别?
答:这两个是 user 和 item 的 feature field,可以根据需要进行整理。比如 user scene 包括 location、time、event、weather 等, item scene 包括 location、upload、division 等
4.基础特征
4.1.特征分类
User类:用户长期画像
Item类:物料画像
4.2 特征形式
数值特征:文章长度,点赞数;
类别特征(Onehot):比如,内容类型;
Multihot:内容多个话题 id;
Onehot with weight:用户对单类型内容的感兴趣程度; 对厅室的偏好程度
Multihot with weight :用户对各话题的感兴趣程度;对价格的皮那好
item维度的特征:热度、收藏数、收藏率、类目、标签
用户出现的总次数和天数
用户点击广告的总次数
用户点击不同广告、产品、类别、素材、广告主的总数
用户每天每条广告点击的平均次数,均值和方差
概率分布特征:
统计每个广告受众人群的性别年龄分布 => (平均) 该用户性别年龄的概率分布
【TO DO】=> 统计与他相似帖子的展现次数,看看差距
4.3 连续型特征
4.3.1. ctr平滑(Wilson CTR vs 贝叶斯)
你这个用置信下界做估计,只考虑了高估的情况,没有考虑低估啊,比如10个曝光没有一个被点击,他的真实CTR就一定是0吗?感觉应该用贝叶斯来解决啊
4.4. 类别特征
决策树中的类别特征问题(关于label encode还是one-hot的讨论)
https://blog.csdn.net/m0_37870649/article/details/104551969
如何用通俗的语言解释CTR和推荐系统中常用的Feature Hashing技术以及其对应的优缺点? - DOTA的回答 - 知乎 https://www.zhihu.com/question/264165760/answer/1649994007
4.4.1 用户特征
uid的出现次数+uid的转化率就可以完美表达uid了吗?其实也不一定就是足够了,但是也比较接近无损了。
age,它会有两列特征,即age的出现次数和转化率。age与其他特征做组合时,比如和aid做组合,也会有两列特征来进行表示。由此可以得到800多维的特征,然后利用机器优势,抽样了2000w条用lgb训练,进行特征重要性排序。
4.4.2 文本特征
文章内容特征包括文章和标题的关键词、实体词、topic、tag、长短;
4.4.3 富媒体特征
5.特征处理
特征处理方式
1) 分桶:等距/等频, 如年龄等距分桶,播放量等频分桶
2) 截断/缩放/平滑:长时长截断/不同类型样本时长缩放/点击率平滑
3) 加降权:强征反馈如分享收藏样本加权,热门样本降权
4) 特征哈希:基本所有特征值都可以做此处理
5.1 特征处理函数
5.2 特征如何交叉
5.3 用户画像
标签权重
一个用户标签表里面包括常见的字段如:用户id、用户姓名、标签id、标签名称、用户与该标签发生行为的次数(如搜索了两次“大数据”这个关键词)、行为类型(不同的行为类型对应用户对商品不同的意愿强度,如购买某商品>收藏某商品>浏览某商品>搜索某商品),行为时间(越久远的时间对用户当前的影响越小,如5年前你会搜索一本高考的书,而现在你会搜索一本考研的书)。
最后非常重要的一个字段是标签权重,该权重影响着对用户属性的归类,属性归类不准确,接下来基于画像对用户进行推荐、营销的准确性也就无从谈起了。
5.3.1. 权重算法1-TF-IDF
比如说我们这里有3个用户和4个标签,标签和用户之间的关系将会在一定程度上反应出标签之间的关系。
这里我们用w(P , T)表示一个标签T被用于标记用户P的次数。TF(P , T)表示这个标记次数在用户P所有标签中所占的比重,公式如下图:
对上面的图来说,用户1身上打了标签A 5个,标签B 2个,标签C 1个,那么用户1身上的A标签TF=5/(5+2+1) 。
相应的IDF(P , T)表示标签T在全部标签中的稀缺程度,即这个标签的出现几率。如果一个标签T出现几率很小,并且同时被用于标记某用户,这就使得该用户与该标签T之间的关系更加紧密。
然后我们根据TF * IDF即可得到该用户该标签的权重值。到这里还没结束,此时的权重是不考虑业务场景,仅考虑用户与标签之间的关系,显然是不够的。还需要考虑到该标签所处的业务场景、发生的时间距今多久、用户产生该标签的行为次数等等因素。我用个图总结下:
关于时间衰减的函数,根据发生时间的先后为用户行为数据分配权重。
时间衰减是指用户的行为会随着时间的过去,历史行为和当前的相关性不断减弱,在建立与时间衰减相关的函数时,我们可套用牛顿冷却定律数学模型。牛顿冷却定律描述的场景是:一个较热的物体在一个温度比这个物体低的环境下,这个较热的物体的温度是要降低的,周围的物体温度要上升,最后物体的温度和周围的温度达到平衡,在这个平衡的过程中,较热物体的温度F(t)是随着时间t的增长而呈现指数型衰减,其温度衰减公式为:
F(t)=初始温度×exp(-冷却系数×间隔的时间)
其中α为衰减常数,通过回归可计算得出。例如:(多久降低到一半的初始权重 < 0.5)指定45分钟后物体温度为初始温度的0.5,即 0.5=1×exp(-a×45),求得α=0.1556。
5.3.2. 相关系数矩阵
一个词语的重要性随着它在该文章出现的次数成正比,随它在整个文档集中出现的次数成反比。
用户1身上打上了5个A标签、2个B标签、1个C标签;用户2身上打上了4个A标签,3个B标签;用户3身上打上了4个C标签、1个D标签。
那么同时打上A、B标签的用户有两个人,这就说明AB之间可能存在某种相关性,当用户量、标签量级越多时,标签两两之间的相关性也越明显.
6.特征生成算法
6.1 DFS(Deep Feature Synthesis )
Feature Tools 实现了这个算法,一个自动生成特征的工具,应用于关系型数据,对生成关系型特征有一些帮助。
https://www.shuzhiduo.com/A/1O5Enpe8d7/
思想来源于paper:
http://www.jmaxkanter.com/static/papers/DSAA_DSM_2015.pdf
Deep Feature Synthesis(DFS)目前在自动特征构建领域是做的比较好的显式特征组合的方法。DFS主要处理关系型数据,能够从中自动生成特征。本质上该算法遵循数据中基本字段的关系链路,然后沿该路径依次应用数学函数以创建最终特征。很多业务数据都是以关系型数据的形式存在,以电商数据为例,可以抽象出用户、商品、订单三类基本实体。实体会带有属性(即字段或特征),实体之间会存在关联(以某个字段为键)。 人工特征工程的过程就是针对业务中的实体的属性,经过一些运算得到的一些特征。然后根据关联关系,将与之关联的实体的特征也关联进来,经过一些运算得到两个相关联的实体的特征。以电商数据为例,用户本身带有年龄、性别、城市、职业等属性,对这些属性做一些运算(比如离散化、分桶)得到用户特征。之后,对用户关联的订单实体,也能够提取一些订单级别的特征,比如该用户的购买力、购买频次、上次购买时间等。进而,循着订单中的商品外键,可以连接到商品实体,得到商品级别的特征,比如用户购买商品的喜好、购买某些产品的频次。
这个过程就是沿着关联路径,最后全部关联到uid上,得到用户特征。同理,也可以使用这种方式构建商品特征。
DFS将特征分为两种:
1、Entity feature, 仅依据Customer表中的数据计算特征,计算出的特征简称efeat;
2、Ralated feature, 依据Customer表和其他表的关系计算特征,relation又为两类,一是forward relation, 即一对一的关系,比如 一个Order只对应一个Customer,二是 backward relation,即一对多的关系,比如 一个Customer对应多个Order。 假设我们不是对Customer计算特征,而是对Order计算特征,这时Customer和Order是forward relation,可以直接把Customer的字段加到Order表中,然后再计算各种特征,这样计算得到的特征简称 dfeat; 如果是针对Customer计算特征,Customer和Order是backward relation,此时就需要先计算相同Customer的不同Order的特征值(比如 sum, max, min, mean, std等),计算得到的特征简称rfeat。
之后,就能根据父子关系计算rfeat和dfeat,把rfeat和dfeat合并到parent表中,计算parent的efeat。递归实现这些操作,也就是自底向上累积计算特征。伪代码如下
6.2. AutoCross/Beam search
这个算法来自KDD2019《AutoCross: Automatic Feature Crossing for Tabular Data in Real-World Applications》。主要思路是先生成一部分二阶组合特征,然后用效果好的二阶组合特征去衍生三阶组合特征,并非生成所有的三阶组合特征。相当于一种贪心的搜索方法;
6.3. 特征构造网络FGCNN
华为诺亚方舟实验室2019年WWW会议的论文
《Feature Generation by Convolutional Neural Network for Click-Through Rate Prediction》。
https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1904.04447.pdf
解决特征交时的数据稀疏性;目前做网络直接交给后续的多层NN进行挖掘特征的交互信息是远远不够的。论文结合了在图像领域抽取局部信息特征的卷积结构(CNN)提出了一种叫做Feature generation的结构,自动的从原始特征中进行特征的组合,将组合后的特征和原始特征进行拼接feed到后续的深度网络结构中,并证明了模型的有效性;
7.特征经验
7.1 特征处理方式
7.2 特征tips
做特征归一化操作,发现有特别大的值,比如几万或者几十万,要先取 log ,不然会导致这个特征大部分值都趋向0,相当于征失效;
输入特征要做非法检查,防止出现 inf,nan,而导致模型训练出现异常的参数;
对于线上的每次请求,用户特征都是一样的,可以只计算一遍用户特征相关的 block,避免冗余运算;
对用户能直接感知到的特征,我们要优先使用
- LR是我们最常使用的,所以在做点击模型时,自然也是先上了LR,但是线上效果并不好。后来上FM,效果却好的出奇。
- 如果登录过我们的网站,很容易发现原因:展示的场景,只能看到头像、地区、年龄等几个属性,LR使用了大量用户看不到的特征,这些特征对于模型来说是没有意义的。
8. 模型经验
8.1 DCN
8.1.1. 特征组合[上DCN]
(1) 重要的特征都是与应用场景息息相关的,针对每一种应用场景,工程师们都需要首先花费大量时间和精力深入了解数据的规律之后才能设计、提取出高效的高阶交叉特征,因此人力成本高昂;
(2) 原始数据中往往包含大量稀疏的特征,例如用户和物品的ID,交叉特征的维度空间是原始特征维度的乘积,因此很容易带来维度灾难的问题;
(3)人工提取的交叉特征无法泛化到未曾在训练样本中出现过的模式中。
因此自动学习特征间的交互关系是十分有意义的。目前大部分相关的研究工作是基于因子分解机的框架,利用多层全连接神经网络去自动学习特征间的高阶交互关系,例如FNN、PNN和DeepFM等。其缺点是模型学习出的是隐式的交互特征,其形式是未知的、不可控的;同时它们的特征交互是发生在元素级(bit-wise)而不是特征向量之间(vector-wise),这一点违背了因子分解机的初衷。来自Google的团队在KDD 2017 AdKDD & TargetAD研讨会上提出了DCN模型,旨在显式地学习高阶特征交互,其优点是模型非常轻巧高效,但缺点是最终模型的表现形式是一种很特殊的向量扩张,同时特征交互依旧是发生在元素级上。
9. 实际经验
9.1 其它人经验
特征工程的黑色艺术 | https://zhuanlan.zhihu.com/p/144488073 |
---|---|
有哪些精彩的特征工程案例? | https://www.zhihu.com/question/400064722/answer/1308358333 |
特征处理之使数据分布逼近正态分布 | https://blog.csdn.net/qq_36653505/article/details/86618648 |
9.2 构建细粒度特征
在绝大多数推荐类别的比赛场景中,如果仅仅是为了取得不错的成绩,有一个比较简单的特征挖掘思路:越细粒度的特征越重要,时间越近的特征越重要,未来的特征简直无敌。
而粗粒度的特征一般为年龄、性别等特征。这些特征的类别比较少,显然是很难满足个性化推荐中的“个性化”三个字的。而在本次比赛中,interest、topic、keyword的粒度都比较细,所以它们的重要程度是要比性别等要高的。我们在进行特征组合的时候,其实也是在将特征的粒度变细。比如aid只有173维,age有3维,特征组合之后变成了173*3,这个时候粒度就变细了。粒度越细,越容易定位到某一个单独的用户。显然,本次比赛中,粒度最细的特征就是uid了。uid的行为特征就是一个很强的特征。所以围绕uid做特征挖掘的队伍,一般都在前30了
评论
发表评论