【sklearn第三讲】数据预处理

机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295)

sklearn.preprocessing包提供了几个常用的函数和转换类,用它们将一个原始的特征向量转化为一个更适于数据分析的表示形式。一般来说,学习算法收益于数据集的标准形式。如果数据中存在异常点,稳健的数据规范或转换是更适合的。

数据标准化

对于大多数机器学习算法来说,数据集的标准化是基本要求。这是因为,如果特征并不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。实际上,我们经常忽略数据的分布形状,而仅仅做零均值、单位标准差的处理。例如,在一个机器学习算法的目标函数里的很多元素(例如,SVM的RBF核)假设所有特征都近似零均值,方差具有相同的阶。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得估计量不能从其它特征有效地学习。

scale函数提供了一种快速简单的数据标准化操作。

from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X_train)
X_scaled

这里写图片描述

标准化后的数据具有0均值、1标准差。

这里写图片描述

preprocessing模块还提供了一个StandardScaler类,该类执行TransformerAPI,计算训练集的均值和标准差,可以重新应用到后面的检验集的同样的转换上。因此,在一个sklearn.pipeline.Pineline的较早步,很适合使用这个类。

这里写图片描述

然后,可以在新数据集上使用scaler实例,以在训练集上相同的方式转换新数据集。

这里写图片描述

也可以在StandardScaler的构造器里,通过设置with_mean=Falsewith_std=False阻止零均值化、单位标准差化。

设置特征的值范围

除了标准化的方法外,还可以设置特征的取值在一个特定的范围内,这个范围经常是[0, 1],可以通过MinMaxScaler函数实现。设置特征的值范围,是为了保持特征的小标准差的稳健性,也为了保持稀疏数据里的值为0的项。下面是一个数据矩阵的操作示例:

这里写图片描述

非线性变换

类似scalers, QuantileTransformer函数置每个特征于相同的分布范围。然而,通过做一个秩变换,使变换后的数据受异常值的影响较小。QuantileTransformer,quantile_transform函数将原始数据变换到[0, 1]区间的均匀分布。

这里写图片描述

也可以将变换后的数据映射到正态分布,通过设置output_distribution='normal':

这里写图片描述

归一化

归一化(Normalization)是将样本规范化成单位范数的过程。函数normalize提供了归一化的快速简单操作。这里的”范数”,可以使用L1或L2范数。

这里写图片描述

preprocessing模块进一步提供了一个工具类Normalizer, 该类使用Transformer API 执行相同的归一化操作。然后,归一化实例就可以使用在样本向量上了。

这里写图片描述

二值化

这里的二值化,指的是特征二值化,即,将数量特征按阈值转换为二值的过程。工具类Binarizer执行二值化操作,举个例子:

这里写图片描述

因为样本是相互独立的,所以fit方法不起作用。也可以调整二值化的阈值

这里写图片描述

编码类别特征

特征经常不是取连续的值,而是取类别。例如,一个人可以有特征[“male”, “female”], [“from Europe”, “from US”, “from Asia”], [“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]. 这些特征能用整数有效地编码,例如,[“male”, “from US”, “uses Internet Explorer”]能编码为[0, 1, 3], [“female”, “from Asia”, “uses Chrome”]编码为[1, 2, 1].

但是,这些整数表示不能直接用在scikit-learn的估计里,这是因为scikit-learn的估计要求连续的输入,因而将这些编码的整数作为数量值,显然是不对的。为了将类别特征转换为scikit-learn的估计量能够使用的特征,一种方法是使用one-of-Kone-hot编码,执行函数是OneHotEncoder, 它将具有m个可能值的类别特征转换为m个二值特征,只有一个是活跃的(即,取某个类别)。继续上面的例子,

这里写图片描述

缺省情况下,每个特征能够取多少个不同的值,从数据集自动推断,也可以通过赋予参数n_values值明确类别数量。在上面的数据示例里,有2个性别、3个州和4个网页浏览器类别,然后我们拟合估计量,变换一个数据点。结果是,前2个数字编码性别,接着的3个数字编码州,最后的4个数字编码浏览器类型。注意到,如果训练集可能有缺失的类别特征,则必须明确地设置n_values的值。例如,

这里写图片描述

填补缺失值

由于各种各样的原因,很多真实世界的数据集包括缺失值,这些缺失值通常编码为空白,NaN或其它占位符。然而,这样的数据集与scikit-learn不兼容, scikit-learn假设在一个数组里的所有值都是数值。在scikit-learn里使用不完整数据集的一个基本策略是,丢弃那些包括缺失值的行或列。然而,这样做可能损失了有价值的数据。一个更好的策略是填补这些缺失值,即,根据已知的数据推断它们的值。

Imputer类提供了填补缺失值的基本策略。可以使用缺失值所在的行或列的均值、中位数、频数最大的值。该类也考虑了不同缺失值的编码形式。下面的代码片段演示了怎样用包括缺失值的列均值填补缺失值,这些缺失值编码为NaN(Not a Number).

这里写图片描述

Imputer类也支持稀疏的矩阵。

这里写图片描述

注意,在这里缺失值编码为0,含蓄地存储在矩阵里。当数据的缺失值多于观测值时,适合用这种方式。

阅读更多精彩内容,请关注微信公众号:统计学习与大数据

猜你喜欢

转载自blog.csdn.net/wong2016/article/details/80624698