特征工程

张开慧

背景

在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),而且机器学习的书中基本上是已经处理好的数据或者作者自己构造的虚拟的数据。所以在机器学习的实践中,可能会选择使用这些算法,但是常常不知道怎么提取特征来建模。因此,结合网上的资料和项目中的经验试着来总结一下。

特征是什么

特征是对于分析和解决问题有用、有意义的属性。例如:
在表格数据中,表格中的一行是一个观测,但是表格的一列可能才是特征;
在机器视觉中,一幅图像是一个观测,但是图中的一条线可能才是特征;
在自然语言处理中,一个文本是一个观测,但是其中的段落或者词频可能才是一种特征;
在语音识别中,一段语音是一个观测,但是一个词或者音素才是一种特征。

特征工程概述

利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。 简而言之,特征工程就是一个把原始数据转变成特征的过程,这些特征可以很好的描述这些数据,并且利用它们建立的模型在未知数据上的表现性能可以达到最优(或者接近最佳性能)。
从数学的角度来看,特征工程就是人工地去设计输入变量X。

特征工程的意义

根据经验,模型的效果80%以上取决于特征。另一方面,好的特征能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果,这样就不必费力去选择最适合的模型和最优的参数了。

特征要考虑的因素

挑选入模变量过程是个比较复杂的过程,需要考虑的因素很多,比如:
变量的预测能力(最主要和最直接的衡量标准)
变量之间的相关性
变量的简单性(容易生成和使用)
变量的强壮性(不容易被绕过)
变量在业务上的可解释性(被挑战时可以解释的通)等等

特征的分类

根据不同的分类方法,可以将特征分为:
(1)原始特征和高级特征。
(2)非实时特征和实时特征。
(3)离散值特征和连续值特征。

原始特征和高级特征——
原始特征,不需要或者需要非常少的人工处理和干预,例如文本特征中的词向量特征,图像特征中的像素点,用户性别等。高级特征是结合部分业务逻辑或者规则、模型,经过较复杂的处理,得到的特征,例如骑手达人分,模型打分等特征。

非实时特征和实时特征——
非实时特征是变化频率(更新频率)较少的特征,例如骑手平均速度,餐品单价等,在较长的时间段内都不会发生变化。实时特征是更新变化比较频繁的特征,是实时或准实时计算得到的特征,例如5分钟之内的骑行速度,半小时的跑单量等。

离散值特征和连续值特征——
离散值特征主要是特征有固定个数个可能值,例如今天周几,只有7个可能值:周1,周2,...,周日。离散值特征包括二值特征,例如今天是不是周末,只有2个可能值:是,否。连续值特征是取值为有理数的特征,特征取值个数不定,例如距离特征,特征取值为是0~正无穷。

特征工程的构成

特征工程是一个超集,一般认为包括特征构建、特征提取、特征选择三个部分。

在介绍这三部分之前,先介绍下特征升维。在机器学习中,有一个VC维理论。根据VC维理论,VC维越高,打散能力越强,可容许的模型复杂度越高。在低维不可分的数据,映射到高维是可分。想象给你一堆物品,人脑是如何对这些物品进行分类?大脑依然是找出这些物品的一些特征,例如:颜色,形状,大小,触感等等,然后根据这些特征对物品做以归类,这其实就是一个先升维,后划分的过程。比如我们人脑识别香蕉。可能首先我们发现香蕉是黄色的。这是在颜色这个维度的一个切分。但是很多东西都是黄色的啊,例如哈密瓜。那么怎么区分香蕉和哈密瓜呢?我们发现香蕉形状是弯曲的。而哈密瓜是圆形的,那么我们就可以用形状来把香蕉和哈密瓜划分开了,即引入一个新维度——形状来区分。这就是一个从“颜色”一维特征升维到二维特征的例子。

