人工智能程序员面试笔试宝典
上QQ阅读APP看书,第一时间看更新

2.3 特征工程

在机器学习算法工程师的日常工作中有个非常重要的总结:“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。”由此可见特征工程在一个机器学习项目中的重要地位。特征工程是一个庞大的工程,主要分为四块:数据预处理、特征选择、特征降维、特征构造。

在面试过程中,面试官不会仅仅提问这些问题,更多的会结合求职人员以往的工作经验或者项目经验,例如数据预处理、特征选择、特征降维每部分都有大量的现有算法可使用,如何根据项目属性选择算法,请简单举几个实例。例如结合做过的项目举例特征工程中如何构造出重要的特征等。

2.3.1 数据预处理主要包括什么

1.无量纲化

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

(1)标准化

理论上,标准化适用于服从正态分布的数据,目前很多工程都依赖大数据,所以在样本足够多的情况下,工程师往往直接使用标准化对数据进行无量纲化预处理。在深度学习里,将数据标准化到一个特定的范围能够在反向传播中保证更好的收敛。如果不进行数据标准化,有些特征(值很大)将会对损失函数影响更大,使得其他值比较小的特征重要性降低。因此数据标准化可以使得每个特征的重要性更加均衡。公式表达为:

代码如下:

(2)归一化/区间缩放法

归一化适用于数据量较小的工程。顾名思义就是利用两个最值进行缩放,公式表达为:

代码如下:

2.哑编码与独热编码

如果某一列数据是一些特征,例如中国、美国、德国这种国家属性,那就无法直接将这种信息应用到回归或者分类里,所以需要对数据进行哑编码或者独热编码,目的就是针对定性的特征进行处理然后得到可以用来训练的特征。哑编码与独热编码的区别主要就是哑编码任意去除了一个状态位。这两种方式将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点,使得特征之间的距离计算更加合理。

具体例子,假设国家这个特征有中国、美国、德国、法国四种可能的取值,那么独热编码就会用一个四维的特征向量表示该特征,其中每个维度对应一个国家,也叫作状态位,独热编码保证四个状态位有一个位置是1,其余是0。而哑编码的只需要3个状态位,当三个状态为都是0时,根据既不是中国又不是美国、德国的逻辑,就可以确认是法国了。

代码如下:

3.缺失值补充

缺失值补充最常用的方法是使用均值、就近补齐、K最近距离填充等方法。特别需要注意的是,有的时候缺失值也是一种特征,可以补充一列将数据缺失与否赋值为0、1,但这个需要根据具体的项目判断。

如果缺失值较多时,可以直接舍弃该列特征,否则可能会带来较大的噪声,从而对结果造成不良影响。如果缺失值较少时(如少于10%),可以考虑对缺失值进行填充,以下是几种常用的填充策略。

1)用一个异常值填充并将缺失值作为一个特征处理(比如0或-9999)。

2)用均值或者条件均值填充,如果数据是不平衡的,那么应该使用条件均值填充,条件均值指的是与缺失值所属标签相同的所有数据的均值。

3)用相邻数据填充。

4)利用插值算法。

5)数据拟合,就是将缺失值也作为一个预测问题来处理。简单来讲就是将数据分为正常数据和缺失数据,对有值的数据采用随机森林等方法拟合,然后对有缺失值的数据用预测的值来填充。

2.3.2 特征选择主要包括什么

特征选择是非常关键的步骤,选入大量的特征不仅会降低模型效果,也会耗费大量的计算时间。而漏选的特征也会直接影响到最终的模型效果。一般情况下主要利用以下办法进行特征选择。

1.方差选择法

假如某列特征数值变化一直平缓,说明这个特征对结果的影响很小,所以可以计算各个特征的方差,选择方差大于自设阈值的特征。

代码如下:

2.相关系数,统计检验

相关系数或者统计检验都可以用来特征选择,常用的有pearson相关系数和卡方检验,前者主要应用于连续变量,后者用于离散变量等。pearson相关系数代码如下:

3.互信息法

互信息也经常被用来评价自变量对因变量的相关性,互信息计算公式如下:

4.基于机器学习的特征选择法

这种方法主要是针对特征和响应变量建立预测模型,例如用基于树的方法(决策树、随机森林、GBDT),或者扩展的线性模型等。代码如下:

下面简要介绍一种利用随机森林算法降维的算法。

随机森林算法将在第3章详细介绍,此处仅介绍如何利用随机森林算法进行降维。随机森林算法具有很强大的随机性,因此相对于其他许多模型算法,它的系统误差更小,同时具有更好的分类性能。这主要是由以下两个原因决定的:第一,在根据原始样本总体随机抽取训练样本时采用随机有放回的抽样,从而使得训练样本的随机性得以保障;第二,基分类器中每颗决策树在延伸的同时对变量特征的选择采用随机的方法。

