数据预处理
2018-07-11 本文已影响0人
BlueFishMan
标准化,或平均去除和方差缩放
- 数据集的标准化是scikit-learn中实现的许多机器学习估计器的通用要求。
- 如果单个特征看起来不像标准正态分布数据那么它们可能会表现得很差:高斯分布的零均值和单位方差。
- 函数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...]])
缩放数据具有零均值和单位差异:
>>> X_scaled.mean(axis=0)
array([ 0., 0., 0.])
>>> X_scaled.std(axis=0)
array([ 1., 1., 1.])
- 预处理模块还提供了一个实用程序类StandardScaler,它实现了Transformer API来计算训练集上的平均值和标准差,以便稍后能够在测试集上重新应用相同的转换。 因此该类适用于sklearn.pipeline.Pipeline的早期步骤:
>>> 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...]])
可以通过将with_mean = False或with_std = False传递给StandardScaler的构造函数来禁用居中或缩放。
- 另一种标准化是缩放功能位于给定的最小值和最大值之间,通常在零和一之间,或者使每个功能的最大绝对值按比例缩放到单位大小。 这可以分别使用MinMaxScaler或MaxAbsScaler来实现。
- 以下是将玩具数据矩阵缩放到[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]])
可以反思缩放属性以查找有关在训练数据上学习的转换的确切性质:
>>> min_max_scaler.scale_
array([ 0.5 , 0.5 , 0.33...])
>>> min_max_scaler.min_
array([ 0. , 0.5 , 0.33...])
如果给MinMaxScaler一个明确的feature_range =(min,max),完整的公式为:
X_{std} = \frac{X - X.min}{ X.max - X.min}
X_{scaled} = X_{std} * (max - min) + min
- MaxAbsScaler以非常相似的方式工作,但通过划分每个要素中的最大最大值来训练数据在[-1,1]范围内的比例。 这意味着数据已经集中在零或稀疏数据。
>>> 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 # doctest +NORMALIZE_WHITESPACE^
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.])