第一节:前言
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。
特征工程:利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。
特征工程包含了Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和Feature construction(特征构造)等子问题,而数据预处理又包括了数据清洗和特征预处理等子问题,本篇文章主要讨论数据预处理的方法及实现。
下图展示的是特征预处理的内容:
第二节:数值型特征无量纲化
2.1 为什么要做无量纲化处理?
在实际应用中,样本不同特征的单位不同,会在求距离时造成很大的影响。比如:在两个样本中肿瘤大小分别为1cm和5cm,发现时间分别为100天和200天,那么在求距离时,时间差为100、大小差为4,那么其结果会被时间所主导,因为肿瘤大小的差距太小了。但是如果我们把时间用年做单位,0.27年与0.55年的差距又远小于肿瘤大小的差距,结果又会被大小所主导。
为了避免上述问题对结果造成影响,我们需要对数据做无量纲化处理。无量纲化不是说把天数变成年数,而是说,无论是天数还是年数,最后都会变成1,也就是没有了单位。常见的无量纲化方法有标准化和归一化两种。
2.2数据标准化(Standardization)
前提:标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。
定义:基于原始数据的均值(mean)和标准差(standarddeviation)进行数据标准化。将 A 的原始值 x 使用z-score标准化到x’。z-score标准化方法适用于属性 A 的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。
标准化公式如下
注意:均值和标准差都是在样本集上定义的,而不是在单个样本上定义的。标准化是针对某个属性的,需要用到所有样本在该属性上的值。
接下来看一下标准化的效果吧:
优点:
Z-Score最大的优点就是简单,容易计算,Z-Score能够应用于数值型的数据,并且不受数据量级(数据多少)的影响,因为它本身的作用就是消除量级给分析带来的不便。
缺点:
- 估算Z-Score需要总体的平均值与方差,但是这一值在真实的分析与挖掘中很难得到,大多数情况下是用样本的均值与标准差替代。
- Z-Score对于数据的分布有一定的要求,正态分布是最有利于Z-Score计算的。
- Z-Score消除了数据具有的实际意义,属性A的Z-Score与属性B的Z-Score与他们各自的分数不再有关系,因此Z-Score的结果只能用于比较数据间的结果,数据的真实意义还需要还原原值。
- 在存在异常值时无法保证平衡的特征尺度。
那么我们什么时候需要对数据进行标准化呢?
- 某些算法要求样本具有零均值和单位方差。
- 需要消除样本不同属性具有不同量级(大小)时的影响。
- 归一化有可能提高精度。
数量级的差异将导致量级较大的属性占据主导地位,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。 - 数量级的差异将导致迭代收敛速度减慢。
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛。 - 依赖于样本距离的算法对于数据的数量级非常敏感。
- 归一化有可能提高精度。
代码:
from sklearn.preprocessing import StandardScaler
#标准化,返回值为标准化后的数据
standardScaler = StandardScaler().fit(X_train)
standardScaler.transform(X_train)
2.3数据归一化
2.3.1MinMax归一化
定义:区间缩放法利用了边界值信息,将属性缩放到[0,1]区间。
公式如下:
效果如下:
代码:
from sklearn.preprocessing import MinMaxScaler
#区间缩放,返回值为缩放到[0, 1]区间的数据
minMaxScaler = MinMaxScaler().fit(X_train)
minMaxScaler.transform(X_train)
缺点:
- 这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。
- MinMaxScaler对异常值的存在非常敏感。
2.3.2MaxAbs归一化
定义:单独地缩放和转换每个特征,使得训练集中的每个特征的最大绝对值将为1.0,将属性缩放到[-1,1]。它不会移动/居中数据,因此不会破坏任何稀疏性。
公式如下: