Python机器学习算法与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 特征变换

特征变换的主要内容是针对一个特征,使用合适的方法,对数据的分布、尺度等进行变换,以满足建模时对数据的需求。特征变换可以分为数据的无量纲化处理和数据特征变换等。

3.1.1 数据的无量纲化处理

数据的无量纲化处理常用方法有数据标准化、数据缩放、数据归一化等方式。

下面使用鸢尾花数据集的4个数值特征为例,介绍如何使用Python对其进行数据的无量纲化处理,并将数据处理前后的结果可视化之后进行对比分析,导入数据的程序如下:

数据变量x标准化的公式为x=img,即每个数值减去变量的均值后除以标准差。可以通过sklearn库中preprocessing模块的scale()和StandardScaler()函数来完成,其中会通过with_mean和with_std两个参数来控制是否减去均值和是否除以标准差。下面的程序中,将数据变换后,会使用箱线图将获得的结果进行可视化分析,程序如下:

运行上面的程序后结果如图3-2所示,图中的4幅子图像分别为原始数据、原始数据减去均值、原始数据减去均值后除以标准差和原始数据减去均值后除以标准差。对比分析图3-2可以发现,只减去均值的数据分布和原始数据一致,只是取值范围发生了变化;减去均值后除以标准差的数据和原始数据相比,不仅在取值范围上发生了变化,每个数据的分布也发生了变化。因此在实际应用中,可以根据情况选择相应的数据变换操作。

图3-2 数据标准化变换

常用的数据缩放方式为min-max标准化,可以将数据缩放到指定的空间,例如,0~1标准化时将数据缩放到0~1,计算公式为:x=。针对相关变换可以使用preprocessing模块下的MinMaxScale()来完成,并且可以使用feature_range参数指定缩放范围。下面的程序以鸢尾花数据的4个特征为例,分别将数据缩放到0~1和1~10,并可视化出数据的分布情况。

运行上面的程序后,结果如图3-3所示,可以发现,和原始数据相比,缩放后的数据分布趋势变化不明显,但是数据的取值范围发生了改变,4个特征的数据范围保持一致。

图3-3 数据min-max标准化

preprocessing模块还提供了MaxAbsScaler()函数,其通过最大绝对值缩放每个特征,针对该变换可以使用下面的程序来完成。

程序运行后的结果如图3-4所示,对比变换前后的图像可以发现,变换后数据的取值范围为0~1,但是4个特征的整体取值大小的分布和原始特征的空间分布变化较大。

图3-4 MaxAbsScaler变换

如果数据中可能存在异常值,对其进行标准化变换时,可以使用preprocessing模块的RobustScaler()方法,使用下面的程序可对鸢尾花的4个数据特征进行相应的数据变换。

运行上面的程序后,结果如图3-5所示,3幅图分别是原始数据箱线图、数据标准化箱线图、数据鲁棒标准化箱线图。其中数据鲁棒标准化箱线图和数据标准化箱线图的最大差异是:数据鲁棒标准化箱线图的每个特征的取值范围更小一些。

图3-5 数据变换后的数据分布

preprocessing模块的normalize()函数,可以利用正则化参数惩罚,对数据特征进行正则化归一化。下面的程序利用该方法,对鸢尾花数据的特征分别进行L1范数和L2范数约束的正则化归一化。

程序运行后的结果如图3-6所示,从图中可以发现,两种数据变换后整体的取值范围相似,但是在某些特征的取值范围上有较明显的差异,例如在第一幅图中,前两个箱线图的取值范围较小。

图3-6 正则化约束的特征变换

针对normalize()函数进行的数据变换,参数axis=1表示针对每个样本进行操作,下面的程序对数据的样本进行了相关范数的约束操作,并可视化出数据变换后的情况。

运行上面程序后,结果如图3-7所示。

图3-7 针对样本进行范数约束的数据变换

上面介绍的相关方法,整体上是对数据的取值范围进行缩放,但是对数据的分布情况影响并不大。如果想要改变原始数据的分布情况,可以使用3.1.2节介绍的相关方式。

3.1.2 数据特征变换

很多时候单个变量的分布情况,可能并不是人们所期望的那样,例如,很多时候人们希望数据的分布为正态分布,或者接近正态分布。因此,一些数据分布的变换技术也被引入,本节介绍几种改变数据分布的方式,并使用Python来完成相关操作。

对数变换是常用的一种变换方式,很多时候数据的分布是拖尾的偏态分布,例如商品的价格,有少量的高价商品会造成其分布是左偏的,此时使用对数变换是一个不错的选择。下面的程序就展示了针对泊松分布的数据,使用对数变换,将其转化为接近正态分布的示例。

运行上面的程序后结果如图3-8所示,可以发现数据经过对数变换后,其分布情况更加接近正态分布。

图3-8 数据的对数变换

Box-Cox变换是一种自动寻找最佳正态分布变换函数的方法,其数据的计算公式为:

其中在参数lambda取不同的值时,有不同的数据变换效果。该方法可以通过scipy.stats模块中的boxcox()函数完成。下面的程序计算在参数lambda取不同的数值时,获取对x的变换结果,并进行可视化。

运行上面的程序后结果如图3-9所示,图中分别展示了对原始数据取对数变换、取平方根变换、取平方变换和取倒数变换的可视化效果。

图3-9 Box-Cox变换

sklearn库中的preprocessing模块提供了几种将数据变换为指定数据分布的方法,例如QuantileTransformer是一种利用数据的分位数信息进行数据特征变换的方法,可以把数据变换为指定的分布。下面的程序是利用该方法,将数据x转化为标准正态分布的示例,并可视化出了数据变换前后的直方图,用于对比分析。

运行上面的程序后结果如图3-10所示,从变换后数据分布直方图中可以知道,原始的数据已经转化为了标准的正态分布,其数据分布的直方图类似一个钟形曲线。

图3-10 数据正态变换

在进行特征工程时,应该针对实际情况,合理的变换数据,获得有用的特征。