特征工程策略

常见做法

  1. 单一变量的基础转换:x, x^2,sqrt x ,log x, 缩放

  2. 如果变量的分布是长尾的,应用Box-Cox转换(用log转换虽然快但不一定是一个好的选择)

  3. 你也可以检查残差(Residuals)或是log-odds(针对线性模型),分析是否是强非线性。

  4. 对于基数比较大的数据,对于分类变量,创造一个表示每种类别发生频率的特征是很有用的。当然,也可以用占总量的比率或是百分比来表示这些类别。

  5. 对变量的每一个可能取值,估计目标变量的平均数,用结果当做创造的特征。

  6. 创造一个有目标变量比率的特征。

  7. 选出最重要的两个变量,并计算他们相互之间、以及与其它变量之间的二阶交叉作用并放入模型中,比较由此产生的模型结果与最初的线性模型的结果。

  8. 如果你想要的解决方案更平滑,你可以应用径向基函数核(Kadial Basis function kernel) 。这就相当应用一个平滑转换。

  9. 如果你觉得你需要协变量(Covariates ),你可以应用多项式核,或者明确添加它们的协变量。
    10.高基数特征:在预处理阶段,通过out-of-fold平均转换成数值变量。
    两个变量组合而成的特征转换
    以下为一些常见的由两个变量组合而成的特征转换:
    11.加法转换

  10. 相对于基数的差值

  11. 乘法转换:交互效果

  12. 除法转换:缩放/归一化

  13. 对数值型特征设定阈值以获取其布尔值
    16.笛卡儿积变换

  14. 特征向量积:所有特征的向量积
    试想一个特征A,它有两个可能的值:{ A1,A2 } 。假设B是一个具有两种可能性{ B1,B2 }的另一特征。那么, A和B之间的向量积(我们称之为AB)将采取以下值之一: { (A1 , B1),(A1 , B2),(A2 , B1),(A2 , B2) } 。你基本上可以赋予这些”组合”你喜欢的任何名称。但要记住,每个组合都表示一个由A和B的相应值包含的信息之间的协同作用。

  15. 归一化/数据标准化变换
    在机器学习算法中提出的隐含假设(对朴素贝叶斯而言,在某种程度上是显性假设)之一是:该特征服从正态分布。不过,有时我们可能会发现该特征不遵循正态分布,而是对数正态分布。那么在这种情况下常见的手段之一是取特征值的对数(即表现出对数正态分布的那些特征值),使得它展现出正态分布。如果在使用中的算法做出了正态分布的隐含/显性假设的话,则这种转化,即将一个服从对数正态分布的特征转化为正态分布,可以帮助改善该算法的性能。

  16. 分位数分级转换 (Quantile Binning Transformation)

  17. 白化数据 (Whitening the Data)

  18. 窗体压缩化 (Windowing)
    •如果所有的点都分布在时间轴上,那么在同一个窗口里的先前的点往往包含丰富的信息。

  19. 最小-最大归一化:不一定保留顺序

  20. S型/正切/对数转换 (Sigmoid / Tanh / Log Transformations)

  21. 用特殊方法处理0:对于计数特征有可能很重要

  22. 去相关性/转换变量

  23. 重构数量

27.将不频繁的分类变量划分到新的/独立的类别中。

28.按顺序应用一系列转换。

29.独特的编码方式

30.靶值率编码 (Target rate encoding)

31.哈希技巧 (Hash Trick)
常见的多个变量的特征转换
以下为一些常见的多个变量的特征转换:

32.主成分分析 (PCA)

  1. 模型集成

  2. 压缩感知 (Compressed Sensing)

35.“猜平均值”或是“猜通过变量X分段后的平均值”

  1. 处理映射(hack projection):

执行聚类(clustering)并使用点和聚类中心的距离作为一个特征
主成分分析/奇异值分解 (PCA/SVD)
这是用来分析变量之间的相互关系和在信息损失最小的情况下执行降维的有效技术。
找到透过数据中,拥有最大方差的轴。在下一个正交轴上重复该步骤,直到你用完了数据或维度。每个轴都代表着一个新特征。

37.稀疏编码(sparse coding)
选择基元:基于你能如何用一个基元来重建输入值和它有多稀疏来评估该基元;采取一些梯度步骤,以改进该评估。有效的稀疏编码算法深度自编码

  1. 随机森林:训练一部分决策树:使用每个叶子作为一个特征

特征交叉。

