特征工程到底是什么？
前两天刷某知名社交软件的时候看到有人问特征工程现在还重要吗？觉得是个很有意思的事情。其实工业界能够支持的起大规模稀疏向量的场景大概并不是想象中的那么多，大多数场景面对极为稀疏的行为数据下都很难在ID层面得到很好的emb表达。在这个前提下，没有好的特征工程，其余的模型结构优化或者各种花里胡哨的模型结构都是纸上谈兵。真正被小场景捶打过的朋友，比如我，绝对会在一次又一次的生活毒打中明白，抛弃那些ppt上的高级多塔多注意力，直面特征工程的人生吧！ 有竞赛经验的小伙伴都明白，一个强特能一飞冲天，一个灵机一动能直上top榜。但是，长久的可持续的特征工程决不能够靠简单的灵机一动来实现，特别是当手上有无数的芝麻大小的场景时，一个系统的特征工程思维就尤为重要了。本文将从以下几个方面来阐述特征工程中的方方面面。提前说明的是，一般的特征工程常用方法，例如one-hot，hash-encoding，分桶等等不会作为本文的重点，因为这是器的维度，文末有一篇非常全面的文章供参考，本文主要聚焦在术的维度，也就是怎么去思考和选用方法的层面。首先，我会给出一个特征工程树，这个属于一个主流版本，希望在屏蔽场景特殊性的情况下，给出一般场景的思考方法。接下来，我会介绍上文提到的特征树的细节，包括涉及到的具体特征例子。第三部分，则包括特征之间可能存在的相互作用和不同特征适合的模型类型。最后，我给出了一个具体场景的具体例子，并说明这个场景的一般性和特殊性，给出针对具体业务场景的特征工程思路。 此外，一个基础认知是，这里的特征是指输入模型的信息，包括偏置或者先验，这些特征的使用方式除了作为模型的输入，也可以通过其他的方式引入，例如样本工程或者损失函数，这个就不在本文讨论范围之内了。当然还是那句老话，个人的认知是有限的，欢迎有经验的小伙伴交流和指正。 不管是基于已有的模型迭代优化，又或者是从0到1构建一个场景的全部特征，都需要自己梳理一个完整的基础特征树。这是了解一个场景的开始。做这件事情我推荐的方法是先体验这个场景，然后分类列出所有可能影响你优化目标决策的因素以及优化目标的历史信息。比如优化目标是用户是否到达，那么用户到达这个事情可能因为他本身的原因，他是否有这个场景的刚性需求，也可能因为承接场景的消费体验决定，如果他在这个场景下消费的很快乐，那他也更乐意来，也有可能因为场景发推送或者红包决定。这些因素就是特征树的base版本。对于绝大多数业务来讲，基础的特征树都可以分为以下3大部分。 有了上面的整体结构就能一定程度上保证大的方向上不会有遗漏，接下来就是如何细化每一个部分，确保不会在每一个大类下有遗漏。 对于特征树上每一个分支，做细做扎实也是一个非常花时间和资源的事情，需要有足够的数据敏感度和一些辅助技巧。 针对用户侧，通常会包括用户的自然属性和历史行为属性。自然属性比如性别学历等，甚至可以是一些用户聚类之后的自然属性结果，例如某个维度下的用户聚类簇或者前置模型的打分结果。用户的历史属性则包括 用户的统计属性和用户的历史行为序列，前者在用户行为较稀疏的情况下非常好用，后者在一些行为密集的情况下结合一些深层的网络结构能拿到不错的效果，但是这一点对于工程架构的要求就比较高了，因为行为序列通常会结合实时性获取不错的效果，但会引入线上的复杂性。 针对消费侧，依然还是这两类特征，item本身的自然属性和item的历史统计特征，item的自然属性通常是多模信息和一些生产者测的信息，前者包括标题/文本信息，标签信息，类目信息，后者也包括生产者的一些统计信息和标签类目信息。当然item侧的行为统计特征也很重要，特别是针对预测目标的不同时间窗口的行为值/率统计。 针对上下文的就跟场景的关系很强了，在有些场景下，不同item是几乎没有场景差异性的，例如推送，不同item之间在展示上的差异性很小。而有些场景下则差异性较小，例如单流推荐，用户在刚开始进入和消费了一段时间之后的心态差异是比较大的，因此存在首屏优化相关的工作。但有些场景下则有明显的位置差异或者相关性差异，例如多流或者大屏推荐。这些差异点都需要去琢磨每一个不同场景来体会。 另外一个最重要的就是交叉特征了。这块虽然学术界有很多自动特征交叉的方法，也给了很多高级的理论解释，但整体还是相对比较黑盒的，各种先进的方式方法可以去尝试，但是不要迷信。因此这里的交叉并不仅仅局限于在模型输入测的各种乘法or矩阵运算or attention运算，也包括在前置阶段的各种统计特征，特别是在行为密度较低情况下的场景，手动交叉的效果往往更好。因为这种场景泛化性的作用远大于记忆性。特别是一些用户对于item的上卷交叉，绝对是重中之重，例如用户对item的行为上卷到类目或者生产者的统计特征。 本小节会分享一些特征使用中经常遇到的问题和对应的解决方法，虽然这些方法在不同场景下的作用也存在很大差别，总体都是在特征使用过程中非常容易遇到的问题。 如何确定特征的重要性。当我们根据上文提到的基础特征树在缕每一个部分的时候，很容易遇到的问题是，这个特征我猜测/直觉它很有用，那么我应不应该把它加进去，如何评估它的效果。当然最简单的方式就是直接加进去做ab，这种方法从结果上来讲当然是最能够说明问题的，但是并不是一个非常好的做事方式，因为那样其实就是一个简单的ab机器，同时如果线上资源紧张的情况下是很难做大规模迭代的。因此这里介绍几种简单的方法，第一个，大部分特征其实还是统计特征或者类别特征。对于这种特征，可以直接用相关系数or分类别直接查看不同的特征的group的转化情况是否有非常明显的差异，并思考这个差异是特征是优化目标的原因导致的还是特征作为跟建模目标有强相关关系导致的，这种分析会让你对整个业务的理解更加深入，有时候能引导发现下一个强有力的特征。这里引用另外一个关于特征工程文章里我非常认可的一句话： “如果一个特征重要性表里存在一个我们原本认为应该无关紧要的特征却有很高的重要性，其实就可以增强我们对业务的理解，我们需要从业务角度思考为什么这个特征有好的效果，然后从业务角度上去做一个更好的特征。 比如特征重要性表里category A 和 numeric B特征都很重要，虽然无论树模型还是深度学习模型都已经有很强的特征交叉能力了，但经过业务分析，其实是 A_mean_B特征影响结果，原始的A和B还是不如我们直接把A_mean_B做出来效果好。” 举个简单的例子，在做相关推荐时，如果发现用户在是否点击侧边栏这件事情上跟用户当前的兴趣点十分相关，那么重要的特征就是当前观看的feed和待推荐feed，这两者都很重要，但是，业务的分析发现两者在类目上的匹配度跟最终的转化指标存在非常正向的强相关关系，那么不如直接把这个特征做出来，从而让模型更好的学习到两者关系对于最后预测目标的影响，事实是果然这个交叉特征会比直接从模型结构层面上的交叉获取更好的线下和线上效果。 连续特征是否需要分桶的问题。有很多细节需要注意，例如，如果一个特征根本没有什么异常值，线上接口拉到的异常值都是一个值，或者可取值的范围并不大，也就是字典数量很小，那么其实并没有一定要做这个操作的理由，线上效果也并不会差的太多。但如果特征本身的数值的可选值非常大，例如ratio类型的特征且没有做小数点截断或者截断的位数很大，那么大字典的特征无论如何收敛起来都是比较困难的，此时做特征分桶就非常有必要。但要注意的是，这一切的前提是特征用于nn类模型，如果是树模型，可能对于这些根本不敏感。 大规模离散特征怎么用的问题。什么时候ID特征才能加上，这是一个没有准确回答的问题。取决于每个场景下用户的行为是否密集，也取决于是否有良好的工程支持。业界的两个巨大无比的id特征往往聚焦在userID和itemID身上，大部分情况下，itemID的维度相对于userID会小很多，因此在不会有非常大变化的情况下一般是可以直接加进去模型的，item容易遇到的问题在于，有些场景下的item变化比较频繁，比如一些优惠套餐或者热点内容，通常会面临频繁的上下线，因此导致的新内容冷启动问题比较严重，这里可能需要一些前置的聚类处理或者是跨域迁移的问题。而userID就是被广为讨论经久不衰的问题了，业界的处理办法也挺多，但是很多都跟工程紧耦合在一起，例如特征训练次数阈值截断或者新老用户分流的方法。 上文讲述了一下基本的特征使用和思考方式，这里举一个比较实际的例子。用户到达模型就是一个很基础的例子，基本上是所有用户增长都会遇到的一个场景。 在没有外部干预的情况下的到达预估模型就更加偏重于用户的行为习惯预测，而带干预的用户到达模型就其实是一个干预反馈模型，干预的不同种类如果有较大差别则更会使得特征树版本向另外一个方向发展。 第一种完全不带任何干预的用户到达模型特征其实是一个只有单侧信息的特征树，因为在整个问题的定义中用户不受哪一次具体的推荐干预影响，因为不太存在具体的供给侧的信息，是一个单纯对用户的建模，那么就需要重点聚焦在那些信息能够反映用户在某一个时间窗口内是否会到达，这里一个非常显而易见的方向就是用历史预测现在，如果用户过去活跃度非常高，那么他今天到达的概率也会很高，因此需要充分挖掘用户的过往行为和活跃程度，尽可能充分刻画这一方面对于提升模型效果大有裨益。而带干预的用户到达模型则更为复杂一些，干预可能是浮窗，气泡，短信，红包，优惠券等等，在研究如何刻画这些干预之前，首先应该是尝试探索干预的上下限，再确定投入的人力，不过这些都是其他的内容。在聚焦特征这方面，对于不同的类型可能差别也不小，对于一些没有太大差异的干预，例如一个不带任何信息的红点，其实也没有什么好刻画的，区别就是有和没有，也没有太多供给侧信息，但是对于有非同质的干预，例如不同类型的红包面额，不同的文字推送消息，则需要尽可能的刻画充分，因为不同的干预带来的影响差别可能很大，例如不同文案的后验效果指标和文案本身的一些属性。 本文大概分享了一些在特征工实践中的一些方面，当然远远算不上最佳实践，但是却是目前公开资料讨论比较少的部分，如果对大家有帮助或者思考，那就不妨点个赞关注一下~  常见工具和方法，器层面的： https://zhuanlan.zhihu.com/p/95779014 同样讲述道层面的：  