Lecture0x03_feature engineering

Catalogue
  1. 1. 数据预处理与特征工程
    1. 1.1. Data PreProcessing(数据预处理)
      1. 1.1.1. 1. 无量纲化
        1. 1.1.1.1. 总结
      2. 1.1.2. 2. 特征分桶
        1. 1.1.2.1. 无监督分箱法
        2. 1.1.2.2. 有监督分箱法
      3. 1.1.3. 总结
      4. 1.1.4. 3. 统计变换
        1. 1.1.4.1. Log变换
        2. 1.1.4.2. Box-Cox变换
      5. 1.1.5. 4. 特征编码
      6. 1.1.6. 总结
    2. 1.2. Feature Extraction(特征提取)
    3. 1.3. Feature Selection(特征选择)
    4. 1.4. Feature construction(特征构造)
  2. 2. 附录

数据预处理与特征工程

Data PreProcessing(数据预处理)

1. 无量纲化

名称 适用场景 做法 公式 特点 缺点
标准化(Standardization) 1. 某些算法要求样本具有零均值和单位方差; 2.需要消除样本不同属性具有不同量级时的影响; 3.在分类、聚类算法中,需要使用距离来度量相似性的时候(如SVM、KNN),或者使用PCA技术进行降维的时候,Z-score表现更好。 基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。 $$x’ = \frac{x-\mu}{\sigma} $$其中 $\mu = \frac{1}{N} \sum_{i=1}^{N}x_i$ $\sigma = \sqrt{\frac{1}{N}\sum_{i=1}^{N}}$ 简单,容易计算,Z-Score能够应用于数值型的数据,并且不受数据量级的影响。标准化只是调整特征整体的分布。 1.对于数据的分布有一定的要求,正态分布是最有利于Z-Score计算的 2.Z-Score消除了数据具有的实际意义,因此Z-Score的结果只能用于比较数据间的结果,关注数据的真实意义还需要还原其原值 3.如果存在异常值,则无法保证平衡的特征尺度。
MinMax归一化(Normalization) 1.归一化有可能提高精度——数量级的差异将导致量级较大的属性占据主导地位,但实际情况有可能是值域范围小的特征更重要; 区间缩放法利用了边界值信息,将属性缩放到[0,1]。 $$x’ = \frac{x-Min}{Max-Min} $$ 归一化输出在[0,1]或[-1,1]之间;如果数据较为稳定,不存在极端的最大最小值,用归一化。 1.当有新数据加入时,可能导致max和min的变化,需要重新定义;
MaxAbs归一化(Normalization) 2.数量级的差异将导致迭代收敛速度减慢——当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;3.依赖于样本距离的算法对于数据的数量级非常敏感,务必归一化。 单独地缩放和转换每个特征,使得训练集中的每个特征的最大绝对值将为1.0,将属性缩放到[-1,1]。它不会移动/居中数据,因此不会破坏任何稀疏性。 $$x’ = \frac{x}{ Max } $$
正态分布化 1.将每个样本缩放到单位范数(每个样本的范数为1),如果要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性,这个方法会很有用。2.该方法是文本分类和聚类分析中经常使用的——向量空间模型(Vector Space Model)的——基础。 对每个样本计算其$L_{p}$范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的$L_{p}$ 范数(L1-norm, L2-norm)等于1。 $$x’ = \frac{x}{L_{2}-norm } $$

$L_{p}$范数:

  • 在线性代数,函数分析等数学分支中,范数(Norm)是一个函数,其赋予某个向量空间(或矩阵)中的每个向量以长度或大小。
  1. $L_{0}-norm$

    $||w||{0} = num(i)$ $with$ $ x{i} \neq 0 $ (表示向量中所有非零元素的个数)

  2. $L_{1}-norm$

    $$||w||{1} = \sum{1}^{d}|x_i| $$ (表示每个元素的绝对值之和)

  3. $L_{2}-norm$

    $$||w||{2} = \sqrt{\sum{i=1}^{d}(x_j)^2} $$ (欧氏距离)

  4. $L_{p}-norm$

    $$||w||{p} = ({\sum{i=1}^{d}x_j^p})^{\frac{1}{p}} $$

  5. $L_{max}-norm$ (对象属性之间的最大距离,)

    $$||w||_{\infty} = max(│x_1│,│x_2│,…,│x_n│)$$