那么问题来了,既然升维后模型能力能变强,是不是特征维度越高越好呢?
答案是否定的,因为:
1. 特征维数越高,模型越容易过拟合,此时更复杂的模型就不好用。
2. 相互独立的特征维数越高,在测试集上达到相同的效果表现所需要的训练样本的数目就越大。在机器学习中,有一个非常经典的维度灾难的概念。用来描述当空间维度增加时,分析和组织高维空间,因体积指数增加而遇到各种问题场景。例如,100个平均分布的点能把一个单位区间以每个点距离不超过0.01采样;而当维度增加到10后,如果以相邻点距离不超过0.01小方格采样单位超一单位超正方体,则需要10^20 个采样点。
3. 特征数量增加带来的训练、测试以及存储的开销都会增大。
4. 在某些模型中,例如基于距离计算的模型KMeans,KNN等模型,在进行距离计算时,维度过高会影响精度和性能。
5. 可视化分析的需要。在低维的情况下,例如二维,三维,我们可以把数据绘制出来,可视化地看到数据。当维度增高时,就难以绘制出来了。

正是由于高维特征有如上描述的各种各样的问题,所以我们需要进行特征降维。特征降维的目标是将高维空间中的数据集映射到低维空间数据,同时尽可能少地丢失信息,或者降维后的数据点尽可能地容易被区分。

降维的方法又可以分为通过特征转换和直接在已有的特征里面选择两种方式。为了便于区分,于是我们把升维的过程称为特征构建,把通过特征转换来降维的过程称为特征提取,把直接从已有特征里面挑选的降维过程称为特征选择。

特征构建

特征构建是指从原始数据中人工的找出一些具有物理意义的特征的过程。
特征构建比较麻烦,需要一定的经验,需要结合具体的业务,花费大量的时间去观察原始数据,思考问题的潜在形式和数据结构,以及如何将特征数据输入给预测算法。

前面我们说过,特征构建是一个升维的过程。但是同一个维度,有不同的方法。举个栗子, 假设你的数据里现在有一个颜色的维度,比如是“itemColor”,它的三个取值分别是:red、blue、unknown。从特征构建的角度来看,你可以将其转化成一个二值特征“hascolor”,取值为1或0。其中1表示有颜色,0表示没颜色。你还可以将其转换成三个二值属性:IsRed, IsBlue and Is_Unknown。这取决于你的业务是否对其中的某一种颜色很敏感。

常用方法

既然特征构建是一个升维的过程,那么就需要找到各种不同的维度,以及这些维度上的值。
最直观的就是遍历——
对于表格数据:
通常把与业务相关的列列举出来,比如要预测房价则需要把房价面积、距离地铁口多远等信息列举出来;比如要预测西瓜是否是一个好瓜,要把瓜蒂形状、颜色、敲声等列举出来。
对于自然语言数据:
一般计算词频(term frequency,TF)和逆向文件频率(inverse document frequency,IDF),一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章。 Sklearn和spark mllib都有很多包实现了TF-IDF。
对于图像处理:
一般是通过通过图片的像素,通过滤波器等手段,提取出边缘、线等。
对于其他数据:
例如机器视觉、语音识别等,通常使用的是深度学习的算法,这些深度学习算法会自己进行特征学习,一般不需要人工手动构建特征。

此外,属性分割和结合是特征构建时常使用的方法——
结构性的表格数据,可以尝试组合二个、三个不同的属性构造新的特征,例如最近5天的平均值、最近10天的平均值;也可以把一个属性分解或切分,例如时间可以切分成上午、下午、晚上、周末等。
自然语言处理则使用词向量Word2vec。
机器视觉则使用卷积核。

对表格数据的预处理

采样

当模型不能使用全部的数据来训练时,需要对数据进行采样,设定一定的采样率。采样的方法包括随机采样,固定比例采样等方法。
对于分类问题:选取正例,负例。正负样本比例不宜相差过大。还有一种数据不平衡处理之SMOTE算法(from imblearn.combine import SMOTEENN),SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中。
对于回归问题,需要采集数据。对于采样得到的样本,根据需要设定样本权重。

缺失值

有些算法对缺失值不敏感,比如xgboost;而有些则不能有缺失值,例如LR。
如果某个变量缺失度比较高,那么可以直接剔除这个变量;否则按下面的方式来处理:

缺失类型

(1)完全随机缺失:缺失值跟其他变量无关,例如婚姻状况的缺失
(2)随机缺失:缺失值依赖于其他变量,例如“配偶姓名”的缺失取决于“婚姻状况”
(3)完全非随机缺失:缺失值依赖于自己,例如高收入人群不愿易提供家庭收入处理方法

