zoukankan      html  css  js  c++  java
  • 特征工程二:特征抽象、特征衍生

    特征工程:特征抽象、特征衍生

    特征抽象

    这一步是针对有序和无序的文本分类型特征,采用不同的方法进行处理,将其类别属性数值化。

    多值有序特征的属性数值映射,这步也包含了降维处理(对于高维类别变量),把类别抽象成模型可以识别的特征值。有序特征的映射,使用的方法是先构建一个映射字典mapping,再用pandas的map()或者replace()函数进行映射转换。

    #构建学历字典
    mapping_dict={'博士':4,'硕士':3,'大学':2,'大专及以下':1}
    #调用map方法进行转换
    data['edu_level_map']=data['edu_level'].map(mapping_dict)

    多值无序特征的属性独热编码,使用pandas的get_dummies()方法创建虚拟特征,虚拟特征的每一列各代表变量属性的一个分类。比如,婚姻状态。

    #调用get_dummies方法进行转换
    dummies=pandas.get_dummies(data,columns=['婚姻状态'],prefix=['婚姻状态'],prefix_sep='_',dummy_na=False,drop_first=False)

    特征衍生

    特征衍生是指利用现有的特征进行某种组合生成新的特征,主要是从业务数据和纯技术生产特征方面着手。

    1、业务衍生:从特征的业务意义出发,生成具有不同层面业务含义的新特征。方法:逻辑关联、增量、频率分析、相对强度水平等。

    这一衍生手段,主要是原始数据方面利用业务思维和统计方法进行衍生,提取一些次级特征。比如逻辑关联主要是从业务逻辑思路里提取新的可用特征;从变化幅度大的特征提取出其增量特征;从覆盖面较大且类别较多的分类特征取出其频率特征;从特征值分布有差异的数值型特征中提取其相对整体平均值的强度水平或相对某一群体平均值的强度水平等等。

    2、技术衍生:在特征计算层次上对特征进行大范围加工衍生,比如相关特征的加减乘除方、二值化、离散化、交叉组合、多项式融合、算法衍生等。

    技术衍生手段,主要是从特征之间关系和特点出发,选择相应衍生方法生产具有高预测性区分性的特征,这一过程也会产生大量无效或者低效的特征,这些特征在衍生阶段不做处理,会在后续的特征选择中被自动筛选。当然,不同类型和分布特点的特征技术衍生方向也不一样,根据其特点选择合适的方法进行衍生,才会更大概率得到有效特征。

    (1)数学运算(加减乘除方)衍生新特征,前提是这些数值特征具有一定的运算意义;数值特征还可以根据分布特点进行二值化和离散化处理。

    (2)二值化将细粒度的特征度量转化成粗粒度的度量,使得特征的差异化更大,是与某个阈值比较,把特征的取值转化为0或1,核心在于设定一个阈值。类似分类特征的独热编码处理。二值化的手段更适用于在某些值或某取值段分布差异大的(偏正态分布)或者缺失严重的情况,这一通过二值化,可以把数值特征的类别属性提取出来,也增强了特征的稳定性。比如取值为有理数的连续值特征(距离特征),有固定几个取值的枚举值特征(时间特征)。

    枚举特征处理为二值特征技巧:

    将枚举特征映射为多个特征,每个特征对应一个特定枚举值,例如今天周几,可以把它转换成7个二元特征:今天是否是周一,今天是否是周二,...,今天是否是周日。

    连续特征处理为二值特征方法:

    先将连续值离散化(或选取几个阈值节点),再将离散化后的特征切分为多个二元特征,每个特征代表是否在这个区间内。

    (3)特征离散化,是对连续取值的特征进行转换衍生的方法,比如年龄等这样特征的取值相加相减是没有实际意义的的数值特征,连续特征离散化的基本假设是连续特征不同区间的取值对结果的贡献是不一样的。特征离散化就可以提取这些特征的非线性影响并减弱个别数值(或异常值)的作用强度。

    离散化手段(特征分箱)主要有:

    有监督分箱:

    卡方分箱法(ChiMerge),自底向上的(即基于合并的)数据离散化方法。它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。

    最小熵法分箱,是类ID3决策树的方法。首先对某个特征所有值进行排序,通过遍历该特征所有的值(离散值,连续值需要处理成离散值)。计算信息增益,选择信息增益大的值作为一个分断点,然后这个断点将数据分成两部分,然后分别对分割的两部分依次进行上面的操作,直到达到停止条件。停止准则是当得到的每个区间中的类标签都是一样。

    无监督分箱:

    等距分箱,每个区间的特征取值长度相同。

    等频分箱,每个区间包含大致相等的实例数量。

    聚类分箱,基于k均值聚类的分箱,在聚类过程中需要保证分箱的有序性:第一个分箱中所有观测值都要小于第二个分箱中的观测值,第二个分箱中所有观测值都要小于第三个分箱中的观测值等等。

    特征离散化后处理:

    特征离散化后,连续型变区间型特征可与分类型等特征进行交叉组合,再衍生新特征。特征进行分箱后,根据需要对分箱后的每组(箱)进行woe编码和IV值的计算,把每个特征组转换成woe分数。也可以利用IV值对特征离散化进行调整和特征选择等。

    特征交叉组合,指通过将两个或多个输入特征相乘(或求笛卡尔积)来对特征空间中的非线性规律进行编码的合成特征。比如属性A有三个特征,属性B有两个特征,笛卡尔积后就有六个组合特征,然后用one hot或其他embedding方式给新的特征编码。

    交叉组合主要用于离散化特征和分类型特征之间的衍生中,比如地区、年龄、性别这三个交叉组合后,可以得到不同地区的不同年龄(段)男女的交叉数据分布,更好地提升(细化)了年龄和性别的区分性(分布差异性)。在线性模型分类效果不好的情况下,可以通过特征组合的方式增加特征的维度,以求得更好的训练效果。特征交叉组合是一种让线性模型学习到非线性特征的方式,对大规模数据集使用特征组合是学习高度复杂模型的一种有效策略。但这种暴力做交叉很可能导致特征稀疏的问题,这里可以参考FM、FMM以及阿里妈妈发布的MLR做法。

    (4)特征多项式融合,是可以获得特征的更高维度和互相间关系的项,多项式融合法不仅可以得到特征的交叉组合项还可以得到特征的高次项。在python中通过 PolynomialFeatures函数实现特征多项式生成和修整。比如X的特征经过多项式融合已经从

    转换为

     。在一些情况下只需要特征间交互项,可以设置 interaction_only得到,

    ##生成阶数为3阶的交叉项
    >>>poly = PolynomialFeatures(degree=3, interaction_only=True)
    >>>poly.fit_transform(X) 

    (5)算法衍生新特征,是指利用深度学习方法生成的一些非线性新特征,常被用于模型融合场景中,比如使用GBDT来发掘有区分度的特征以及组合特征,然后直接用于逻辑回归模型中,常见的融合模型有"GBDT+LR"、"GBDT+FM"都是应用比较广泛。GBDT构建新特征的主要思想:GBDT每棵树的路径直接作为LR输入特征使用。

    用已有特征训练GBDT模型,然后利用GBDT模型学习到的树来构造新特征,最后把这些新特征加入原有特征一起训练模型。构造的新特征向量是取值0/1的,向量的每个元素对应于GBDT模型中树的叶子结点。当一个样本点通过某棵树最终落在这棵树的一个叶子结点上,那么在新特征向量中这个叶子结点对应的元素值为1,而这棵树的其他叶子结点对应的元素值为0。新特征向量的长度等于GBDT模型里所有树包含的叶子结点数之和。

    案例:基于现有特征,利用GBDT学习到两棵树,第一棵树有3个叶子结点,而第二棵树有2个叶子节点。对于一个输入样本x,如果它在第一棵树最后落在其中的第二个叶子结点,而在第二棵树里最后落在其中的第一个叶子结点。那么通过GBDT获得的新特征向量为[0,1,0,1,0],其中向量中的前三位对应第一棵树的3个叶子结点,后两位对应第二棵树的2个叶子结点。这类编码作为新特征输入到线性分类模型(LR/FM)中进行分类。

    每棵树中的叶子节点代表了样本具有某种属性组合,这种属性组合由于很有意义所以才会存在决策树中(不然就会被剪支掉)。比如广告点击中广告属性(国家、节日)这种特征,(中国-春节)和(美国-感恩节)是有意义的特征组合。我们将所有有意义的特征组合提取出来作为一个新的特征,这就是GBDT构建新特征的目的。

    来源:https://mp.weixin.qq.com/s?__biz=MzU4NTgxNzY1Nw==&mid=2247483747&idx=1&sn=df40e380144e5a5cfc762cda71bed250&chksm=fd858a35caf2032384a29e0a0cdeeb47de246cfecebcdf3db587341377fa24d575ae597602d9&scene=21#wechat_redirect

  • 相关阅读:
    Hive学习之路 (十二)Hive SQL练习之影评案例
    Hive学习之路 (十一)Hive的5个面试题
    Guava Files 源码分析(二)
    Guava Files 源码分析(一)
    观察者模式与Guava EventBus
    Guava 源码分析之 Beta, GwtCompatible, GwtIncompatible, Charset, HashCode
    Java IO的简单示例
    从volatile说到i++的线程安全问题
    乐观锁与悲观锁
    SimpleDateFormat的线程安全问题与解决方案
  • 原文地址:https://www.cnblogs.com/yyy-blog/p/10420175.html
Copyright © 2011-2022 走看看