可以看到sklearn中对「正态分布化」的实现细节:

1
2
3
4
5
6
7
8
if norm == 'l1':
norms = np.abs(X).sum(axis=1)
elif norm == 'l2':
norms = row_norms(X)
elif norm == 'max':
norms = np.max(X, axis=1)
norms = _handle_zeros_in_scale(norms, copy=False)
X /= norms[:, np.newaxis]

总结

  • 一般来说,建议优先使用标准化。对于输出有要求时再尝试别的方法,很多方法都可以将输出范围调整到[0, 1];如果我们对于数据的分布有假设的话,更加有效的方法是使用相对应的概率密度函数来转换。
  • 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。
  • 除了上面介绍的方法外,还有一些相对没这么常用的处理方法:RobustScaler、PowerTransformer、QuantileTransformer和QuantileTransformer等。

2. 特征分桶

——即数据离散化,将数值型特征特征分箱。

适用场景:

  • 离散化后的特征对异常数据有很强的鲁棒性(过分远离的特征也可落入其中一个分类);
  • 对于线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于模型引入了非线性,能够提升模型表达能力,加大拟合;
  • 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  • 特征离散化后,模型会更稳定(比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人;当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问);
  • 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险;
  • 可以将缺失作为独立的一类带入模型;
  • 将所有变量变换到相似的尺度上。

无监督分箱法

