python对数据进行预处理_Python 学习笔记之——用 sklearn 对数据进行预处理

1. 标准化

标准化是为了让数据服从一个零均值和单位方差的标准正态分布。也即针对一个均值为 \(mean\) 标准差为 \(std\) 的向量 \(X\) 中的每个值 \(x\),有 \(x_{scaled} = \frac{x - mean}{std}\)。

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

>>> X_scaled.mean(axis=0)

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

>>> X_scaled.std(axis=0)

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

默认针对每列来进行标准化,也即针对每个特征进行标准化。可以通过设置 axis=1 来对每行进行标准化,也即对每个样本进行标准化。sklearn.preprocessing.scale()

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

2. 将数据缩放到一定范围

有时候,我们需要数据处在给定的最大值和最小值范围之间,常常是 0 到 1 之间,这样数据的最大绝对值就被限制在了单位大小以内。

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

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

当 MinMaxScaler() 传入一个参数 feature_range=(min, max),我们可以将数据缩放到我们想要的范围内。sklearn.preprocessing.MinMaxScaler()

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

X_scaled = X_std * (max - min) + min

此外,我们还可以将数据限制在 [-1, 1] 之间,通过除以每个特征的最大绝对值。sklearn.preprocessing.MaxAbsScaler()

>>> X_train = np.array([[ 1., -1., 2.],

... [ 2., 0., 0.],

... [ 0., 1., -1.]])

...

>>> max_abs_scaler = preprocessing.MaxAbsScaler()

>>> X_train_maxabs = max_abs_scaler.fit_transform(X_train)

>>> X_train_maxabs

array([[ 0.5, -1. , 1. ],

[ 1. , 0. , 0. ],

[ 0. , 1. , -0.5]])

>>> X_test = np.array([[ -3., -1., 4.]])

>>> X_test_maxabs = max_abs_scaler.transform(X_test)

>>> X_test_maxabs

array([[-1.5, -1. , 2. ]])

>>> max_abs_scaler.scale_

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

3. 归一化

归一化的目的是让每个样本具有单位范数。也即针对向量 \(X\) 中的每个值 \(x\),有 \(x_{normalized} = \frac{x}{||X||}\)。

>>> X = [[ 1., -1., 2.],

... [ 2., 0., 0.],

... [ 0., 1., -1.]]

>>> X_normalized = preprocessing.normalize(X, norm='l2')

>>> X_normalized

array([[ 0.40..., -0.40..., 0.81...],

[ 1. ..., 0. ..., 0. ...],

[ 0. ..., 0.70..., -0.70...]])

>>> normalizer = preprocessing.Normalizer().fit(X) # fit does nothing

>>> normalizer

Normalizer(copy=True, norm='l2')

>>> normalizer.transform(X)

array([[ 0.40..., -0.40..., 0.81...],

[ 1. ..., 0. ..., 0. ...],

[ 0. ..., 0.70..., -0.70...]])

>>> normalizer.transform([[-1., 1., 0.]])

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

默认是对每行数据用 \(L2\) 范数进行归一化,我们也可以选择 \(L1\) 范数或者针对每列进行归一化。sklearn.preprocessing.Normalizer()

获取更多精彩,请关注「seniusen」!

你可能感兴趣的:(python对数据进行预处理)