在利用随机森林算法评估特征变量重要性时,主要依据每个特征变量在随机森林中的每棵树上做了多大的贡献,然后取平均值,最后比较不同特征之间的贡献值大小。本文以基尼系数(Gini)作为评价指标来衡量特征变量的贡献。

变量的重要性评分用V表示,假设有m个特征X1X2,…,Xm,则每个特征XjGini指数评分Vj,即第j个特征在随机森林所有决策树中结点分裂不纯度的平均改变量,Gini指数的计算公式如下表示:

其中k表示第k个类别,pmk表示结点m中类别k所占比例,K表示分类个数。

特征变量Xj在结点m的重要性,即结点m分支前后的Gini指数变化量为:

其中GiniιGinir分别表示分支后两个新点的Gini指数。

如果特征Xj在决策树i中出现的结点在集合M中,那么Xj在第i棵树的重要性为:

假设随机森林共有n棵树,那么:

最后将所有求得的重要性评分进行归一化处理得到重要性评分:

利用Python计算随机森林模型返回特征的重要性的代码也非常简单,如下所示:

2.3.3 特征降维主要包括什么

如果特征矩阵过大,就会导致训练时间过长,所以需要降低特征矩阵维度。降维是指通过保留重要的特征,减少数据特征的维度。而特征的重要性取决于该特征能够表达多少数据集的信息,也取决于使用什么方法进行降维。特征降维方法包括PCA、LDA、奇异值分解SVD和局部线性嵌入LLE。而降维的好处有节省存储空间,加快计算速度,避免模型过拟合等。

1.主成分分析法(PCA)

PCA是一个将数据变换到一个新的坐标系统中的线性变换,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。PCA主要目的是为让映射后得到的向量具有最大的不相关性。详细地讲就是PCA追求的是在降维之后能够最大化保持数据的内在信息,并通过衡量在投影方向上的数据方差的大小来衡量该方向的重要性。算法步骤:

(1)计算相关系数矩阵

rij(i, j=1, 2, …,p)为原变量xixj的相关系数,其计算公式为:

(2)计算特征值与特征向量

解特征方程,用雅可比法(Jacobi)求出特征值,并使其按大小顺序排列λ1λ2≥…≥λp≥0;特征值λi对应的特征向量为ei,且

(3)计算主成分贡献率及累计贡献率

对应的单位特征向量ei就是主成分zi的关于原变量的系数,即

贡献率:

累计贡献率:

一般取累计贡献率达85%~95%的特征值λ1,λ2,…,λm所对应的第1、第2、…、第mmp)个主成分z1,z2,…,zm

(4)计算主成分载荷

主成分载荷是反映主成分zi与原变量xj之间的相互关联程度。

需要的注意的是实际应用时,指标的量纲往往不同,所以在主成分计算之前应先消除量纲的影响。将变量标准化后再计算其协方差矩阵。

代码如下:

2.线性判别分析法(LDA)

LDA是一种有监督的降维方法,主要是将高维的模式样本投影到最佳鉴别的空间。其目的是投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即同类的数据点尽可能地接近而不同类的数据点尽可能地分开。

LDA和PCA的区别是一个很重要的知识点,它们主要有以下区别。

1)LDA是有监督的降维方法,而PCA是无监督的。

2)LDA降维最多降到类别数k-1的维数,而PCA没有限制。

3)LDA选择分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。换句话说就是PCA是为了让映射后的样本发散性最大;而LDA是为了让映射后的样本分类性能最好。

代码如下:

3.局部线性嵌入(LLE)

局部线性嵌入算法认为每个数据点可以由其近邻点的线性加权组合构造得到,能够使降维后的数据较好地保持原有流形结构。主要算法步骤是寻找每个样本点的k个近邻点,由每个样本点的近邻点计算出该样本点的局部重建权值矩阵,由该样本点的局部重建权值矩阵和其近邻点计算出该样本点的输出值。

在真实工业场景中,局部线性嵌入用得较少。

2.3.4 特征构造主要包括什么

特征构造主要是针对具体的项目属性,数据特点来构造出可能的重要特征。特征构造是非常关键的步骤,对模型效果的提升帮助巨大。而这一部分的知识积累很难从书本中获得,要从真实项目中多积累经验。以下举3个简单的例子。

例如预测某商场未来的销售量,那么是不是周末、节假日就是很重要的特征,应当利用独特编码将其列为单独一个特征。

例如客户关系管理的项目中,有3个指标就很重要:最近一次消费间隔时长、消费频率、消费金额。如果原始数据中没有这些特征,则需要根据原始数据计算出来。

例如预测交通流量,那么是不是早晚高峰时期、道路的宽度、红绿灯个数就是非常重要的特征。