名称 做法 特点
等距分箱 按照相同宽度将数据分成几等份。 受到异常值的影响比较大。
等频分享 将数据分成几等份,每等份数据里面的个数是一样的。
聚类分箱 基于k均值聚类的分箱:k均值聚类法将观测值聚为k类,但在聚类过程中需要保证分箱的有序性:第一个分箱中所有观测值都要小于第二个分箱中的观测值,第二个分箱中所有观测值都要小于第三个分箱中的观测值,等等。
二值化 二值化可以将数值型(numerical)的feature进行阀值化得到boolean型数据。这对于下游的概率估计来说可能很有用(比如:数据分布为Bernoulli分布时)。 $$ x’ = \left{ \begin{aligned} 1, & & x>threshold \ 0, & & x \leq threshold \end{aligned} \right.{ }$$

有监督分箱法

名称 做法 主要思想
卡方分箱法 自底向上的(基于合并的)数据离散化方法。它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。 对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。
最小熵法分箱 分箱使总熵值达到最小,也就是能够最大限度地区分因变量的各类别(类间差异最大,类内差异最小)。 是信息论中数据无序程度的度量标准,提出信息熵的基本目的是找出某种符号系统的信息量和冗余度之间的关系,以便能用最小的成本和消耗来实现最高效率的数据存储、管理和传递。

总结

  • 我们对特征进行分箱后,需要对分箱后的每组(箱)进行woe编码和IV值的计算,通过IV值进行变量筛选后,然后才能放进模型训练。
  • 分箱后需要进行特征编码,如:LabelEncode、OneHotEncode或LabelBinarizer等。

3. 统计变换

  • 数据分布的倾斜有很多负面的影响。我们可以使用特征工程技巧,利用统计或数学变换来减轻数据分布倾斜的影响。使原本密集的区间的值尽可能的分散,原本分散的区间的值尽量的聚合。
  • 这些变换函数都属于幂变换函数簇,通常用来创建单调的数据变换。它们的主要作用在于它能帮助稳定方差,始终保持分布接近于正态分布并使得数据与分布的平均值无关。
名称 作用 公式
Log变换 Log变换通常用来创建单调的数据变换。 $$y = log_b{x}$$
Box-Cox变换 Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式。 $$ f(x, \lambda) = x^\lambda \left{ \begin{aligned} \frac{x^\lambda - 1}{\lambda}, & & for \lambda > 0 \ log_e(x), & & for \lambda = 0 \end{aligned} \right.{ }$$λ 的最佳取值通常由最大似然或最大对数似然确定。

Log变换

  • 它的主要作用在于帮助稳定方差,始终保持分布接近于正态分布并使得数据与分布的平均值无关。Log变换倾向于拉伸那些落在较低的幅度范围内自变量值的范围,倾向于压缩或减少更高幅度范围内的自变量值的范围。从而使得倾斜分布尽可能的接近正态分布。

适用场景:

  • 针对一些数值连续特征的方差不稳定,特征值重尾分布我们需要采用Log化来调整整个数据分布的方差,属于方差稳定型数据转换。比如在词频统计中,有些介词的出现数量远远高于其他词,这种词频分布的特征就会现有些词频特征值极不协调的状况,拉大了整个数据分布的方差。这个时候,可以考虑Log化。尤其在分本分析领域,时间序列分析领域,Log化非常常见, 其目标是让方差稳定,把目标关注在其波动之上。

Box-Cox变换

  • Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。
  • 该函数有一个前提条件,即数值型值必须先变换为正数(与 log 变换所要求的一样)。万一出现数值是负的,使用一个常数对数值进行偏移是有帮助的。

适用场景:

  • Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。

4. 特征编码

  • 在统计学中,分类特征是可以采用有限且通常固定数量的可能值之一的变量,基于某些定性属性将每个个体或其他观察单元分配给特定组或名义类别。
名称 定义 优点 缺点
标签编码(LabelEncode) 对不连续的数字或者文本进行编号,编码值介于0和n_classes-1之间的标签。 占用内存空间小,并且支持文本特征编码。 它隐含了一个假设:不同的类别之间,存在一种顺序关系。在具体的代码实现里,LabelEncoder会对定性特征列中的所有独特数据进行一次排序,从而得出从原始输入到整数的映射。所以目前还没有发现标签编码的广泛使用,一般在树模型中可以使用。
独热编码(OneHotEncode) 用于将表示分类的数据扩维 因为大部分算法是基于向量空间中的度量来进行计算的,用独热编码能使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。 1.只能对数值型变量二值化,无法直接对字符串型的类别变量编码。2.当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。
平均数编码(mean encoding) 如果某一个特征是定性的(categorical),而这个特征的可能值非常多(高基数),那么平均数编码(mean encoding)是一种高效的编码方式。在实际应用中,这类特征工程能极大提升模型的性能。

总结

  • 由于树模型(Random Forest、GBDT、xgboost等)对特征数值幅度不敏感,可以不进行无量纲化和统计变换处理;

  • 依赖样本距离来学习的模型(如线性回归、SVM、深度学习等)

    • 对于数值型特征需要进行无量纲化处理;
    • 对于一些长尾分布的数据特征,可以做统计变换,使得模型能更好优化;
    • 对于线性模型,特征分箱可以提升模型表达能力;
  • 对数值型特征进行特征分箱可以让模型对异常数据有很强的鲁棒性,模型也会更稳定;分箱后也需要进行特征编码。

Feature Extraction(特征提取)

Feature Selection(特征选择)

Feature construction(特征构造)

附录

Ref. 1 木东居士 / ​特征工程系列:特征预处理(上) & 特征工程系列:特征预处理(下)

Ref. 2 木东居士 / 机器学习的敲门砖:归一化与KD树

Ref. 3 是安酱和菜菜呀 / sklearn中的数据预处理和特征工程

Ref.4 Dave / ML 入门:归一化、标准化和正则化