连续变量缺失值的处理

  1. 对于完全随机缺失,当缺失率不高时,可以:
    (1) 用常数补缺,例如均值 特别地,如果存在极端值,要考虑是否剔除极端值后再计算均值; 例如spark mllib的imputer(from pyspark.ml.feature import Imputer)就是取均值。
    (2) 从非缺失值中随机抽样赋予缺失样本。
  2. 对于随机缺失,可以在同一层内,用完全随机缺失的方法进行补缺
  3. 对于完全非随机缺失,可以当成一种属性,将该变量转化成类别变量
    (1) 直接进行二值化,将该特征数据分为缺失值和非缺失值两类 (2) 考虑给定一个step(比如age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中。

类别变量缺失值的处理

(1) 最常出现的类别补缺
(2) 从其他已知的样本中随机抽样进行补缺

离群值

离群值又称极端值,往往会扭曲预测结果并影响模型精度,尤其在回归模型(线性回归,广义线性回归)中。因此,使用这种模型时我们需要对其进行检测和处理。如果要保留这些极端值,可以选择对极端值不敏感的模型,例如KNN,决策树。
另外,如果变量取值变化小、比较平均,那么这样的特征对模型没什么贡献,也可以剔除掉。
统计上通常用3-sigma方法(一般来说,如果某个特征数据,最大值为maxValue,均值为mean,标准差为std。如果满足maxValue>mean+3*std,那么我们就认为这个特征数据存在离群点)检测离群值。
另外还有一些根据距离来检测的算法,例如spark-stochastic-outlier-selection(该方法对于数据量很大时,并不友好)等。

日期/时间型变量

  1. 转为二值型,例如判断时间是否为一个节日、是否是周末、是否是高峰期等
  2. 转为离散型,例如将一天分为24小时、或者上午下午晚上
  3. 基于某个基准日期,转化为距离这一天的天数
  4. 与其他特征组合,例如前半个小时某个事件发生了多少次

数据离散化

在建模中,需要对连续变量离散化。特征离散化后,模型会更稳定,降低了模型过拟合的风险。首先需要把这个变量进行分组处理(也叫离散化、分箱等等,说的都是一个意思)。

无监督分箱法:等距划分、等频划分:

等距划分:
从最小值到最大值之间,均分为 N 等份, 这样, 如果 A,B 为最小最大值, 则每个区间的长度为 W=(B−A)/N , 则区间边界值为A+W,A+2W,….A+(N−1)W 。这里只考虑边界,每个等份里面的实例数量可能不等。
等频划分:
区间的边界值要经过选择,使得每个区间包含大致相等的实例数量。比如说 N=10 ,每个区间应该包含大约10%的实例。
以上两种算法的弊端:
比如,等宽区间划分,划分为5区间,最高工资为50000,则所有工资低于10000的人都被划分到同一区间。等频区间可能正好相反,所有工资高于50000的人都会被划分到50000这一区间中。这两种算法都忽略了实例所属的类型,落在正确区间里的偶然性很大。

有监督的卡方分箱法(ChiMerge):

卡方检验针对分类变量。
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。例如spark mllib里面的ChiSquareTest (from pyspark.ml.stat import ChiSquareTest)。
ChiMerge算法推荐使用0.90、0.95、0.99置信度,最大区间数取10到15之间,置信度取0.90时意味着:类别和属性独立时,有90%的可能性计算得到的卡方值会小于4.6。 大于阈值4.6的卡方值就说明属性和类不是相互独立的,不能合并。

我们对特征进行分箱后,需要对分箱后的每组(箱)进行woe编码,然后才能放进模型训练。
WOE(weight of evidence, 证据权重),一种有监督的编码方式,将预测类别的集中度的属性作为编码的数值。
经验上讲,WOE的绝对值波动范围在0.1~3之间具有业务含义。

但是WOE不能体现变量当前分组中个体的数量占整体个体数量的比例对变量预测能力的影响。所以又提出了一个IV。
IV(Information Value),衡量特征包含预测变量浓度的一种指标
特征分箱越细,IV越高。常用的阈值有: <=0.02: 没有预测性,不可用;0.02 to 0.1: 弱预测性;0.1 to 0.2: 有一定的预测性;0.2 +: 高预测性

对类别型变量编码

dummy编码

当自变量中存在无序多分类的变量时,例如 血型A B AB O,因为它们之间不存在等级关系,所以在引入回归时,不能直接用1、2、3、4来表示,需要将血型转化为哑变量,并且要设置一个参照。虚拟编码使用0或1来表达所有类别的必要信息,这些取值并不代表数量的大小,仅仅表示不同的类别。例如sklearn中的dummy.DummyClassifier
这个例子中用三位数来编码,第一位为1表示是A型 第二位为1表示B型 第三位为1表示AB型,那么A型的编码为100,B型的编码为010,AB型的编码为001,O型自动编码为000。
若是A B AB对某疾病的影响差不多,那么可以用一个数字来编码,1代表A B AB的分类,0代表O型血。
所以dummy编码的作用是将不能够定量处理的变量量化,同时方便模型丢掉一些没用的特征。

one-hot编码

第一个特征两种值(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.]。例如sklearn中的preprocessing.OneHotEncoder和spark mllib中的OneHotEncoderEstimator。
树模型不太需要独热编码。
作用1,使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算。
作用2,几个特征合并到一个特征,达到降维的目的。

归一化/标准化/正则化

归一化(Normalization)

基于参数的模型或基于距离的模型,都要进行特征的归一化。
1.把数据变为(0,1)之间的小数。主要是为了方便数据处理,因为将数据映射到0~1范围之内,可以使处理过程更加便捷、快速。
2.把有量纲表达式变换为无量纲表达式,成为纯量。经过归一化处理的数据,处于同一数量级,可以消除指标之间的量纲和量纲单位的影响,提高不同数据指标之间的可比性。
主要算法:
1.线性转换,即min-max归一化(常用方法)
y=(x-min)/(max-min)
2. 对数函数转换
y=log10(x)
3.反余切函数转换
y=atan(x)*2/PI

标准化(Standardization)

数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。
主要方法:
1.z-score标准化,即零-均值标准化(常用方法)
y=(x-μ)/σ
是一种统计的处理,基于正态分布的假设,将数据变换为均值为0、标准差为1的标准正态分布。但即使数据不服从正态分布,也可以用此法。特别适用于数据的最大值和最小值未知,或存在孤立点。
2.对数Logistic模式
y=1/(1+e^(-x))

正则化(Regularization)

用一组与原不适定问题相“邻近”的适定问题的解,去逼近原问题的解,这种方法称为正则化方法。如何建立有效的正则化方法是反问题领域中不适定问题研究的重要内容。通常的正则化方法有基于变分原理的Tikhonov 正则化、各种迭代方法以及其它的一些改进方法。

总的来说,归一化是为了消除不同数据之间的量纲,方便数据比较和共同处理,比如在神经网络中,归一化可以加快训练网络的收敛性;标准化是为了方便数据的下一步处理,而进行的数据缩放等变换,并不是为了方便与其他数据一同处理或比较,比如数据经过零-均值标准化后,更利于使用标准正态分布的性质,进行处理;正则化而是利用先验知识,在处理过程中引入正则化因子(regulator),增加引导约束的作用,比如在逻辑回归中使用正则化,可有效降低过拟合的现象。

特征提取

通过特征转换,将原始特征转换为新的具有明显物理意义或者统计意义或核的特征的过程,从而达到降维的效果。

特征提取的作用

特征提取是通过特征转换,自动地对原始观测降维,使其特征集合小到可以进行建模的过程。
特征提取有时能发现更有意义的特征属性。
对于表格式数据,可以使用主成分分析(Principal Component Analysis)、聚类等映射方法;
对于图像数据,可以进行线(line)或边缘(edge)的提取;
根据相应的领域,图像、视频和音频数据可以有很多数字信号处理的方法对其进行处理。

特征提取常用方法

PCA (Principal component analysis,主成分分析)

PCA的思想是通过坐标轴转换,寻找数据分布的最优子空间,从而达到降维、去相关的目的。
在数学上,是先用原始数据协方差矩阵的前N个最大特征值对应的特征向量构成映射矩阵,然后原始矩阵左乘映射矩阵,从而对原始数据降维。
PCA算法:通过协方差矩阵的特征值分解能够得到数据的主成分,以二维特征为例,两个特征之间可能存在线性关系(例如运动的时速和秒速度),这样就造成了第二维信息是冗余的。PCA的目标是发现这种特征之间的线性关系,并去除。例如sklearn的decomposition.PCA和spark mllib的from pyspark.ml.feature import PCA

LDA (Linear Discriminant Analysis,线性判别分析)

LDA的原理是将带上标签的数据(点),通过投影的方法,投影到维度更低的空间,使得投影后的点,会形成按类别区分,相同类别的点,将会在投影后更接近,不同类别的点距离越远。
LDA算法:考虑label,降维后的数据点尽可能地容易被区分。例如sklearn中的lda.LDA,不过LDA在许多算法里面都要被删除,不使用了。

ICA(Independent component analysis,独立成分分析)

ICA认为观测到数据矩阵X是可以由未知的独立元举证S与未知的矩阵A相乘得到。ICA希望通过矩阵X求得一个分离矩阵W,使得W作用在X上所获得的矩阵Y能够逼近独立源矩阵S,最后通过独立元矩阵S表示矩阵X,所以说ICA独立成分分析提取出的特征中的独立部分。例如sklearn中的decomposition.FastICA。
PCA特征转换降维,提取的是不相关的部分,ICA独立成分分析,获得的是相互独立的属性。

特征选择

特征选择是剔除不相关或者冗余的特征的过程,从而达到减少有效特征的个数,减少模型训练的时间,提高模型的精确度的效果。

特征选择主要有两个功能

  1. 减少特征数量、降维,使模型泛化能力更强
  2. 减少过拟合,增强对特征和特征值之间的理解

与特征提取的区别

  1. 特征提取通过特征转换实现降维,特征选择则是依靠统计学方法或者于机器学习模型本身的特征选择(排序)功能实现降维。
  2. 特征选择是个重复迭代的过程。

判别特征的重要性是对特征进行选择的预先指标,特征根据重要性被分配分数,然后根据分数不同进行排序,其中高分的特征被选择出来放入训练数据集。

有效性分析

对特征的有效性进行分析,得到各个特征的特征权重,根据是否与模型有关可以分为

1.与模型相关特征权重。

使用所有的特征数据训练出来模型,看在模型中各个特征的权重,由于需要训练出模型,模型相关的权重与此次学习所用的模型比较相关。不同的模型有不同的模型权重衡量方法。例如线性模型中,特征的权重系数等。

2.与模型无关特征权重。

主要分析特征与label的相关性,这样的分析是与这次学习所使用的模型无关的。与模型无关特征权重分析方法包括(1)交叉熵,(2)Information Gain,(3)Odds ratio,(4)互信息,(5)KL散度等

具体的方法

1 去掉取值变化小的特征

假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。

2 单变量特征选择

单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。
在单因子分析中,如果某个变量对目标变量影响不大甚至完全独立,那么可以去掉这个变量。 如果两个变量相关性很高,其中一个变量解释性比较高,另外一个变量解释性比较低时,即使解释性比较低的变量效果更好一些,我们也会将其去掉,保留解释性比较高的那个变量。当然这是在回归模型中(奇异性问题)。其他模型不需要剔除。

2.1 Pearson相关系数 Pearson Correlation

能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关(这个变量下降,那个就会上升),+1表示完全的正相关,0表示没有线性相关。Sklearn提供的f_regrssion方法能够批量计算特征的p-value;pandas的df.corr()和spark mllib的Correlation.corr()也能够获取pearson相关系数。

2.2 互信息和最大信息系数 Mutual information and maximal information coefficient (MIC)

2.3 距离相关系数 (Distance correlation)

距离相关系数是为了克服Pearson相关系数的弱点而生的。在x和x^2这个例子中,即便Pearson相关系数是0,我们也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是0,那么我们就可以说这两个变量是独立的。

2.4 基于学习模型的特征排序 (Model based ranking)

例如 sklearn中的regr.featureimportances和 xgboost的 bst.get_fscore(fmap='xgb.fmap')

3 线性模型和正则化

在很多实际的数据当中,往往存在多个互相关联的特征,这时候模型就会变得不稳定,数据中细微的变化就可能导致模型的巨大变化(模型的变化本质上是系数,或者叫参数,可以理解成W),这会让模型的预测变得困难,这种现象也称为多重共线性。例如,假设我们有个数据集,它的真实模型应该是Y=X1+X2,当我们观察的时候,发现Y’=X1+X2+e,e是噪音。如果X1和X2之间存在线性关系,例如X1约等于X2,这个时候由于噪音e的存在,我们学到的模型可能就不是Y=X1+X2了,有可能是Y=2X1,或者Y=-X1+3X2。

3.1 正则化模型

正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。损失函数由原来的E(X,Y)变为E(X,Y)+alpha||w||,w是模型系数组成的向量(有些地方也叫参数parameter,coefficients),||•||一般是L1或者L2范数,alpha是一个可调的参数,控制着正则化的强度。当用在线性模型上时,L1正则化和L2正则化也称为Lasso和Ridge。

3.2 L1正则化/Lasso

L1正则化将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成0。因此L1正则化往往会使学到的模型很稀疏(系数w经常为0),这个特性使得L1正则化成为一种很好的特征选择方法。
如果继续增加alpha的值,得到的模型就会越来越稀疏,即越来越多的特征系数会变成0。然而,L1正则化像非正则化线性模型一样也是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异。

3.3 L2正则化/Ridge regression

L2正则化将系数向量的L2范数添加到了损失函数中。由于L2惩罚项中系数是二次方的,这使得L2和L1有着诸多差异,最明显的一点就是,L2正则化会让系数的取值变得平均。对于关联特征,这意味着他们能够获得更相近的对应系数。还是以Y=X1+X2为例,假设X1和X2具有很强的关联,如果用L1正则化,不论学到的模型是Y=X1+X2还是Y=2X1,惩罚都是一样的,都是2alpha。但是对于L2来说,第一个模型的惩罚项是2alpha,但第二个模型的是4*alpha。可以看出,系数之和为常数时,各系数相等时惩罚是最小的,所以才有了L2会让各个系数趋于相同的特点。

4 随机森林

随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。

4.1 平均不纯度减少 mean decrease impurity

随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。

4.2 平均精确率减少 Mean decrease accuracy

另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。

5 两种顶层特征选择算法

之所以叫做顶层,是因为他们都是建立在基于模型的特征选择方法基础之上的,例如回归和SVM,在不同的子集上建立模型,然后汇总最终确定特征得分。

5.1 稳定性选择 Stability selection

稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。

5.2 递归特征消除 Recursive feature elimination (RFE)

递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。

总结

对于理解数据、数据的结构、特点来说,单变量特征选择是个非常好的选择。尽管可以用它对特征进行排序来优化模型,但由于它不能发现冗余(例如假如一个特征子集,其中的特征之间具有很强的关联,那么从中选择最优的特征时就很难考虑到冗余的问题)。
正则化的线性模型对于特征理解和特征选择来说是非常强大的工具。L1正则化能够生成稀疏的模型,对于选择特征子集来说非常有用;相比起L1正则化,L2正则化的表现更加稳定,由于有用的特征往往对应系数非零,因此L2正则化对于数据的理解来说很合适。由于响应变量和特征之间往往是非线性关系,可以采用basis expansion的方式将特征转换到一个更加合适的空间当中,在此基础上再考虑运用简单的线性模型。
随机森林是一种非常流行的特征选择方法,它易于使用,一般不需要feature engineering、调参等繁琐的步骤,并且很多工具包都提供了平均不纯度下降方法。它的两个主要问题,1是重要的特征有可能得分很低(关联特征问题),2是这种方法对特征变量类别多的特征越有利(偏向问题)。尽管如此,这种方法仍然非常值得在你的应用中试一试。
特征选择在很多机器学习和数据挖掘场景中都是非常有用的。在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种方法是否比其他方法要好。当用特征选择的方法来理解数据的时候要留心,特征选择模型的稳定性非常重要,稳定性差的模型很容易就会导致错误的结论。对数据进行二次采样然后在子集上运行特征选择算法能够有所帮助,如果在各个子集上的结果是一致的,那就可以说在这个数据集上得出来的结论是可信的,可以用这种特征选择模型的结果来理解数据。

特征学习

特征学习是在深度学习中,算法可以从原始数据中自动识别和使用特征。
现代深度学习方法在特征学习领域有很多成功案例,抽象的特征表达可以自动得到,但是你无法理解和利用这些学习得到的结果,只有黑盒的方式才可以使用这些特征。

用一张图来总结

alt (不想画了,盗图)

参考

http://www.csuldw.com/2015/10/24/2015-10-24%20feature%20engineering/
http://dataunion.org/14072.html
http://blog.csdn.net/u013421629/article/details/78416748