用sklearn.preprocessing做数据预处理(一)——Standardization

Standardization标准化:将特征数据的分布调整成标准正态分布,亦叫高斯分布,也就是使得数据的均值为0,方差为1


标准化的原因在于如果有些特征的方差过大,则会主导目标函数,从而使参数估计器无法正确地学习其他特征
标准化的过程为两步:去均值的中心化(均值变为0);方差的规模化(方差变为1)。
在sklearn.preprocessing中提供了一个scale的方法,可以实现以上功能。

from sklearn import preprocessing
import numpy as np

x = np.array([[1.,-1.,2.],
             [2.,0.,0.],
             [0.,1.,-1.]])
#将每一列特征标准化为标准特征分布,注意,标准化是针对每一列而言的
x_scale = preprocessing.scale(x)
x_scale

array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

可以查看标准化后数据的均值和方差,已经变成0,1了
axis=0表示对每一列
x_scale.mean(axis=0)

array([0., 0., 0.])

axis=1表示对每一行去做这个操作

x_scale.mean(axis=1)

array([ 0.03718711,  0.31916121, -0.35634832])

x_scale.std(axis=0)

array([1., 1., 1.])

x_scale.std(axis=1)

array([1.04587533, 0.64957343, 1.11980724])

preprocessing这个模块还提供了一个实用类StandarScaler,它可以在训练数据集上做了标准转换操作之后,把相同的转换应用到测试数据集中。这是一个很好的功能,可以对训练数据、测试数据应用相同的转换,以后有新的数据进来可以直接调用,不用再重新把数据放在一起再计算一次了。调用fit方法,根据已有的训练数据创建一个标准化的转换器。另外StandardScaler中可以传入两个参数:with_mean,with_std这两个都是布尔型参数,默认True,也可以定义为False,即不要均值中心化,不要方差规模化为1。

scaler = preprocessing.StandardScaler().fit(x)
scaler

StandardScaler(copy=True, with_mean=True, with_std=True)

使用上面这个转换器去转换训练数据x,调用transform方法

scaler.transform(x)

array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

现在又来一个新的样本,也想得到相同的转换
new_x = [[-1.,1.,0.]]
scaler.transform(new_x)

array([[-2.44948974,  1.22474487, -0.26726124]])

MinMaxScaler
在MinMaxScaler中是给定了一个明确的最大值和最小值,它的计算公式如下:
X_std = (X -  X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_Scaled = X_std / (max - min) + min
下面这个例子是将数据归于[0,1]之间,每个特种中的最小值变成了0,最大值变成了1
min_max_scaler = preprocessing.MinMaxScaler()
x_minmax = min_max_scaler.fit_transform(x)
x_minmax

array([[0.5       , 0.        , 1.        ],
       [1.        , 0.5       , 0.33333333],
       [0.        , 1.        , 0.        ]])

同样的如果有新的测试数据进来,也想做同样的转换
x_test = np.array([[-3., -1., 4.]])
x_test_minmax = min_max_scaler.transform(x_test)
x_test_minmax

array([[-1.5       ,  0.        ,  1.66666667]])

下面这个例子是将数据归于[0,1.5]之间,每个特种中的最小值变成了0,最大值变成了1.5
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0,1.5))
x_minmax = min_max_scaler.fit_transform(x)
x_minmax

array([[0.75, 0.  , 1.5 ],
       [1.5 , 0.75, 0.5 ],
       [0.  , 1.5 , 0.  ]])

同样的如果有新的测试数据进来,也想做同样的转换
x_test1 = np.array([[-3., -2., 5.]])
x_test1_minmax = min_max_scaler.transform(x_test)
x_test1_minmax

array([[-2.25,  0.  ,  2.5 ]])

MaxAbsScaler原理与上面的很像,只是数据会被规模化到[-1,1]之间。也就是特征中,所有数据都会除以最大值。这个方法对那些已经中心化均值为0或者稀疏的数据有意义。
稀疏数据:在数据库中,稀疏数据是指在二维表中含有大量空值的数据;即稀疏数据是指,在数据集中绝大多数数值缺失或者为零的数据。稀疏数据绝对不是无用数据,只不过是信息不完全,通过适当的手段是可以挖掘出大量有用信息。

规模化稀疏数据
如果对稀疏数据进行去均值的中心化就会破坏稀疏的数据结构。虽然如此,我们也可以找到方法去对稀疏的输入数据进行转换,特别是那些特征之间的数据规模不一样的数据。MaxAbsScaler 和 maxabs_scale这两个方法是专门为稀疏数据的规模化所设计的。

规模化有异常值的数据
如果你的数据有许多异常值,那么使用数据的均值与方差去做标准化就不行了。在这里,你可以使用robust_scale 和 RobustScaler这两个方法。它会根据中位数或者四分位数去中心化数据。

猜你喜欢

转载自blog.csdn.net/weixin_44530236/article/details/88076923