精华内容
下载资源
问答
  • 数据挖掘:特征工程——特征处理与特征构建 这里贴一张网上特征工程的流程,供大家学习。 一、什么是特征工程 特征工程:其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。。就是...

    数据挖掘:特征工程——特征处理与特征构建

    在这里插入图片描述
    这里贴一张网上特征工程的流程,供大家学习
    在这里插入图片描述

    一、什么是特征工程

    特征工程:其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。。就是获取更好的训练数据。主要有两个方面:

    1. 获取更好的数据
    2. 使机器学习算法达到最优

    二、特征工程处理的意义

    有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已

    1. 特征越好,灵活性越强
      只要特征选得好,即使是一般的模型(或算法)也能获得很好的性能,因为大多数模型(或算法)在好的数据特征下表现的性能都还不错。好特征的灵活性在于它允许你选择不复杂的模型,同时运行速度也更快,也更容易理解和维护。
    2. 特征越好,构建的模型越简单
      有了好的特征,即便你的参数不是最优的,你的模型性能也依然会表现的很nice,所以你就不需要花太多的时间去寻找最有参数,这大大的降低了模型的复杂度,使模型趋于简单。
    3. 特征越好,模型的性能越出色
      显然,这一点是毫无争议的,我们进行特征工程的最终目的就是提升模型的性能。

    三、特征工程处理流程

    特征工程处理流程主要包括以下四个方面特征处理,特征生成,特征提取,特征选择。本文主要介绍前两种方法。

    四、特征处理与特征构建

    在探索性数据分析中,我们已经对数据有了很深的了解,接下来要对数据中的特征进行处理和生成。

    特征处理主要对数字,类别,顺序,时间序列,文本等类型数据进行处理,使得数据更适合模型的预测。
    特征构建/衍生/生成:是根据对数据的了解,人为定出一些有意义的特征。这部分在之前探索性数据分析中有提到,其实进行EDA的目的就是为了更好地了解数据。

    :特征处理中也包含了特征清洗这一步骤,跟之前的数据预处理是一样的。关于这些没有太过明确的定义,主要学习整个处理数据的流程即可,不用对概念中的处理方式太过纠结。

    4.1 数字特征的处理和构建

    4.1.1 数据标准化、归一化

    在数据挖掘数据处理过程中,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。

    数据标准化处理主要包括数据同趋化处理无量纲化处理两个方面。

    1. 数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。
    2. 数据无量纲化处理主要解决数据的可比性。经过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值(各特征)都处于同一个数量级别上,可以进行综合对比分析。

    常见的数据标准化处理(这里先统称为数据标准化处理,其实数据标准化,归一化,中心化不一样)有以下四种,可以取消由于量纲不同、自身变异或者数值相差较大所引起的误差。

    1.实现中心化和正态分布的Z-score
    2.实现归一化的Max-Min
    3.用于稀疏矩阵的MaxAbs
    4.针对离群点的RobustScaler

    sklearn的preprocessing提供了可以满足需求的方法。先用训练集训练标准化的类,然后用训练好的类分别转化训练集和测试集.

    中心化:把数据整体移动到以0为中心点的位置。将数据减去这个数据集的平均值。
    标准化:把整体的数据的中心移动到0,数据再除以一个数。在数据中心化之后,数据再除以数据集的标准差。
    归一化:把数据的最小值移动到0,再除以数据集的最大值。对这个数据集的每一个数减去min,然后除以极差。
    中心化、标准化、归一化定义

    4.1.1.1 中心化与标准化(归一化)的处理意义

    1.提升模型收敛速度
    如下图,x1的取值为0-2000,而x2的取值为1-5,假如只有这两个特征,对其进行优化时,会得到一个窄长的椭圆形,导致在梯度下降时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢,相比之下,右图的迭代就会很快(理解:也就是步长走多走少方向总是对的,不会走偏)。
    在这里插入图片描述
    2.提升模型精度
    这在涉及到一些距离计算的算法时效果显著,比如算法要计算欧氏距离,如SVM,KNN等。上图中x2的取值范围比较小,涉及到距离计算时其对结果的影响远比x1带来的小,所以这就会造成精度的损失。所以归一化很有必要,他可以让各个特征对结果做出的贡献相同。而基于树的模型,可以不进行标准化,例如随机森林,bagging 和 boosting等。以 C4.5 算法为例,决策树在分裂结点时候主要依据数据集 D 关于特征 x 的信息增益比,而信息增益比和特征是否经过归一化是无关的归一化不会改变样本在特征 x 上的信息增益。

    在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。

    从经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
    在这里插入图片描述
    3. 深度学习中数据归一化可以防止模型梯度爆炸

    通过中心化和标准化处理,最终得到均值为0,标准差为1的服从标准正态分布的数据。可以取消由于量纲不同、自身变异或者数值相差较大所引起的误差。


    在一些实际问题中,我们得到的样本数据都是多个维度的,即一个样本是用多个特征来表征的。比如在预测房价的问题中,影响房价的因素(特征)有房子面积、卧室数量等,很显然,这些特征的量纲和数值得量级都是不一样的,在预测房价时,如果直接使用原始的数据值,那么他们对房价的影响程度将是不一样的,而通过标准化处理,可以使得不同的特征具有相同的尺度(Scale)。简言之,当原始数据不同维度上的特征的尺度(单位)不一致时,需要标准化步骤对数据进行预处理

    下图中以二维数据为例:左图表示的是原始数据;中间的是中心化后的数据,数据被移动大原点周围;右图将中心化后的数据除以标准差,得到为标准化的数据,可以看出每个维度上的尺度是一致的(红色线段的长度表示尺度)。
    其实,在不同的问题中,中心化和标准化有着不同的意义,比如在训练神经网络的过程中,通过将数据标准化,能够加速权重参数的收敛。对数据进行中心化预处理,这样做的目的是要增加基向量的正交性。
    在这里插入图片描述
    中心化 -PCA示例
    下面两幅图是数据做中心化(centering)前后的对比,可以看到其实就是一个平移的过程,平移后所有数据的中心是(0,0)

    在这里插入图片描述
    在做PCA时,我们需要找出矩阵的特征向量,也就是主成分(PC)。比如说找到的第一个特征向量是a = [1, 2],a在坐标平面上就是从原点出发到点 (1,2)的一个向量。
    如果没有对数据做中心化,那算出来的第一主成分的方向可能就不是一个可以“描述”(或者说“概括”)数据的方向。
    黑色线就是第一主成分的方向。只有中心化数据之后,计算得到的方向才能比较好的“概括”原来的数据。
    在这里插入图片描述

    中心化与标准化(归一化)的处理意义

    4.1.1.2 Z-Score

    Z-Score:即标准化。它是基于原始数据的均值和标准差,通过减去均值然后除以方差(或标准差),这种数据标准化方法经过处理后数据,符合标准正态分布,即均值为0,标准差为1。转化函数为:x =(x - 𝜇)/𝜎

    • 使用最多,处理后的数据均值为0,标准差为1.
    • 其使用前提最好是特征值服从正态分布,只有原始数据是正态分布,转换后的数据才是标准正态,不然,即使进行转化,得到的也不是标准正态。
    • 另外,如果数据中有较多异常值,此时直接做z-score标准化得到的高斯分布将偏离正常范围。改变了原始数据的结构,因此不适宜用于对稀疏矩阵做数据预处理
      通常这种方法基本可用于有outlier的情况,但是,在计算方差和均值的时候outliers仍然会影响计算。所以,在出现outliers的情况下可能会出现转换后的数的不同feature分布完全不同的情况。
      如下图,经过StandardScaler之后,横坐标与纵坐标的分布出现了很大的差异,这可能是outliers造成的。
      在这里插入图片描述
    #Z-score标准化
    zscore_scaler=preprocessing.StandardScaler()     #建立StandarScaler对象
    data_scale_1=zscore_scaler.fit_transform(data)   #StandardScaler标准化处理
    
    4.1.1.3 Max-Min

    Max-Min:即区间缩放/归一化。该方法是用数据的最大值和最小值对原始数据进行预处理其是一种线性变换,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。转换函数为:x = (x-min)/(max-min)相当于将整体分布移动到从0开始的位置,但数据分布未变化,保留原始数据的结构

    • 这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。不适合距离度量的场景,比如knn这种算法。
    • 另外,这种方法对于outlier非常敏感,影响了max或min值,使得规范化后的值相近且均接近0。所以这种方法只适用于数据在一个范围内分布的情况
    #max-min标准化
    minmax_scaler=preprocessing.MinMaxScaler()      #建立MinMaxScaler模型对象
    data_scale_2=minmax_scaler.fit_transform(data)  #MinMax标准化处理
    
    4.1.1.4 MaxAbs

    MaxAbs:最大值绝对值标准化,和MaxMin方法类似,将数据落入一定的区间[-1,1],但是MaxAbs具有不破坏数据结构的特点,可以用于稀疏数据,稀疏的CSR或CSC矩阵。(为矩阵的两种储存格式)。转换函数为:x’=x/|max|。

    #MaxAbscaler标准化
    maxab_scaler=preprocessing.MaxAbsScaler()          #建立MaxAbsScaler对象
    data_scale_3=maxab_scaler.fit_transform(data)      #MaxAbScaler标准化处理
    
    4.1.1.5 RobustScaler

    RobustScaler:在某些情况下,假如数据中有离群点,我们使用均值和方差缩放,可能并不是一个很好的选择,因为异常点的特征往往在标准化后容易失去离群特征,此时就可以用RobustScaler 针对离群点做标准化处理。此方法对数据中心和数据范围有鲁棒性的估计。
    这种方法去除了中位数并根据四分位距离(也就是说排除了离群值),对数据进行标准化。即使用第一分位数到第三分位数之间的数据产生均值和标准差,然后做z-score标准化。

    
    #RobustScaler标准化
    robustscaler=preprocessing.RobustScaler()      #建立MaxAbsScaler对象
    data_scale_4=robustscaler.fit_transform(data)  #MaxAbScaler标准化处理
    

    各种处理方式的对比图:
    在这里插入图片描述

    4.1.1.6 关于[-1,1]和[0,1]

    假设我们有一个只有一个hidden layer的多层感知机(MLP)的分类问题。每个hidden unit表示一个超平面,每个超平面是一个分类边界。参数w(weight)决定超平面的方向,参数b(bias)决定超平面离原点的距离。如果b是一些小的随机参数(事实上,b确实被初始化为很小的随机参数),那么所有的超平面都几乎穿过原点。所以,如果data没有中心化在原点周围,那么这个超平面可能没有穿过这些data,也就是说,这些data都在超平面的一侧。这样的话,局部极小点(local minima)很有可能出现。 所以,在这种情况下,标准化到[-1, 1]比[0, 1]更好。

    1. 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,StandardScaler表现更好。

    2. 不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用MinMaxScaler。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。
      原因是使用MinMaxScaler,其协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时,由于量纲的存在,使用不同的量纲、距离的计算结果会不同。
      而在StandardScaler中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。

    4.1.2 数据变换

    通过以上对数据标准化的说明可知,当数据为正态分布时,再进行处理的效果是很好的。但实际中我们遇到的数据大多都是非正态的,如果能把非正态数据转为状态数据,那么处理的结果将会更加准确。以下有三种转换方法,可以把非正态数据转为正态分布的数据。

    1. 对指化
      对指化,即对数化和指数化。由于对数和指数的特点,可以把有些有偏数据转为正态分布的数据。右偏数据取对数,左偏数据取指数,减小较大值与较小值之间的差距。取对数的原因如下:
      1. 缩小数据范围。有时候变量数据很大,计算时可能超过计算机默认的取值范围。
      2. 可以讲乘法转换为加法。如对数收益率的可加性。
      3. 压缩变量尺度使数据更平稳,消除异方差。稳定方差,始终保持分布接近于正态分布并使得数据与分布的平均值无关。
      4. 取对数后回归得到的系数正好是经济学中弹性的定义。
      5. 数据存在负数时不能直接取对数,应该先对数据进行适当的平移后再取对数。
      6. 一般是对水平量数据取对数,而不是比例数据,如变化率等。
        为什么进行指数化
        建模时数据为什么要取对数?
        log1p和expm1
        :由于两者是互相的反向操作。因此对数据进行转换后,记得要把数据转换回来。
    2. Box-Cox转换
      其本质上是指数化,对数化。通过计算λ值,得出最佳的调整系数,进行转换。
      box-cox转换说明
    from scipy.stats import boxcox
    trains.SalePrice,lambda_=boxcox(trains.SalePrice)
    
    from scipy.stats import boxcox_normmax
    from scipy.special import boxcox1p
    lambda_2=boxcox_normmax(trains.SalePrice+1)
    print(lambda_2)
    trains.SalePrice=boxcox1p(trains.SalePrice,lambda_2)
    

    使用boxcox1p()可使数据的峰度变得更小,但偏度没有boxcox()的结果小。

    4.1.2 二值化

    定量特征的二值化的核心在于设定一个阈值,小于等于阈值的赋值为0,大于阈值的赋值为1,公式表达如下:
    在这里插入图片描述
    这种处理是对连续数据进行分组,但二值化用的比较少,一般是对数据进行多组的离散化处理。在数据探索性分析中有过描述,这里不再赘述。

    from sklearn.preprocessing import Binarizer
    # 二值化,阈值为3,返回值为二值化后的数据,参数threshold表示小于等于3的数表示为0,大于0.0的数据表示为1
    Binarizer(threshold=3).fit_transform(iris.data)
    

    4.1.3 数字特征构建

    关于数字特征的构建可以从以下两个方面考虑:

    1. 如果我们知道各个特征的具体含义,我们可以根据其含义来构造新特征,同时适当抛弃一些旧特征。比如金融类数据中利润=成本-支出。我们就可以构造一个利润特征。一般数字特征构建通过加减乘数四则运算
    2. 如果我们不知道各个特征的具体含义,我们可以用多项式变换构造一系列特征。构造后的特征我们再使用特征选择方法挑选出对模型贡献大的特征,其余特征抛弃。多用于去敏数据。
      常见的就是二项式变换:
      假如一个输入样本是2维的,形式如[a,b],则多项式变换后的特征有(其实就是(a+b)*(a+b)的每一项加上原始的a和b):a,b,a平方,b平方,2ab。更多项的多项式变换也类似。
    from sklearn.preprocessing import PolynomialFeatures
    
    #多项式转换
    #参数degree为度,默认值为2
    PolynomialFeatures().fit_transform(iris.data)
    

    4.2 分类和有序特征的处理和构建

    4.2.1 标签编码

    有时我们得到的数据,不是数字型的,比如船舱等级ABC,受教育程度小学,中学,高中,性别中的男女等,这时无法直接将其放入模型中进行处理,因此我们需要将其转为123这种数字型。说白了就是替换。
    sklearn中LabelEncoder可以将标签分配一个0—n_classes-1之间的编码。
    pandas也有同样的函数。
    在这里插入图片描述
    还有一种替换方式为,根据字符出现的频率/频数,对原始数据进行替换。比如,性别这个数据中,男的出现频数为60,女的出现频数为40.那么久可以用60和40区替换男女,或者用频率去替代,这样相当于直接对数据进行了缩放。
    在这里插入图片描述

    但是这样得到的数据,也不能直接放入模型中,因为1,2,3之间对计算机来说是有具体大小的,而我们将其转为1,2,3,是为了让计算机能够处理这类数据。这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。人对数字的理解跟计算机不一样。如下图,左边的结果并不是我们想要的。因此,还需要进行下一步,将数据“打散”。
    在这里插入图片描述

    4.2.2 独热编码

    将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。类别型数据变为one_hot编码时,对于一个有k个取值的类别型特征,我们只需要k-1列one_hot编码就可以表示所有取值。

    • one-hot编码为什么可以解决类别型数据的离散值问题
      首先,one-hot编码是N位状态寄存器为N个状态进行编码的方式
      eg:高、中、低不可分,用0 0 0 三位编码之后变得可分了,并且成为互相独立的事件。类似 SVM中,原本线性不可分的特征,经过project之后到高维之后变得可分了(核方法)。GBDT处理高维稀疏矩阵的时候效果并不好,即使是低维的稀疏矩阵也未必比SVM好。
      对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差变成one-hot就是100, 010, 001)。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。
      这样做的好处主要有:

      1. 解决了分类器不好处理属性数据的问题
      2. 在一定程度上也起到了扩充特征的作用
    • 使用one-hot编码的例子
      比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?
      显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。

    • 对多个类别使用one-hot编码更为合理
      将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码,比如,该离散特征共有1000个取值,我们分成两组,分别是400和600,两个小组之间的距离有合适的定义,组内的距离也有合适的定义,那就没必要用one-hot 编码。

    • 树模型不太需要one-hot编码
      对于决策树来说,one-hot的本质是增加树的深度
      tree-model是在动态的过程中生成类似 One-Hot + Feature Crossing 的机制
      1.一个特征或者多个特征最终转换成一个叶子节点作为编码 ,one-hot可以理解成三个独立事件
      2.决策树是没有特征大小的概念的,只有特征处于他分布的哪一部分的概念
      one-hot可以解决线性可分问题 但是比不上label econding
      one-hot降维后的缺点: 降维前可以交叉的降维后可能变得不能交叉
      独热编码

    在这里插入图片描述
    :对于类别型数据我们需要先观察其对于模型的贡献大不大,而不是全部变为one_hot编码。假如一个类别型数据有大量取值,但每个取值占总样本数的比例都很小(如5%以下),那么这个类别型数据进行one_hot编码化后每一列one_hot编码特征的方差都很小,对于模型的贡献极其有限。因此这个类别特征我们选择直接删除而不变为one_hot编码。

    from sklearn.preprocessing import OneHotEncoder
    enc = OneHotEncoder()
    enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
    enc.transform([[0, 1, 3]]).toarray()
    array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])
    

    说明:fit了4个数据3个特征,而transform了1个数据3个特征。第一个特征两种值(0: 10, 1: 01),第二个特征三种值(0: 100, 1: 010, 2: 001),第三个特征四种值(0: 1000, 1: 0100, 2: 0010, 3: 0001)。所以转换[0, 1, 3]为[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]。

    4.2.2 特征构建

    关于类别特征的构建主要是用“相乘”。比如下面这个例子。通过pclass和sex通过相乘,得到新的特征,pclass=3的且sex=male的,把数据拆分得更细致。
    在这里插入图片描述

    4.4 时间特征的处理和构建

    4.4.1 时间特征的处理

    当我们拿到数据后,发现有时间特征,首先要做的就是把数据类型进行转换,因为大多数情况下,原始数据中的类型为object,我们需要转为datetime。可以用pandas中的to_datetime或者astype。转换代码to_datetime可以调整时间格式。

    pd.to_datetime(pd.Series(['05/23/2005']))
    2005-05-23 00:00:00
    dtype: datetime64[ns]
    
    pd.to_datetime(pd.Series(['05/23/2005']), format="%m/%d/%Y")
    2005-05-23
    dtype: datetime64[ns]
    
    df['date'] = df['date'].astype('datetime64[ns]')
    print(type(df_launath['date'].iloc[0]))
    <class 'pandas._libs.tslib.Timestamp'># 时间戳格式
    

    数据类型转换,注意其中error的应用,如果转换不过来,说明数据内有的数据不属于datetime类型,需要进行清洗后,再做应用。

    4.4.2 时间特征的构建

    关于时间特征的构建主要有以下三种方法:
    1.时间信息提取。比如年月日,季度,周数,周几,小时分钟秒等。
    2. 距离某一时刻过去了多久。比如,日期是否为节日,或者距离节日还有多少天,过了多少天等。
    在这里插入图片描述
    3. 时间差。时间1减去时间2
    在这里插入图片描述
    在这里插入图片描述
    另外,也可以对时间序列数据进行one-hot编码。对于类似年-月-日形式的时间型特征,我们需要先将其变为三列年、月、日特征。然后观察我们的数据集标签与这三列特征有无线性关系,如果有,那么保留这些特征,转成one_hot编码;如果没有什么显著的关系,先保留。

    4.5 文本特征的处理和构建

    文本特征处理方法包括两个方面:词袋模型和词向量。由于本人对文本挖掘的知识了解过少,这里仅简单介绍下一些处理的方式。以后学了再补……

    在这里插入图片描述

    4.5.1 词袋模型

    1. 词袋:文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。Python中用CountVectorizer处理词袋。
      在这里插入图片描述
    2. 把词袋中的词扩充到n-gram:n-gram代表n个词的组合。比如“我喜欢你”、“你喜欢我”这两句话如果用词袋表示的话,分词后包含相同的三个词,组成一样的向量:“我 喜欢 你”。显然两句话不是同一个意思,用n-gram可以解决这个问题。如果用2-gram,那么“我喜欢你”的向量中会加上“我喜欢”和“喜欢你”,“你喜欢我”的向量中会加上“你喜欢”和“喜欢我”。这样就区分开来了。
      在这里插入图片描述
    3. 使用TF-IDF特征:TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF(t) = (词t在当前文中出现次数) / (t在全部文档中出现次数),IDF(t) = ln(总文档数/ 含t的文档数),TF-IDF权重 = TF(t) * IDF(t)。自然语言处理中经常会用到。
      在这里插入图片描述
      TF
      在这里插入图片描述

    IDF
    在这里插入图片描述
    文字内容转自文本数据的简单处理

    4.5.2 文本处理步骤

    文本处理步骤主要有以下四步:文本大小写,词形还原,词干,停用词。
    在这里插入图片描述

    1. 大小写问题
      这个就是统一标准。好像sklearn中的文本处理的包可以自动忽略大小写的问题。
      在这里插入图片描述
    2. 词形还原,词干
      把词进行还原,比如going,went等转为go。词干,把握词最重要的部分,其他舍去。
      在这里插入图片描述
    3. 停用词
      比如a,this,the等常见的用语,可能在句子中并没有实际的意义,处理时将其删除。简化数据。
      在这里插入图片描述

    4.5.3 词向量

    词向量是把词映射到向量的表示形式,word2vec。把文本转为向量,比较相似度(相似度一般用余弦定理)。
    在这里插入图片描述
    由于本人对文本挖掘了解,无法做过多的说明。这里贴上两篇文章,供参考学习。
    通俗理解word2vec
    小白都能理解的通俗易懂word2vec详解

    五、总结

    特征处理中sklearn的类
    在这里插入图片描述
    以上是特征处理特征生成相关的知识介绍。这块是数据挖掘的重中之重,数据处理的好坏和特征生成的优良直接影响模型的精度。
    这篇文章是本人按照自己的理解和网上查阅相关资料写成的,其中难免会有错误的地方或者没有提到的处理方法,欢迎大家进行指正。如果这篇文章对您有帮助的话,也希望您能点赞关注下,后续会把特征工程写完,并且还有模型原理和模型评估的内容。

    六、参考文献

    特征工程的代码实现
    https://www.cnblogs.com/jasonfreak/p/5448385.html
    https://blog.csdn.net/Dream_angel_Z/article/details/49388733
    https://blog.csdn.net/weixin_44327656/article/details/90180468
    https://blog.csdn.net/zgcr654321/article/details/88419585
    https://www.cnblogs.com/bjwu/p/8977141.html
    https://blog.csdn.net/weixin_37536446/article/details/81435461

    展开全文
  • 特征处理和特征选择

    千次阅读 2018-04-13 10:59:47
    特征处理之统计特征 历届的Kaggle/天池比赛,天猫/京东排序和推荐业务线里模型用到的特征 1.加减平均:这个用户所买商品高于所有用户购买商品平均价格的多少(权衡一个人的消费能力),用户连续登录天数超过平均...

    特征处理之统计特征

    历届的Kaggle/天池比赛,天猫/京东排序和推荐业务线里模型用到的特征
    1.加减平均:这个用户所买商品高于所有用户购买商品平均价格的多少(权衡一个人的消费能力),用户连续登录天数超过平均多少(表明这个用户对该产品的黏性
    2.分位线:商品属于售出商品价格的多少分位线处。(比如20%,说明20%的人买东西都不会低于这个价格)。
    3.次序型:排在第几位。
    4.比例型:电商中,某商品在某电商平台好/中/差评的比例
    ### 特征处理示例:
    ##### 数据说明:
    数据主要包含两个部分。第一部分是1000万用户在商品全集上的移动端行为数据(D),包含如下字段:

    实例如:
    141278390,282725298,1,95jnuqm,5027,2014-11-18 08
    这些字段中behavior_type字段和time字段包含的信息量最大,user_geohash字段由于缺失值太多,基本没法使用。
    第二个部分是商品子集(P),包含如下字段:

    实例如:
    117151719,96ulbnj,7350
    训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D),评分数据是这些用户在这个一个月之后的一天(12.19)对商品子集(P)的购买数据。参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。

    数据处理示例

    (1) 前一天的购物车商品很有可能第二天就被购买 => 规则
    (2) 剔除掉30天里从来不买东西的人 =>数据清洗
    (3) 加车N件,只买了一件的,剩余的不会买 =>规则
    (4) 购物车的购买转化率 (有的人加车了,就买了。直接推该用户推荐加车的东西)=>用户维度统计特征
    (5) 商品热度(比较热的东西,是大众比较喜欢的:一般为销量,连续型数据) =>商品维度特征
    (6) 不同的item点击/收藏/购物车/购买的总计 (4个连续值) =>商品维度统计特征
    (7) 不同的item点击/收藏/购物车/购买平均每个user的计数 (4个连续值,每个用户对其交互的特定商品发生上述行为的次数) =>用户维度统计特征
    (8) 变热门的品牌/商品(对于某个item,今天有多少人点击-昨天有多少人点击,若差值变大,说明该item变热) =>商品维度统计特征(差值型)
    (9) 最近第1/2/3/7天的行为数与平均行为数的比值 (有的user比较喜欢点,他就不喜欢买;有的用户点的非常少,他点了基本就会买) =>用户维度统计特征(比例型)
    (10) 商品在类别中的排序(比如iphone8在手机类别中的排序,按热度:点击量、购买量、上架时间) =>商品维度统计特征(次序型)
    (11) 商品的购买转化率(商品展示和购买次数的比值,有些商品展示了很多次都没人买,有些商品一展示就很多人买) =>商品维度统计特征(比例型)
    开一个时间窗口,时间可能是前一周,最多一个月,或一个季度
    (12) 最近的交互离现在的时间 =>时间型
    (13) 总交互的天数(该用户对该APP的关联程度有多高) =>时间型
    (14) 用户前一天最晚的交互行为时间(判断用户的习惯,比如发现某用户喜欢半夜购) =>时间型
    (15) 用户购买商品的时间 (用户发生购买行为的平均、最早、最晚时间) =>时间型

    模型特征组合

    1. 拼接型:简单的组合特征。例如挖掘用户对某种类型的喜爱,对用户和类型做拼接。正负权重,代表喜欢或不喜欢某种类型。
        - user_id&&category: 10001&&女裙 10002&&男士牛仔
        - user_id&&style: 10001&&蕾丝 10002&&全棉  
    2. 模型特征组合:
        - 用GBDT产出特征组合路径
        - 组合特征和原始特征一起放进LR训练

    特征选择

    特征选择和降维的不同:特征选择只是删除了原始特征里和结果预测关系不大的特征,后者做特征的计算组合构成了新的特征。
    特征选择包含:过滤型、包裹型、嵌入型

    过滤型

    • 方法:评价单个特征和结果之间的相关程度,排序留下Top相关的部分。
    • 评价方式:Pearson相关系数、互信息
    • 缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征踢掉。因此工业界使用的比较少
    • python包:SelectKBest指定过滤个数、SelectPercentile指定过滤的百分比
    from sklearn.datasets import load_iris
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    iris = load_iris()
    X, y = iris.data, iris.target
    X.shape

    (150, 4)

    X_new = SelectKBest(chi2, k = 2).fit_transform(X, y)
    X_new.shape

    (150, 2)

    包裹型

    • 方法:把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果(递归特征删除算法RFE)。
    • 应用在LR上过程:用全量特征跑一个模型;删掉5~10%的弱特征,观察准确率/AUC的变化;逐步进行,直至准确率/AUC出现大的下滑停止。
    • python:RFE
    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LinearRegression
    from sklearn.datasets import load_boston
    boston = load_boston()
    X = boston["data"]
    Y = boston["target"]
    names = boston["feature_names"]
    lr = LinearRegression()
    rfe = RFE(lr, n_features_to_select = 1)
    rfe.fit(X, Y)
    print("Features sorted by their rank:")
    print(sorted(zip(map(lambda x: round(x, 4), rfe.ranking_),names)))

    Features sorted by their rank:
    [(1, ‘NOX’), (2, ‘RM’), (3, ‘CHAS’), (4, ‘PTRATIO’), (5, ‘DIS’), (6, ‘LSTAT’), (7, ‘RAD’), (8, ‘CRIM’), (9, ‘INDUS’), (10, ‘ZN’), (11, ‘TAX’), (12, ‘B’), (13, ‘AGE’)]

    嵌入型

    • 方法:根据模型来分析特征重要性,最常见的方式为正则化方式来做特征选择
    • 举例:举个例子,最早在电商用LR做CRT预估,在3-5亿维系数的特征上用L1正则化的LR模型。剩余2-3千万的feature,意味着其他的feature的重要程度不够。
    • python:feature_selection.SelectFromModel选出权重不为0的特征。
    from sklearn.svm import LinearSVC
    from sklearn.datasets import load_iris
    from sklearn.feature_selection import SelectFromModel
    iris = load_iris()
    X, y = iris.data, iris.target
    X.shape

    (150, 4)

    lsvc = LinearSVC(C = 0.01, penalty = "l1", dual = False).fit(X, y)
    model = SelectFromModel(lsvc, prefit = True)
    X_new = model.transform(X)
    X_new.shape

    (150, 3)

    More

    1. 4月机器学习算法班-特征工程:https://blog.csdn.net/joycewyj/article/details/51647036
    2. 特征处理与选择实例分析:
      https://blog.csdn.net/han_xiaoyang/article/details/50481967
    3. 特征工程笔记:https://blog.csdn.net/joycewyj/article/details/51647036
    展开全文
  • 特征处理的一些方法

    千次阅读 2018-05-03 22:21:22
    使用sklearn做单机特征工程目录1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺失值计算 2.5 ...

    使用sklearn做单机特征工程

    目录

    1 特征工程是什么?
    2 数据预处理
      2.1 无量纲化
        2.1.1 标准化
        2.1.2 区间缩放法
        2.1.3 标准化与归一化的区别
      2.2 对定量特征二值化
      2.3 对定性特征哑编码
      2.4 缺失值计算
      2.5 数据变换
      2.6 回顾
    3 特征选择
      3.1 Filter
        3.1.1 方差选择法
        3.1.2 相关系数法
        3.1.3 卡方检验
        3.1.4 互信息法
      3.2 Wrapper
        3.2.1 递归特征消除法
      3.3 Embedded
        3.3.1 基于惩罚项的特征选择法
        3.3.2 基于树模型的特征选择法
      3.4 回顾
    4 降维
      4.1 主成分分析法(PCA)
      4.2 线性判别分析法(LDA)
      4.3 回顾
    5 总结
    6 参考资料


    1 特征工程是什么?

      有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:

      特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。首次接触到sklearn,通常会被其丰富且方便的算法模型库吸引,但是这里介绍的特征处理库也十分强大!

      本文中使用sklearn中的IRIS(鸢尾花)数据集来对特征处理功能进行说明。IRIS数据集由Fisher在1936年整理,包含4个特征(Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)),特征值都为正浮点数,单位为厘米。目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。导入IRIS数据集的代码如下:

    复制代码
     1 from sklearn.datasets import load_iris
     2 
     3 #导入IRIS数据集
     4 iris = load_iris()
     5 
     6 #特征矩阵
     7 iris.data
     8 
     9 #目标向量
    10 iris.target
    复制代码

    2 数据预处理

      通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:

    • 不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
    • 信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
    • 定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
    • 存在缺失值:缺失值需要补充。
    • 信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。

      我们使用sklearn中的preproccessing库来进行数据预处理,可以覆盖以上问题的解决方案。

    2.1 无量纲化

      无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。

    2.1.1 标准化

      标准化需要计算特征的均值和标准差,公式表达为:

      使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:

    1 from sklearn.preprocessing import StandardScaler
    2 
    3 #标准化,返回值为标准化后的数据
    4 StandardScaler().fit_transform(iris.data)

    2.1.2 区间缩放法

      区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:

      使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:

    1 from sklearn.preprocessing import MinMaxScaler
    2 
    3 #区间缩放,返回值为缩放到[0, 1]区间的数据
    4 MinMaxScaler().fit_transform(iris.data)

    2.1.3 标准化与归一化的区别

      简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:

      使用preproccessing库的Normalizer类对数据进行归一化的代码如下:

    1 from sklearn.preprocessing import Normalizer
    2 
    3 #归一化,返回值为归一化后的数据
    4 Normalizer().fit_transform(iris.data)

    2.2 对定量特征二值化

      定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式表达如下:

      使用preproccessing库的Binarizer类对数据进行二值化的代码如下:

    1 from sklearn.preprocessing import Binarizer
    2 
    3 #二值化,阈值设置为3,返回值为二值化后的数据
    4 Binarizer(threshold=3).fit_transform(iris.data)

    2.3 对定性特征哑编码

      由于IRIS数据集的特征皆为定量特征,故使用其目标值进行哑编码(实际上是不需要的)。使用preproccessing库的OneHotEncoder类对数据进行哑编码的代码如下:

    1 from sklearn.preprocessing import OneHotEncoder
    2 
    3 #哑编码,对IRIS数据集的目标值,返回值为哑编码后的数据
    4 OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

    2.4 缺失值计算

      由于IRIS数据集没有缺失值,故对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失。使用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:

    复制代码
    1 from numpy import vstack, array, nan
    2 from sklearn.preprocessing import Imputer
    3 
    4 #缺失值计算,返回值为计算缺失值后的数据
    5 #参数missing_value为缺失值的表示形式,默认为NaN
    6 #参数strategy为缺失值填充方式,默认为mean(均值)
    7 Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))
    复制代码

    2.5 数据变换

      常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。4个特征,度为2的多项式转换公式如下:

      使用preproccessing库的PolynomialFeatures类对数据进行多项式转换的代码如下:

    1 from sklearn.preprocessing import PolynomialFeatures
    2 
    3 #多项式转换
    4 #参数degree为度,默认值为2
    5 PolynomialFeatures().fit_transform(iris.data)

      基于单变元函数的数据变换可以使用一个统一的方式完成,使用preproccessing库的FunctionTransformer对数据进行对数函数转换的代码如下:

    1 from numpy import log1p
    2 from sklearn.preprocessing import FunctionTransformer
    3 
    4 #自定义转换函数为对数函数的数据变换
    5 #第一个参数是单变元函数
    6 FunctionTransformer(log1p).fit_transform(iris.data)

    2.6 回顾

    功能说明
    StandardScaler无量纲化标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布
    MinMaxScaler无量纲化区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上
    Normalizer归一化基于特征矩阵的行,将样本向量转换为“单位向量”
    Binarizer二值化基于给定阈值,将定量特征按阈值划分
    OneHotEncoder哑编码将定性数据编码为定量数据
    Imputer缺失值计算计算缺失值,缺失值可填充为均值等
    PolynomialFeatures多项式数据转换多项式数据转换
    FunctionTransformer自定义单元数据转换使用单变元的函数来转换数据

     


     

    3 特征选择

      当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:

    • 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
    • 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

      根据特征选择的形式又可以将特征选择方法分为3种:

    • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
    • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
    • Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

      我们使用sklearn中的feature_selection库来进行特征选择。

    3.1 Filter

    3.1.1 方差选择法

      使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:

    1 from sklearn.feature_selection import VarianceThreshold
    2 
    3 #方差选择法,返回值为特征选择后的数据
    4 #参数threshold为方差的阈值
    5 VarianceThreshold(threshold=3).fit_transform(iris.data)

    3.1.2 相关系数法

      使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:

    复制代码
    1 from sklearn.feature_selection import SelectKBest
    2 from scipy.stats import pearsonr
    3 
    4 #选择K个最好的特征,返回选择特征后的数据
    5 #第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
    6 #参数k为选择的特征个数
    7 SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
    复制代码

    3.1.3 卡方检验

      经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

      这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:

    1 from sklearn.feature_selection import SelectKBest
    2 from sklearn.feature_selection import chi2
    3 
    4 #选择K个最好的特征,返回选择特征后的数据
    5 SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

    3.1.4 互信息法

      经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:

      为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:

    复制代码
     1 from sklearn.feature_selection import SelectKBest
     2 from minepy import MINE
     3 
     4 #由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
     5 def mic(x, y):
     6     m = MINE()
     7     m.compute_score(x, y)
     8     return (m.mic(), 0.5)
     9 
    10 #选择K个最好的特征,返回特征选择后的数据
    11 SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
    复制代码

    3.2 Wrapper

    3.2.1 递归特征消除法

      递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

    复制代码
    1 from sklearn.feature_selection import RFE
    2 from sklearn.linear_model import LogisticRegression
    3 
    4 #递归特征消除法,返回特征选择后的数据
    5 #参数estimator为基模型
    6 #参数n_features_to_select为选择的特征个数
    7 RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
    复制代码

    3.3 Embedded

    3.3.1 基于惩罚项的特征选择法

      使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:

    1 from sklearn.feature_selection import SelectFromModel
    2 from sklearn.linear_model import LogisticRegression
    3 
    4 #带L1惩罚项的逻辑回归作为基模型的特征选择
    5 SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)

      L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型:

      View Code

      使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型,来选择特征的代码如下:

    1 from sklearn.feature_selection import SelectFromModel
    2 
    3 #带L1和L2惩罚项的逻辑回归作为基模型的特征选择
    4 #参数threshold为权值系数之差的阈值
    5 SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)

    3.3.2 基于树模型的特征选择法

      树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:

    1 from sklearn.feature_selection import SelectFromModel
    2 from sklearn.ensemble import GradientBoostingClassifier
    3 
    4 #GBDT作为基模型的特征选择
    5 SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

    3.4 回顾

    所属方式说明
    VarianceThresholdFilter方差选择法
    SelectKBestFilter可选关联系数、卡方校验、最大信息系数作为得分计算的方法
    RFEWrapper递归地训练基模型,将权值系数较小的特征从特征集合中消除
    SelectFromModelEmbedded训练基模型,选择权值系数较高的特征

     


    4 降维

      当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。

    4.1 主成分分析法(PCA)

      使用decomposition库的PCA类选择特征的代码如下:

    1 from sklearn.decomposition import PCA
    2 
    3 #主成分分析法,返回降维后的数据
    4 #参数n_components为主成分数目
    5 PCA(n_components=2).fit_transform(iris.data)

    4.2 线性判别分析法(LDA)

      使用lda库的LDA类选择特征的代码如下:

    1 from sklearn.lda import LDA
    2 
    3 #线性判别分析法,返回降维后的数据
    4 #参数n_components为降维后的维数
    5 LDA(n_components=2).fit_transform(iris.data, iris.target)

    4.3 回顾

    说明
    decompositionPCA主成分分析法
    ldaLDA线性判别分析法

     


    5 总结

      再让我们回归一下本文开始的特征工程的思维导图,我们可以使用sklearn完成几乎所有特征处理的工作,而且不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。这些难道都是巧合吗?还是故意设计成这样?方法fit_transform中有fit这一单词,它和训练模型的fit方法有关联吗?接下来,我将在《使用sklearn优雅地进行数据挖掘》中阐述其中的奥妙!

    展开全文
  • 特征工程:时间特征处理方式

    千次阅读 2019-08-25 09:12:52
    时间特征处理方式

    时间特征处理方式 

    展开全文
  • 比如有两百个属性,如何选择出有用的属性,选择出属性后如何进行特征处理?归一化?标准化? 这个步骤比较模糊,请大神给点拨一下
  • 一 解决问题流程: ...o 特征工程 o 模型调参 o 模型状态分析 o 模型融合 二 数据预处理 (1) 数据清洗  a: 不可信的样本丢掉  b: 缺省值极多的字段考虑不用  (2) 数据采样  a:下/上采样 ...
  •  对特征进行异常处理亦或是组合的时候往往需要考虑实际业务,但是在实际业务之外,也有那么一些常规的技巧可以遵循。  特征中的一大类别——连续型特征如何处理?  1、原始特征  没错,来句废话……连续型...
  • 深度学习总结三:特征处理流程

    千次阅读 2018-10-14 20:42:18
    深度学习总结三:特征处理流程数据审查判断共线性(相关性)的方法:判断异常值的方法:数据清洗缺失值处理噪声值处理不一致数据处理异常值处理重复值处理共线性处理数据集成实体识别冗余属性识别数据变化简单函数...
  • 特征工程——连续特征与离散特征处理方法

    万次阅读 多人点赞 2018-06-24 10:14:06
    特征的标准化(归一化) z-score标准化:这是最常见的特征预处理方式,基本所有的线性模型在拟合的时候都会做 z-score标准化。具体的方法是求出样本特征x的均值mean和标准差std,然后用(x-mean)/std来代替原特征。...
  • catboost对类别特征处理的简单总结

    千次阅读 2019-10-09 16:17:58
    catboost对类别特征处理简单总结 ctb针对类别特征的处理 怎么样做,使类别特征有更为丰富的表达? 1、Mean Encoding 1、【针对高基数的类别特征】 Mean Encoding:均值编码 场景: 如果某一个特征是定性的...
  • 我们可以将一连串的时间特征进行拆分,比如:2015-03-08 10:30:00.360000+00:00, 我们可以将其转换为日期类型,然后从里面提取年,月,日等时间信息 对于一些hour,month等信息,我们也可以使用pd.cut将hour信息...
  • 机器学习中的数据清洗与特征处理综述 背景 随着美团交易规模的逐步增大,积累下来的业务数据和交易数据越来越多,这些数据是美团做为一个团购平台最宝贵的财富。通过对这些数据的分析和挖掘,不仅能给美团业务发展...
  • FM(Factorization Machines )特征处理

    千次阅读 2018-08-01 19:39:30
    博客链接: 知乎,讲解的比较好 https://zhuanlan.zhihu.com/p/37963267 算法理论:https://www.cnblogs.com/AndyJee/p/7879765.html FM/FFM算法 https://zhuanlan.zhihu.com/p/34564014 ...
  • 在离线的处理部分,可以进行较多的实验和迭代,尝试不同的样本采样、样本权重、特征处理方法、特征组合方法等,最终得到一个最优的方法,在离线评估得到好的结果后,最终将确定的方案在线上使用。 另外,由于在线...
  • 特征工程之类别特征 处理方法介绍

    千次阅读 2016-04-07 15:36:22
    当类别特征仍保持原始形式时,其取值来自所有可能取值构成的集合而不是一个数字,故不能作为输入。 当各个取值之间是没有顺序关系的并列关系,这样的类别特征称为 名义(nominal)变量。相反,那些存在顺序关系的...
  • 之前学过的机器学习都是对一些有标签的数据通过分类器进行学习,那么对带标签的图像如何进行学习呢?...我们对特征的描述是根据最后的应用场景设计特征,如应用场景更关心颜色则用颜色特征,因此无普适性( 但是...
  • 特征工程之处理时间序列数据

    千次阅读 2020-09-05 09:40:25
    特征工程的一个简单但普遍的处理对象是时间序列数据。特征工程在这个领域的重要性是因为(原始)时间序列数据通常只包含一个表示时间属性的列,即日期时间(或时间戳)。 对于日期时间数据,特征工程可以看作是从...
  • 特征处理之统计特征

    千次阅读 2018-04-27 10:12:32
    特征处理之统计特征 历届的Kaggle/天池比赛,天猫/京东排序和推荐业务线里模型用到的特征 1.加减平均:这个用户所买商品高于所有用户购买商品平均价格的多少(权衡一个人的消费能力),用户连续登录天数超过平均...
  • 在离线的处理部分,可以进行较多的实验和迭代,尝试不同的样本采样、样本权重、特征处理方法、特征组合方法等,最终得到一个最优的方法,在离线评估得到好的结果后,最终将确定的方案在线上使用。 另外,由于在线...
  • XGBoost之类别特征处理

    万次阅读 2020-02-28 09:30:30
    目录 Label encoding与 One-Hot encoding ...利用神经网络的Embedding层处理类别特征 Embedding简介 Network Embedding算法分类 Embedding实战 转载:https://www.biaodianfu.com/categor...
  • 下面一篇是关于连续特征与离散特征处理的论文: Before I answer the above question, let us go through some basic ideas. Why do we binarize categorical features? We binarize the categorical input so ...
  • 本文参考了美团技术团队发表的《机器学习中的数据清洗和特征处理综述》,以下是学习笔记: http://tech.meituan.com/machinelearning-data-feature-process.html 典型的监督学习过程 原文中将蓝色箭头解释为...
  • 类别特征的各种处理总结

    千次阅读 2019-10-23 15:38:44
    为什么特征向量要映射到欧式空间?独热编码优缺点什么情况下(不)用独热编码?什么情况下(不)需要归一化?one-hot编码为什么可以解决类别型数据的离散值问题Tree Model不太需要one-hot编码独热编码的编程实现...
  •   与One-Hot处理类别特征的方法不同,另一种处理类别特征的方法是使用样本的label value来计算一些统计量。   假设数据集 D = { ( X i , Y i } i = 1 , . . , n D=\{(X_i,Y_i\}_i=1,..,n D = { ( X i ​ , Y i ...
  • ML之FE:数据处理特征工程之稀疏特征的简介、如何处理、案例应用之详细攻略 目录 稀疏特征的简介 稀疏特征的如何处理 稀疏特征的案例应用 稀疏特征的简介 信号稀疏表示是过去近20年来信号处理界一...
  • 前言 在机器学习和深度学习中...然而无论做归一化还是BN处理,虽然将数据的均值变为0,方差变为1,但是数据的整体分布并不一定服从标准的正态分布(实际数据大部分时候都不会是),做归一化和BN时,我们求出来的均值...
  • 特征处理 LR并行化 特征处理 1.知乎上的一个问题: https://www.zhihu.com/question/31989952 连续特征的离散化:在什么情况下将连续的特征离散化之后可以获得更好的效果? 题主机器学习大白一个。。最近刚...
  • 类别特征处理方法大全

    千次阅读 2018-11-01 20:30:51
    类别特征在现实数据里十分常见,处理类别特征对于机器学习里的各种算法来说都是必不可少的过程。 本篇文章总结了几种常见的处理类别特征的方法,这些方法不仅有传统的one-hot编码的形式,也有目前最先进的思路。 ...
  • 类别特征处理与实体嵌入

    千次阅读 2018-01-07 22:42:33
    常见的类别特征处理方法 one-hot (太经典这里不再介绍) histgram 映射 Entity Embeddings(实体嵌入) histgram 映射 比如我们根据人们的一些身体特征来预测这个人会不会得糖尿病 其中有一个类别特征为男...
  • 图像处理特征提取

    万次阅读 2018-09-04 16:10:04
    图像处理特征提取 知乎上看到一个话题—— 目前火热的 Deep Learning 会灭绝传统的 SIFT / SURF 特征提取方法吗? 由于之前研究过SIFT和HOG这两种传统的特征提取方法,故本篇文章先对SIFT和HOG作一综述...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 762,068
精华内容 304,827
关键字:

特征处理