特征工程

1. 特征构造

提取相关信息出来,再人工构造一些特征

2. 特征清洗

2.1 异常值检测

1. 基于统计的检测

四分位数间距,箱形图

2. 基于距离的检测

  • K-means,得到聚类结果之后,然后选出每个簇中,大于阈值的点,即为离群点

3. 基于聚类的检测

  • DBSCAN,最后不属于任何簇的那些样本,为异常点

4. 基于密度的检测

5. 基于模型的检测

  1. One Class SVM

  2. Isolation Forest(IForest算法)

    1. 构建多颗决策树

      • 首先采样决策树的训练样本,不需要全部的样本,因为我们的目的是异常点检测,只需要部分的样本我们一般就可以将异常点区分出来了
      • 由于没有标记输出,所以没办法计算基尼系数等指标,这里是随机选择划分特征,然后再随机选择划分点,进行决策树的分裂。直到深度达到限定的阈值或者没有样本了,就停止
    2. 计算需要检测的数据点 x 最终了若在任意第 t 颗 iTree 的层数 ht(x),然后计算出 x 在每棵树的平均高度 h(x)

      • 对于数据 x,要遍历每一棵树 iTree,得到检测的数据点 x 最终落在任意第 t 颗 iTree 树的层数 ht(x)。ht(x) 越小,离根结点越近
    3. 根据平均高度 h(x) 判断 x 是否是一场点

      • 一般用下面这个公式计算 x 是异常值的概率分值:

    $$
    s(x, m) = 2 ^{- \frac{h(x)}{c(m)}}
    $$

    s(x, m) 的取值范围是 [0,1],取值越接近1,是异常点的概率越大。m 是样本个数,c(m) 为:
    

    $$
    c(m) = 2\ln (m-1) + \delta - 2*(m-1)/m
    $$

    所以高度 ht(x) 越接近 0,则 s(x, m) 越接近 1,即是异常点的概率接近 100%
    

3. 特征预处理

3.1 归一化

1. 为什么要进行归一化?

  • 可以加快梯度下降寻找最优解的速度。因为如果一个特征值范围很大,那么每一次迭代,它的更新速度会很大,那么需要较多次的迭代才能找到最优值
  • 使各个特征具有相同的量纲,具有可比性。否则模型就会倾向于去学习那么数值差别比较大的特征

2. 常用的归一化方法

  1. 线性归一化(Min-Max)

    适用于数据比较集中的情况。有个缺陷:如果 max 和 min 不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定

  2. 标准差归一化(Standard)

    减均值除方差,将数据转换为均值为 0,方差为 1 的数据分布

  3. 非线性归一化

    在数据分化很大的场景中,也就是说有些数值很大,有些很小,这个时候可以通过一些数学函数,将原始值直接进行映射。

    比如:log、指数、正切等

3.2 连续特征离散化

1. 为什么要进行离散化?

  1. 离散之后的特征基本都是用0 1表示的,离散特征的加减操作更加容易,易于模型的快速迭代
  2. 稀疏向量的内积运算速度快(比如SVM就需要内积运算),计算结果方便存储,容易扩展
  3. 离散之后的特征对异常数据有更强的鲁棒性,比如说年龄特征,>60就为1,假设存在一个年龄是300岁的异常数据,如果进行了离散化的话,那么对应的值就是1,不会对模型造成太大的影响,但是不进行离散的话,就会造成比较大的影响
  4. LR(广义线性模型)这类的模型,表达能力有限。但是将单个变量离散化为N个变量之后,每个变量都有自己的权重,相当于为模型引入了非线性,能够提升模型的表达能力
  5. 离散之后,可能进行特征交叉,由 M+N 个变量变成 M*N 个变量,进一步引入了非线性,提升了表达能力6. 特征离散之后,模型会更加稳定。比如对年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人

2. 怎样划分离散区间?

  1. 等频离散

    每个区间的样本数量相等。假如有1000个样本(排序),将前100个作为一段,100~200作为一段……这样得到10段,则第100、200、300……位置的点就是分割点

  2. 等距离散

    每个区间的间距相等。根据取值等间距平均分成多段区间。这样方式适用于样本分布均匀的情况,不然会出现一个分段占据了大部分的样本。

  3. 树模型离散

    利用单个特征和目标值训练一颗决策树模型,然后依据叶子结点的取值作为分割点

  4. K-Means 聚类离散

    最后得到的一个簇类就是一个离散区间

  5. 基于卡方检验离散(自下而上)

    • 根据要离散的属性对实例进行排序:每个实例属于一个区间
    • 合并区间,计算每一对相邻区间的卡方值
    • 停止准则:当卡方检验不显著,即 $p \ge \alpha$,继续合并相邻区间;当卡方检验显著,停止区间合并
  6. 基于信息增益离散(自下而上)
    • 将属性的取值从大到小排列,把每个值看作是可能的切分点,依次计算将每个点作为切分点时,计算它们的熵,取熵最小的时候最为第一次划分点
    • 然后选取已有区间中熵最大的区间继续上面的这个过程
    • 终止条件:区间个数达到用户指定的个数或者某个用户定义的终止条件时,停止分裂

