前面我们说过,特征工程在数据挖掘任务中非常重要,可以说直接关系着后续模型效果的好坏。不过要做好特征工程并不容易,它既需要对业务有深入的理解,还要求掌握扎实的专业知识。在数据分析中,常用的特征工程方法包括特征放缩和特征编码,前者主要是归一化和正则化,用于消除量纲关系的影响。后者包括了序号编码、独热编码等,主要是处理类别型、文本型以及连续型特征。下面将给大家分别介绍特征放缩和特征编码的具体处理方法。
一、特征放缩
1、归一化
归一化(Normalization),也称为标准化,这里不仅仅是对特征,实际上对于原始数据也可以进行归一化处理,它是将特征(或者数据)都缩放到一个指定的大致相同的数值区间内。
- 常用的两种归一化方法
线性函数归一化(Min-MaxSCaling)。它对原始数据进行线性变换,使得结果映射到[0,1]的范围,实现对原始数据的等比缩放,其公式如下:
零均值归一化(Z-ScoreNormalization)。它会将原始数据映射到均值为0,标准差为1的分布上,其公式如下:
需要注意的是,如果数据集分为训练集、验证集、测试集,那么三个数据集都需要采用相同的归一化方法,数值都是通过训练集计算得到,即上述两种方法中分别需要数据的最大值、最小值、方差和均值都是通过训练集计算得到。但归一化不是万能的,在实际应用中,通过梯度下降法求解的模型是需要归一化的,这包括线性回归、逻辑回归、支持向量机、神经网络等模型。但决策树模型不需要,以C4.5 算法为例,决策树在分裂结点的时候主要依据数据集 D关于特征 x的信息增益比,而信息增益比和特征是否经过归一化是无关的,即归一化不会改变样本在特征 x上的信息增益。
2、正则化
正则化是将样本或者特征的某个范数(如 L1、L2 范数)缩放到单位1。
假设数据集为D:
对样本首先计算范数,得到:
正则化后的结果是每个属性值除以其范数
注意:正则化的过程是针对单个样本的,对每个样本将它缩放到单位范数。而归一化是针对单个属性的,需要用到所有样本在该属性上的值。
二、特征编码
1、序号编码
序号编码一般用于处理类别间具有大小关系的数据。比如用户价值,可以分为高、中、低三个档次,并且存在“高>中>低”的大小关系,那么序号编码可以对这三个档次进行如下编码:高表示为3,中表示为2,低表示为1,这样转换后依然保留了大小关系。
2、独热编码
独热编码通常用于处理类别间不具有大小关系的特征。独热编码是采用N位状态位来对N个可能的取值进行编码。比如年龄段,一共有 4 个取值(0-18、19-36、37-54 以及55岁以上),那么独热编码会将年龄段转换为一个4维稀疏向量,分别表示上述四种年龄段为:0-18岁:(1,0,0,0)、19-36岁:(0,1,0,0)、37-54岁:(0,0,1,0)、55岁以上:(0,0,0,1)。
3、二进制编码
二进制编码主要分为两步,先采用序号编码给每个类别赋予一个类别ID,然后将类别 ID对应的二进制编码作为结果。继续以年龄段为例子,如下表所示:
年龄段 | 类别 ID | 二进制表示 | 独热编码 |
---|---|---|---|
0-18岁 | 1 | 0 0 1 | 1 0 0 0 |
19-36岁 | 2 | 0 1 0 | 0 1 0 0 |
37-54岁 | 3 | 0 1 1 | 0 0 1 0 |
55岁以上 | 4 | 1 0 0 | 0 0 0 1 |
从上表可以知道,二进制编码本质上是利用二进制对类别 ID进行哈希映射,最终得到 0/1 特征向量,并且特征维度小于独热编码,更加节省存储空间。
4、二元化
特征二元化就是将数值型的属性转换为布尔型的属性。通常用于假设属性取值分布是伯努利分布的情形。特征二元化的算法比较简单。对属性i指定一个阈值m。如果样本在属性i上的值大于等于m, 则二元化后为1;如果样本在属性i上的值小于m,则二元化为0。
5、离散化
离散化可以理解为二元化的一般形式,对数值型的属性i指定多个阈值,将属性i分隔成多个分段。那么什么时候需要采用特征离散化呢?这就要考虑是采用“海量离散特征 简单模型”,还是采用“少量连续特征 复杂模型”的做法了。
对于线性模型,通常使用“海量离散特征 简单模型”的方式。其特点是模型比较简单,但特征工程比较困难,但一旦有成功的经验就可以推广,并且可以很多人并行研究;对于非线性模型(比如深度学习),通常使用“少量连续特征 复杂模型”的方式。其特点是不需要复杂的特征工程,但模型相对较复杂。具体采用哪一种做法我们可以根据实际情况来决定。
总的来说,特征缩放是非常常用的方法,特别是归一化处理特征数据,对于利用梯度下降来训练学习模型参数的算法,有助于提高训练收敛的速度;而特征编码,特别是独热编码,也常用于对结构化数据的数据预处理。好了,本节课介绍到此,有时间再跟大家继续分享其他干货内容。