特征交叉可以表示数值特征之间的相互作用,例如可以对两个数值变量进行加、减、乘、除等操作,可以通过特征选择方法(如统计检验或者模型的特征重要性)来选择有用的交叉组合。有些特征交叉组合,虽然没有直观的解释,但有可能对于模型效果有很大的提升。
特征交叉对于线性模型可以学习到非线性特征。
两个特征:年龄和性别,可以组合成 年龄_性别
6:非线性编码。线性模型往往很难学习到数据中的非线性关系,除了采用特征交叉的方式之外,也可以通过非线性编码来提升线性模型的效果。例如使用多项式核,高斯核等。另外一种方法是将随机森林模型的叶节点进行编码喂给线性模型,这样线性模型的特征包含了复杂的非线性信息。还有基因算法以及局部线性嵌入、谱嵌入、t-SNE等。
7:行统计量。除了对原始数值变量进行处理之外,直接对行向量进行统计也可以作为一类特征,如统计行向量中空值的个数、0的个数、正值或负值的个数,以及均值、方差、最小值、最大值、偏度、峰度等。

类别特征

类别数据的取值可以是数值类型(例如“1”代表男性,“0”代表女性),但是数值没有任何数学意义,它们不能进行数学运算
1:独热编码。通常,直接将类别特征的自然数编码特征喂给模型,效果可能比较差,尤其是线性模型。这是因为,对于类别特征的自然数编码,取值大小没有物理含义,直接喂给线性模型没有任何意义。我们常用的一种做法是对类别特征进行独热编码,这样每个特征取值对应一维特征,独热编码得到稀疏的特征矩阵。
2:分层编码。对于邮政编码或者身份证号等类别特征,可以取不同位数进行分层,然后按层次进行自然数编码,这类编码一般需要专业领域知识。
3:散列编码。对于有些取值特别多的类别特征,使用独热编码得到的特征矩阵非常稀疏,因此在进行独热编码之前可以先对类别进行散列编码,这样可以避免特征矩阵过于稀疏。实际应用中我们可以重复多次选取不同的散列函数,利用融合的方式来提升模型效果。散列方法可能会导致特征取值冲突,这种冲突通常会削弱模型的效果。自然数编码和分层编码可以看作散列编码的特例。
4:计数编码。计数编码是将类别特征用其对应的计数来代替,这对线性和非线性模型都有效。这种方法对异常值比较敏感,特征取值也可能冲突。
5:计数排名编码。它利用计数的排名对类别特征进行编码,其对线性和非线性模型都有效,而且对异常点不敏感,类别特征取值不会冲突。
6:目标编码。它基于目标变量对类别特征进行编码。对于基数(类别变量所有可能不同取值的个数)很大的离散特征,例如IP地址、网站域名、城市名、家庭地址、街道、产品编号等,上述预处理方法效果往往不太好。一种有效方式则是基于目标变量对类别特征进行编码,其适用于分类和回归问题。例如对于分类问题,采用交叉验证的方式,即将样本划分为5 份,针对其中每一份数据,计算离散特征每个取值在另外4 份数据中每个类别的比例。为了避免过拟合,也可以采用嵌套的交叉验证划分方法。回归问题同样采用交叉验证的方式计算目标变量均值对类别变量编码。在实际问题中,我们往往利用历史数据来预测未来结果。因此我们一般基于时间信息来划分训练集和验证集,利用相同时间窗口大小的历史数据来对类别特征进行编码。例如,在广告点击率预测问题中,我们计算广告主ID在过去固定一段时间内的点击率,对广告主ID进行目标编码。目标编码方法对于基数较低的离散变量通常很有效,但对于基数特别高的离散变量,可能会有过拟合的风险。因为很多类别特征的取值样本个数太少,不具有统计意义。对于这种情况,我们通常采用贝叶斯方法,即对统计特征进行贝叶斯平滑,如拉普拉斯平滑或者先验概率和后验概率加权平均的方式。

-7. 类别特征之间交叉组合。除了前面提到的数值特征之间的交叉组合外,类别特征之间的交叉组合也是很重要的特征。两个类别特征进行笛卡儿积操作可以产生新的类别特征,这种操作适用于两个类别特征的基数较小的情况。两个类别特征的笛卡儿积取值个数是两个类别特征取值个数的乘积,如果两个类别特征的基数很大时,交叉后的特征基数太大,效果可能并不好。除了两个类别特征的交叉,多个类别特征也可以交叉组合,根据实际需要可以进行二阶及二阶以上的交叉组合,最后通过特征选择方法选取重要的组合方式。除了上面提到的交叉组合外,另一种特征组合方式是基于统计的组合。例如针对城市ID和商品ID两个类别特征,我们可以计算某个城市有多少不同的商品ID以及当前ID出现次数的分布,从而得到新的数值特征,或者计算某个城市出现次数最多的商品ID,从而得到一个新的类别特征。对于多个类别特征也可以进行同样的操作。例如针对年龄、性别、产品ID三个类别特征,可以计算某个年龄段不同性别的人购买过多少产品或者对当前产品ID购买次数的分布等。在实际应用中,类别特征之间的组合方式千变万化,这类特征一般从业务逻辑的角度出发进行构造。相比类别特征之间的笛卡儿积操作,基于分组统计的特征组合方式计算更加复杂,而且一般强依赖专业领域知识,因此需要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值