【自然语言处理】——特征工程知识体系总结

一、前言

     维基百科中给特征工程做出了简单定义:特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。简而言之,特征工程就是一个把原始数据转变成特征的过程,这些特征可以很好的描述这些数据,并且利用它们建立的模型在未知数据上的表现性能可以达到最优(或者接近最佳性能)。从数学的角度来看,特征工程就是去设计输入变量X。

二、特征工程知识框架

三、特征清洗

        在实际生产环境中,业务数据并非如我们想象那样完美,可能存在各种问题,比如上报异常、恶意作弊行为、爬虫抓取等。为了让模型能够学到真实的行为规律,我们需要对已经构造的原始特征进行清洗,排除掉脏数据。主要包括一下两个方面:

1.结合业务情况进行数据的过滤,例如去除 crawler 抓取,spam,作弊等数据。

2.异常点检测,采用异常点检测算法对样本进行分析,常用的异常点检测算法包括

  • 偏差检测,例如聚类,最近邻等。
  • 基于统计的异常点检测算法

例如极差,四分位数间距,均差,标准差等,这种方法适合于挖掘单变量的数值型数据。全距(Range),又称极差,是用来表示统计资料中的变异量数(measures of variation) ,其最大值与最小值之间的差距;四分位距通常是用来构建箱形图,以及对概率分布的简要图表概述。

  • 基于距离的异常点检测算法,

主要通过距离方法来检测异常点,将数据集中与大多数点之间距离大于某个阈值的点视为异常点,主要使用的距离度量方法有绝对距离 ( 曼哈顿距离 ) 、欧氏距离和马氏距离等方法。

  • 基于密度的异常点检测算法

考察当前点周围密度,可以发现局部异常点,例如 LOF 算法

 

四、特征预处理

       很多特征开发出来之后,可能并不在同一个值域中,比如用户对某个游戏的活跃时长特征,可以是 1000s 或者 10000S 这样,而用户的性别的取值是 0 或者 1,那么这两个特征如果不做处理,直接放入模型中进行训练,会严重影响模型效果。下面介绍一些单特征预处理的以一些方法:

     1、归一化

       归一化有很多好处,比如可以加快梯度下降寻找最优解的速度,可以提升模型的精度,同时也使得特征之间具有可比性,当然所有的事情都是双面的,经过归一化处理之后,会损失掉源特征的一些信息,但这个损失相对应带来的好处我们还是可以接受的。归一化可以分成以下类型:

  • 线性归一化

      这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果 max 和 min 不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代 max 和 min。

  • 标准差归一化

在完全随机的情况下,我们可以假设我们的数据是符合标准正态分布的,也就是均值为 0,标准差为 1;那么其归一化函数如下:

  • 非线性归一化

      在数据分化比较大的场景中,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如 log(V, 2) 还是 log(V, 10) 等。实际业务中我们可以根据自己对数据的理解进行不同的归一化方法,下面是手游推荐业务使用到的归一化函数:正向特征,特征越大打分越大,例如付费金额

其中

反向特征,特征越大打分越小,例如首次付费距离当前天数

其中

汇总特征,取均值,例如活跃天

=score/天数

          这样的归一化为啥会比其他归一化更好呢!或许数学家们可以从公式上进行推到证明,而我们的理解是,其实每个业务的数据都会有特定的分布,比如完全随机的时候数据满足正态分布,那么所选择的方法必须要符合这种数据分布的特点,一般情况下会根据自己对业务数据的了解,对公式进行调整,但是归一化的思路还是跟上面提到的一样的。

2、离散化

      离散化也可以理解成特征的二值化,即是把原来连续的特征值分段,转化成一个元素取值要么是 0 要么是 1 的向量。原始值落在某个段里,向量中此段对应的元素就是为 1,否则为 0。其中对原始值进行分段,具体如何分、分成几分,这里面又很多学问;离散化对于线性模型来说是非常有帮助的,原因是它可以将目标值 Y 与特征值的线性转为目标值与离散化之后转化的向量里的每个元素之间的线性关系,这样向量的每个分量都有一个权重,引入了非线性,提升了模型拟合能力。之前做过实验,使用同样的特征,有经过离散化处理的特征训练出来的模型,会比没有经过离散化训练出来的模型效果好 20%以上;现在使用比较多的特征离散化的方法有,等频离散、等距离散、树模型离散。

  • 等频离散

等频意思是说我们在对特征值进行离散的时候,根据样本点量来选取分割点,举个例子假设就是我们有 1000 个样本,每个样本对应于需要进行离散化的特征都会有一个值,把这个值做一个排序,假设将特征离散成 10 段,等频就是说 10 个分段里面的样本数是相同的(0,100)一段,排在 100 这个样本对应的特征值就是一个分割点,依次类推。这种分割方式可以保证每个离散分量有相同的样本数,但也会出现特征值差异非常大的样本被放在一个分段的情况。

  • 等距离散

等距离散顾名思义就是我们根据特征值来进行离散化,比如特征取值是 0~10,将特征离散成 5 段,那么【0~2)第一个分段,【2,4)一个分段,以此类推;使用这种离散化的方式需要样本分布均匀,不然会出现一个分段占据了大部分的样本,这样不同时间训练出来的模型会偏差很大,也就是说模型不鲁棒。

  • 树模型离散化

