sklearn学习之标准化

2018-10-08  本文已影响0人  Gavin黄炯鹏

标准化

数据集的标准化对scikit-learn中实现的大多数机器学习算法来说是常见的要求。如果个别特征或多或少看起来不是很像标准正态分布(具有零均值和单位方差),那么它们的表现力可能会较差。

公式:x - mean / std

函数 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.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

上面是官网给的例子,下面试下其他形状的输入:

a = np.array(range(10), dtype=np.float)
a
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
a_scaled = preprocessing.scale(a)
a_scaled
array([-1.5666989 , -1.21854359, -0.87038828, -0.52223297, -0.17407766,
        0.17407766,  0.52223297,  0.87038828,  1.21854359,  1.5666989 ])
a_scaled_opposite = a_scaled * np.std(a) + np.mean(a)
a_scaled_opposite
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

对官网的例子尝试类似的反操作:

X_scaled_opposite = X_scaled * np.std(X_train) + np.mean(X_train)
X_scaled_opposite
array([[ 0.44444444, -0.86081557,  1.86859988],
       [ 1.74970446,  0.44444444,  0.15961336],
       [-0.86081557,  1.74970446, -0.6948799 ]])

emmmm,剧本不是这样的,居然跟X_train不一样

X_scaled_opposite_0 = X_scaled[0] * np.std(X_train[0]) + np.mean(X_train[0])
X_scaled_opposite_0
array([ 0.66666667, -0.86085856,  2.33333333])

也不对

X_scaled_opposite_1 = X_scaled[:,1] * np.std(X_train[:,1]) + np.mean(X_train[:,1])
print(X_scaled_opposite_1)
X_scaled_opposite_0 = X_scaled[:,0] * np.std(X_train[:,0]) + np.mean(X_train[:,0])
print(X_scaled_opposite_0)
[-1.  0.  1.]
[1.00000000e+00 2.00000000e+00 1.11022302e-16]

这回对了,可是第0列出现了误差,先占个坑,日后研究

结论:scale函数默认对输入的每一列进行标准化,至于有没有api对每一行操作,还没找到

StandardScaler类

StandardScaler类实现了转化器的API来计算训练集上的平均值和标准偏差,以便以后能够在测试集上重新应用相同的变换。

scaler = preprocessing.StandardScaler().fit(X_train)
scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
scaler.mean_
array([1.        , 0.        , 0.33333333])
scaler.scale_
array([0.81649658, 0.81649658, 1.24721913])
scaler.transform(X_train)
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])

缩放类对象可以在新的数据上实现和训练集相同缩放操作:

X_test = [[-1., 1., 0.]]
scaler.transform(X_test)
array([[-2.44948974,  1.22474487, -0.26726124]])

将特征缩放至特定范围内

一种标准化是将特征缩放到给定的最小值和最大值之间,通常在零和一之间,或者也可以将每个特征的最大绝对值转换至单位大小。
可以分别使用 MinMaxScaler 和 MaxAbsScaler 实现。

官网例子:将数据缩放至[0,1]:

min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
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.        ]])

同StandardScaler类,同样是对每一列操作

可以对测试集做同样的转换:

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]])

使用MaxAbsScaler, 与MinMaxScaler不同的是,前者直接将每个特征的所有元素除以绝对值的最大值, 此处不再累述

上一篇下一篇

猜你喜欢

热点阅读