数据预处理
sklearn.preprocessing 包提供了一些通用的工具或者transformer类把原始的特征向量转换成更适合于模型进行训练的形式。
通常来说,一些机器学习算法需要对数据进行标准化。如果数据集中出现了一些奇异点,你最好使用更加健壮的scalers或者transformers。这些不同的scalers, transformers, and normalizers在包含奇异点的数据集上的效果,在这里有所展示。
标准化、均值去除和方差缩放
对数据集做标准化(Standardization)操作是很多sklearn库实现的机器学习算法的常见的要求。如果这些特征看起来不太像正态分布(具有零均值和单位方差的高斯分布)的数据的话,这些算法可能效果不佳。
实际上,我们经常忽视数据的分布情况,直接数据转换到向量空间的中央,通过对每个特征减去它的均值实现,然后呢,把特征通过标准差进行缩放。
举个例子,在一些机器学习算法中,比如说支持向量机的RBF核或者线性模型的L1和L2正则化,都是假设所有的特征都是以0为中心分布的,并且取值区间范围应当是相同的。如果一个特征的取值区间比别的特征大,它可能在目标函数中占主导地位,使得学习器(estimator)不能像期望的那样从别的特征中进行学习。
最方便快捷地实现这个操作的方法是调用 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
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
scale 操作后的函数都是零均值、单位方差的:
>>> X_scaled.mean(axis=0)
array([ 0., 0., 0.])
>>> X_scaled.std(axis=0)
array([ 1., 1., 1.])
preprocessing 模块实现了一个工具类叫做 StandardScaler,它可以计算出训练集中特征的均值和方差并且在这之后,在测试集上进行同样的转换。
>>> scaler = preprocessing.StandardScaler().fit(X_train)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
>>> scaler.mean_
array([ 1. ..., 0. ..., 0.33...])
>>> scaler.scale_
array([ 0.81..., 0.81..., 1.24...])
>>> scaler.transform(X_train)
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
在这之后能,我们可以在测试集上做同样的操作:
>>> X_test = [[-1., 1., 0.]]
>>> scaler.transform(X_test)
array([[-2.44..., 1.22..., -0.26...]])
把特征缩放到某个范围
标准化的一个可选的操作是把特征缩放到给定最大值和最小值的区间范围,通常是取01区间或者是为了把每个特征的最大绝对值按比例缩放为单位大小。可以通过使用 MinMaxScaler 或 MaxAbsScaler 实现。
这么做的目的是为了给那些标准差非常小的特征增加健壮性,另外也可以使得矩阵中产生更多的零,从而使矩阵更加稀疏,占用更少的存储空间。
下面是一个把矩阵转换到01范围的例子:
>>> X_train = np.array([[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
在这之后可以把对训练集同样的操作应用在测试集