树模型是在机器学习中使用非常广泛的非线性模型,其因简单、直观、解释性强而被广泛用于工业界。说到树模型,可能大家第一印象肯定是决策树,决策树的直观理解就是一堆 if else,所以这种模型天生具有对连续型特征切分的能力,用于特征离散化也是合情合理的。实际操作中,我们可以单独连续特征和目标值 y 训练一个决策树模型,然后把训练获得的模型内的特征分割点作为离散化的离散点。

3、缺失值填补

     在实际业务中,可能会因为各种原因会造成数据的缺失,比如某些用户年龄、性别、设备这类型的特征无法获取到,同时线上模型又有使用这些类型的特征,那么缺失了这些特征的用户在线上打分的时候会出现比较大的偏差;通常会有几种方式来进行处理:数值型特征可以使用均值或者中位数进行简单的替换,年龄这类型的特征可以通过关系链进行加权打分,当然也可以通过把缺失的全部都归为一类,用户默认值来替代。当然对于新用户或者新 item 来说其实也是属于一种缺失值情况,对于这种情况已经属于领一个非常大的领域,那就是推荐系统的启动问题。对于冷启动我问题,现在的做法会从两个方面着手,一种是通过集体智慧来解决,另外一种是通过网络模型;第一种方法就是使用协同过滤的思想,与这个新用户类似的用户表现来知道新用户的推荐。第二种利用网络把 item 周围信息考虑进去,比如下面会提到的层次平滑,热传导模型也可以通过引入基础属性到二部图中,达到解决冷启动问题。

4、数据平滑

      在推荐场景中会有大量的点击率类型的特征,这类型的特征通常都是使用行为操作量/曝光量得到,这类统计类特征会受到行为操作与曝光量之间的关系的影响;比如同一个游戏的 banner 的随着曝光量的增长,点击量的增长率是会不断下降的,也就是说如果不做任何处理行为操作量/曝光量产生的特征对曝光量大的游戏是不公平的。对于曝光量小 item 是有利的,极端的例子是曝光一次,点击一次,那么点击率就是 100%,这明显是不可能的;那么如何做呢?一种常用的方式是训练一个 beta(a,b)分布,使用(行为操作量 a)/(曝光量 a b);原理是我们可以把每次点击与不点击看成是一个伯努利分布,那么所有用户与所有游戏这种点击与不点击对可以看成是一个 beta 分布,从全局的角度学习到平滑因子;

还有一种方法是,既然不能对不同量级的曝光量进行比较,那我们可以把曝光量进行分段,同一个曝光量级的点击率进行比较。当然还有一种叫做层次平滑的算法,把游戏进行分类,如果单个游戏的曝光量很少,可以使用所述类的平均值进行平滑处理。

五、特征选择

        特征选择的目的是选择模型最优特征子集。特征与特征之间多多少少会有一些相互作用,比如有些特征是包含其他特征,有些特征与另一些特征存在相关性的,也有一些特征需要与其他特征组合起来才能起作用,还有一些特征是会存在负相关的;正是因为特征之间的这些关系,合理的选择适合的特征集合对于模型效果有非常大的作用。现有的特征选择方法可以大体分成三种类型:

1、Filter

这种方法是衡量单个特征值与目标变量也就是样本 label 值之间的关联,常用的方法有:

  • 相关系数
  • 卡方检验
  • 信息增益:互信息
  • 基尼系数

2、Wrapper

Wrapper 这一类特征选择方法,应该来说是比较科学的,但是也是非常耗时,工业界在生产环境中很少使用,非常耗时,也是一个 NP 复杂的问题,一般通过不断迭代,然后每次加入一个特征,来训练模型,使用模型评估比如 AUC 或者 MSE 等函数评估是否将特征加入到特征子集中。

3、Embedded

Embedded 方法我觉得是一个比较可行的一种方法,它的思想是使用模型自身自动的选择特征,比如正则化——L1 Lasso 具有特征选择能力,决策树,每次选择分类节点时,都会选择最佳的分类特征来进行切分,高级一点的如深度学习,很多项目组也在开始使用比如 CNN 或者 RNN 进行特征选择。

六、特征评估

        前面写了很多特征构造和处理的方法,可能更多时间我们更想知道一个特征是否真的靠谱,在时间有限的情况下,用贪心的思想,每次选择表现最好的特征加入到模型训练中,这个时候就会特征评估这个东西了,特征评估可能会从几个维度进行衡量:

1、特征自身的质量

  • 特征覆盖度,这个指标是衡量某个特征能够影响的样本量,一般情况下,会排查覆盖度特别低的
  • 特征的准确性,也就是说特征值是否考虑,会不会存在太多错误数据
  • 特征方差,衡量特征是否有区分度,比如 100 个训练样本,有 99 个是 0,那么这个特征方差就特别低,肯定有问题。

2、特征与目标值的相关性

  • 相关系数
  • 单特征 AUC

 

【参考文章】

1、参考文章1:https://cloud.tencent.com/developer/article/1005443   (特征工程方法综述)

2、参考文章2:http://www.cnblogs.com/baiboy/p/learnnlp.html  (十分钟快览自然语言处理概述)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值