3.3 缺失值处理

主要有三大类:删除数据、数据补齐、不处理

如果缺失的数据量比较大,而且不是很重要的特征的话,可以直接删除。不然的话可能会带入较大的 noise,对最后的结果造成影响。

如果我们不希望改变原始的数据的话,可以不处理缺失值,也就是直接在包含空值的数据上进行处理。或者是将变量映射到高维空间。比如性别特征,有一部分数据是缺失的,则可以将这个特征映射成三个变量:是否男,是否女,是否缺失。这样的话完整保留了原始数据的全部信息。

缺失值补齐

  1. 特殊值填充

    将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。但是可能会导致严重的数据偏差,一般不推荐使用。

  2. 平均值填充

    • 数值型:平均值填充
    • 非数值型:众数填充(利用出现次数最多的值进行填充)

    利用现存的数据的多数信息来推测缺失值

  3. 上下文填充

    从上一个数据或者下一个数据的值进行填充

  4. 插值法填充

    通过两点,估计中间的值

  5. 用算法拟合进行填充

    已知的作为训练集,缺失的作为测试集,来进行预测填充

3.4 数据平滑

4. 特征选择

选择有意义的特征输入到机器学习中进行训练。

通常从两个方面考虑选择特征:

  1. 特征是否发散:如果一个特征不发散,例如方差接近于 0,也就是说这个特征基本上没有差异,那这个特征对于样本的区分并没有用;
  2. 特征与目标的相关性:显然,与目标相关性高的特征,应该优先选择。

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

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

4.1 Filter 过滤法

  1. 方差选择法

    计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。

    方差比较小(比如小于 1),那么这个特征可能对我们的算法没有太大的作用。可以直接舍弃。

  2. 相关系数法

    计算各个特征对目标值的相关系数 r(皮尔逊相关系数,在 p 显著的情况下再来看这个值,相关系数为正,表示正相关,为负,表示负相关,值越大,表示越密切)以及相关系数的 p 值(显著水平,如果不显著的话,相关系数再高也没有用,因为可能只是因为偶然因素引起的,一般 p 小于 0.05 就算显著了)

    皮尔逊相关系数(Pearson Correlation Coefficient):
    $$
    r = \frac {\sum (x - m_x)(y - m_y)}{\sqrt \sum (x - m_x)^2(y - m_y)^2}
    $$
    设定一个阈值,选择相关系数较大的部分特征。

  3. 卡方检验(这是假设检验的一种)

    在统计学中,卡方检验是用来评价两个时间是否独立,也就是 $P(AB) = P(A)*P(B)$

    经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有 N 种取值,因变量有 M 种取值,考虑自变量等于 i 且因变量等于 j 的样本频数的观察值与期望的差距,构建统计量:
    $$
    x^2 = \sum \frac {(A-E)^2}{E}
    $$
    卡方检验,就是自变量对因变量的相关性。

  4. 互信息法(信息增益)

    经典的互信息也是评价定性自变量对定性因变量的相关性的。互信息计算公式如下:
    $$
    I(X;Y) = \sum {x\in X}\sum{y \in Y} \log \frac {p(x, y)}{p(x)p(y)}
    $$
    互信息是从信息熵的角度,分析各个特征和输出值之间的关系评分。互信息值越大,说明特征和输出值之间的相关性越大,越要保留。

4.2 Wrapper 包装法

  • 递归特征消除法 (Recursive Feature Elimination, RFE)

    递归消除特征法是使用一个基模型来进行对轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。

    比如利用 SVM 作为基模型(SVM-RFE):

    在第一轮训练的时候,会选择所有的特征来训练,得到了分类超平面 $w \cdot x + b = 0$ 后,如果有 n 个特征,那么 SVM-RFE 会选择处 w 中分量的平方值 $w_i^2$ 最小的对应的那个特征,将其排出;在第二轮训练的时候,特征数就剩 n-1 个,然后利用这 i-1 个特征进行训练,再去除最小的,一次类推,直到特征数量满足需求。

4.3 Embedded 嵌入法

  1. 基于惩罚项的特征选择

    使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。比如带 L1 正则的模型(L1 正则能降维的原理在于:保留多个对目标值具有同等相关性的特征种的一个)

  2. 基于树模型的特征选择法

    比如树模型中的 GBDT 可以作为基模型来进行特征选择

Reference

https://breezedeus.github.io/2014/11/19/breezedeus-feature-mining-gbdt.html#fn:fbgbdt (利用 GBDT 构造新特征)

https://cloud.tencent.com/developer/article/1005443 (特征工程综述)

https://www.zybuluo.com/K1999/note/460870(连续特征离散化)

https://www.cnblogs.com/pinard/p/9314198.html(异常值检测)

https://blog.csdn.net/lujiandong1/article/details/52654703(缺失值处理)

https://www.zhihu.com/question/26639110(缺失值填充)

https://www.zhihu.com/question/28641663 (特征选择)