对于一个机器学习问题,数据和特征往往决定了结果的上线,而模型、算法的选择及优化则是在逐步接近这个上限。
特征工程,就是对原始数据进行一系列工程处理,将其提炼为特征,做为输入供算法和模型使用。
特征工程的目的是去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。
一、特征归一化
数据归一化,使各指标处于同一数值量级,使不同指标之间具有可比性。
归一化的方法:线性函数归一化((对应值-最小值)/(最大值-最小值));零均值归一化(均值为0,标准差为1分布,公式:(对应值 - 均值)/标准差)。
为什么对数值类型的特征做归一化?
例如:两种数值特征,x1~[0,5] x2~[0,10],使用随机梯度下降时,在学习速率相同的情况下,x1比x2需要较多的迭代才能找到最优解,这个时候训练的话,两种特征对结果的影响就会因为数值范围不同而受影响。但是将两种数值特征归一化到相同的数值区间后,他们的迭代速度就是一样的,对最后结果的影响就不会因为数值范围不同而有影响。
数据归一化不是万能的,通过梯度下降法求解的模型通常是需要归一化的,包括线性模型、逻辑回归、支持向量机、神经网络等模型。但是决策树就不适用。比如c4.5,节点分裂时,选择的依据是信息增益比。而信息增益比与是否归一化无关。
二、类别型特征
类别型特征(比如性别):原始输入通常是字符串形式,除了决策树等少数模型能直接处理字符串形式的输入,对于逻辑回归、支持向量机等模型,类别型特征必须经过处理转换成数值型特征才能正确工作。
在对数据进行预处理时,应该怎样处理类别型特征?
序号编码
独热编码
二进制编码
序号编码:用于处理类别间具有大小关系的数据。比如成绩:92,91,90。序号分别表示为3,2,1。转换后依然保留了大小关系。
独热编码:用于处理类别间不具有大小关系的特征。例如:血型,一共4个取值。独热编码将其转化为一个4维稀疏向量。A型血表示为(1,0,0,0),B型血表示为(0,1,0,0),AB型血表示为(0,0,1,0),O型血表示为(0,0,0,1)。对于类别取值较多的情况下使用独热编码需要注意两个问题:1. 使用稀疏向量来节省空间。在独热编码下,特征向量只有某一维取值为1,其他位置取值均为0,因此可以用向量的稀疏表示有效的节省空间,并且大部分的算法均接受稀疏向量形式的输入。2.配合特征选择来降低维度。高维度特征会带来几方面的问题。一是在k近邻算法中,高维空间下两点之间的距离很难得到有效的衡量;二是在逻辑回归模型中,参数的数量会随着维度的增高而增加,容易引起过拟合;三是通常只有部分维度是对分类、预测有帮助,因此可以考虑配合特征选择来降低维度。
二进制编码:先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。本质上是利用二进制对 ID 进行哈希映射,最终得到0/1特征向量,且维数少于独热编码,节省了存储空间。例如:对四种血型的表示为:A型血是001,B型血是010,AB型血是011,O型血是100。
还有很多其他的编码方式:如Helmert Contrast、Sum Contrast、Polynomial Contrast、Backward Difference Contrast。
向量的稀疏表示: 向量(1, 0, 0, 1, 3, 0) 密集表示:[1, 0, 0, 1, 3, 0]。稀疏表示:(6, [0, 3, 4], [1, 1, 3]) 6表示向量的长度,[0, 3, 4]表示的是有值的索引组成的数组,[1, 1, 3]表示的是不为0的值组成的数组。