特征工程是机器学习中一项复杂且重要的工作,使用两句名言来引出今天要说的内容的重要性,基于大数据的简单模型优于基于少量数据的复杂模型,更多的数据胜过聪明的算法。而特征工程的首要任务是收集足够多的数据,其次就是从这么多的数据中提取到关键信息,接下来就是来介绍不同类型的特征的处理方法。
数值类型
数组类型就是例如常见的身高体重,是有一个连续的值构成,一般有如下几种方式处理。
- 截断: 对于连续特征,有时候太多的精度可能只是噪声,因此可以保留信息的基础上进行截断,截断后可以看做类型特征。
- 二值化:数字类特征还有一种常用的类型是计数特征,例如PV,UV。处理计数特征的时候,首先要考虑保留原始计数还是直接做分桶处理。
- 分桶:比较常用的是将原始数据的特征进行等宽的分桶,但是当数据量区间不均匀的时候,发现有些分桶可能是空的,所以这个时候可以根据原始数据的分布进行分桶,也称为分位数分桶,其每个桶里对应的数据量一样多。也可以使用聚类,先将样本无监督的聚成几类,然后观察每个类别内的取值范围。
- 缩放: 如下文提到的不同的归一化方法就属于这类方法。
- 特征交叉:将不同特征进行±*/的操作,获取一个新的特征
- 非线性编码:引入核函数的概念,引入非线性特征,之前讲过比较典型的是将随机森林的叶子节点编号喂给神经网络。
归一化
对于数值类型的特征可以进行归一化操作,而归一化意味着将现有数据整理到某一个范围内。
Min-max归一化
目标是将所有的数据归一化到[0,1]之间。作用是将数据缩放到一个固定的范围内,通常是0到1或-1到1之间。这种转换可以将不同特征的值域统一,避免了极大值或极小值对模型训练的影响,同时也可以减少数据的方差,提高模型的稳定性。
X=Xm−XiX−Xi
Xm代表X序列最大值,Xi代表X序列的最小值。
需要说明的是以上的归一化方法在大多是情况是没问题的,但是也有一些场景是比较特殊的。
- 数据分布不均匀:如果数据分布不均匀,使用Min-max归一化可能导致数据的某些部分被压缩到了很小的范围内,而另一些部分则被放大到了很大的范围内。这时可以尝试使用Z-score归一化或Log归一化等方法。
- 数据存在异常值:如果数据中存在异常值,使用Min-max归一化可能导致数据被缩放到很小的范围内,而异常值则被放大到很大的范围内。这时可以尝试使用Robust Scaling等鲁棒性更强的归一化方法。
- 数据分布不满足正态分布:如果数据分布不满足正态分布,使用Z-score归一化可能会导致数据被缩放到很小的范围内,而数据的分布形态并没有改变。这时可以尝试使用Log归一化等方法。
- 数据存在负值:如果数据存在负值,使用Min-max归一化会使得数据被缩放到-1到1之间,而不是0到1之间。这时可以尝试使用Range归一化或Z-score归一化。
标准化
目的是将原始数据归一化到均值为0,方差为1的分布上。作用是将数据转换为具有标准正态分布的形式,即均值为0,标准差为1的分布。通过这种转换,可以消除不同特征之间的量纲差异,使得不同特征的权重更加平等,从而提高模型训练的效果。
Z-score标准化
X=σx−μ
归一化其实是对应梯度下降的计算法方式,一个取值范围在[0,10]和一个取值范围在[0,1]之间的数据下降的次数是不一样的。
-
数据分布符合正态分布:如果数据分布符合正态分布,且算法对数据分布的偏态不敏感,可以选择Z-score标准化方法。因为Z-score标准化可以将数据转换为标准正态分布,方便进行后续的统计分析和建模。
-
数据分布不符合正态分布:如果数据分布不符合正态分布,可以选择MinMax标准化或Robust Scaling等方法。MinMax标准化可以将数据缩放到一定范围内,不受数据分布影响,而Robust Scaling可以缩放数据并抑制异常值的影响,适用于数据存在异常值的情况。
正则化
这里需要强调的是上面将到的归一化其实相对列来处理的,而正则化是相对于行来处理的,一般叫做特征正则化。
这里介绍一种P-norm正则化。
∣∣x∣∣p=∣x1∣p+∣x2∣p+..+∣xn∣pp1
被正则化的特征就如下表示
y=∣∣x∣∣pxi
正则化的作用
数据的正则化是一种常用的数据预处理技术,其主要作用是将不同尺度范围的特征数据转化为统一的标准范围,以消除特征之间的尺度差异。
正则化对数据进行缩放,通常将数据映射到0到1之间或者某个固定的范围内。通过对数据进行正则化,可以带来以下几个主要作用:
-
特征比较公平:当数据的不同特征具有不同的尺度范围时,直接进行比较和分析可能会受到尺度影响。通过正则化,可以消除特征之间的尺度差异,使得不同特征具有更公平的比较基准。
-
避免模型偏向:在许多机器学习算法中,例如梯度下降法,模型的训练可能会受到特征尺度的影响。具有较大尺度范围的特征可能会对模型的权重更新产生更大的影响,导致模型偏向那些具有较大尺度的特征。通过正则化,可以避免这种偏向,使得模型能够更平衡地学习特征之间的关系。
-
提高收敛速度:在某些优化算法中,特征尺度差异较大可能导致收敛速度较慢。通过正则化,可以加快算法的收敛速度,使得模型更快地达到稳定状态。
-
防止数值不稳定:某些计算操作在数据尺度较大或较小的情况下可能会导致数值不稳定。通过正则化,可以将数据范围缩放到更合适的范围,减少数值计算过程中的不稳定性。
注意
当然并不是所有的方法都需要进行数据归一化,对于决策树这类树模型就不适合归一化,或者说归一化的效果不明显。
类别特征
序号编码
这种方式就是将原始数据中的类似高、中、低这类数据变成1,2,3这种方式。
独热编码
这类编码方式也比较简单,就是将类型本身的取值的位置变成1,其他位置变成0即可。
二进制编码
二进制编码比较不常用,他的思路是将序号编码与进行二进制的转换。例如1就是001 2就是010.将信息压缩到更短的数据中。
时间特征
时间特征常用的表达方式是年月日时分秒等等表达方式,同时也有是否是某节假期这类特征。
当然这里对于时间特征比较正常的做法是如上的描述,如果你套上一个业务场景,时间特征是能够做的比较有意思的。例如你是一个代驾业务, 那么周五应该是你的一个高峰期,但是周五为什么能成为一个高峰期的标志呢? 例如国庆节里的周五也是一个高峰期吗? 显然是比较虚的。这里分析一个原因是周五是否是一个高峰期是由第二天周六放假的原因,这样就就可以做这样一个特征, 就是当前时间距离放假的距离,从而标记时间特征。
当然对于节假期的特征,如果只是标记类型,也比较空洞,很难捕捉更多的特征, 如果你使用元旦的第几天的特征,这样就能将时间维度进一步拆解,方便模型的学习。
空间特征
空间特征一般包括经纬度,街道ID,城市ID等等类别特征,再高级一点会引入各种距离特征