特征工程:是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题和预测模型之间的关系。
对于机器学习问题,数据和特征往往决定了结果的上限,而算法,模型的选择及优化则是在逐步接近这个上限。特征工程的框架图:
常用的数据类型:
(1)结构化数据:可以看成关系型数据库的一张表,每列都有清晰的定义,包含了数值型和类别型两种基本数据类型;每行代表一个样本的信息。
(2)非结构化数据:主要包括文本、图像、音频、视频教程,其包含的信息无法用一个简单的数值表示,也没有清晰的类别定义,并且数据的大小各不相同。
第1问:为什么对数据进行归一化?
为了消除数据特征之间的量纲影响,对数据进行归一化,使得不同指标之间具有可比性。对数值型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间内。常用方法:
(1)线性函数归一化(Min-Max Scaling):它是对数据进行线性变换,使结果映射到[0,1]范围,实现对数据的等比缩放。
(2)零均值归一化(Z-score Normalization):它将数据映射到均值为0,标准差为1的分布上。假设原始特征的均值是,标准差是,公式为
例:以梯度下降的实例说明,未归一化的数据在学习速率相同的情况下,对数据进行归一化之后,数据可以更快地找到最优解。
在实际应用中,通过梯度下降法求解的模型通常是需要归一化的,包括线性回归,逻辑回归,支持向量机,神经网络模型等。但是对于决策树模型并不适用,归一化之后的数据并不会改变样本在特征X上的信息增益。
其他:树形模型是否需要归一化?
树形模型不需要归一化,不会影响结点分裂时的选择特征。
第2问:在数据处理时,类别型特征怎么处理?
类别型特征主要是只在有限选项内取值的特征,例如性别(男女),血型(A,B,AB,O)。类别型特征原始输入通常是字符串类型,除了决策树等少数模型能直接处理字符串形式的输入,对于逻辑回归等大部分模型来说,都需要处理转换成数值型特征。
处理方法:序号编码(Ordinal Encoding),独热编码(One-hot Encoding),二进制编码(Binary Encoding)
序号编码:用于处理类别间具有大小关系的数据。如成绩可以分为低,中,高三档。并存在排序问题,表示为高3,中2,低1。
独热编码:用于处理类别间不具有大小关系的特征。如血型有四个取值,可以转换为4维稀疏变量,如:
血型 | A | B | AB | O |
1 | 0 | 0 | 0 | |
0 | 1 | 0 | 0 | |
0 | 0 | 1 | 0 | |
0 | 0 | 0 | 1 |
对于类别取值较多的情况下使用独热编码应该注意:
(1)使用稀疏向量来节省空间。在独热编码下,特征向量只有某一维取值为1,其他位置均取0。因此可以利用向量的稀疏表示有效地节省空间。
(2)配合特征选择来降低难度。高维特征会带来以下问题:一是KNN中,高维空间下两点的距离很难得到有效的衡量。二是在逻辑回归模型中,参数的数量会随着维度的增高而增加,容易引起过拟合问题。三是通常只有部分维度是对分类、预测有帮助,因此可以考虑配合特征选择来降低维度。(注:不太明白什么叫配合特征选择,是在这个编码下,只取部分特征吗,这个特征怎么取,方法呢?会不会造成特征丢失?)
二进制编码:主要是分两步:先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。如下:
血型 | 类别ID | 二进制表示 |
A | 1 | 001 |
B | 2 | 010 |
AB | 3 | 011 |
O | 4 | 100 |
二进制是对ID进行哈希映射,最终得到0/1特征向量,且维数少于独热编码,节省了存储空间。
其他编码方式:Helmert Contrast,Sum Contrast,Polynomial Contrast,Backward Difference Contrast。