数据预处理

1. 标准化

http://d0evi1.com/sklearn/preprocessing/
数据集的标准化,在scikit-learn中,对于众多机器学习评估器来说是必须的;如果各独立特征不进行标准化,结果标准正态分布数据差距很大:比如使用均值为0、方差为1的高斯分布.
实际上,我们经常忽略分布的形状,只是简单地通过移除每个feature的均值,将数据转换成中间值,接着通过分割非常数项的feature进行归一化。
例如,在机器学习的目标函数(objective function),比如SVM中的RBF或者线性模型中的L1和L2正则项,其中使用的元素,前提是所有的feature都是以0为中心,且方差的阶(order)都一致。如果一个feature的方差,比其它feature的阶(order)都大,那么它将在目标函数中占支配地位,从而使得estimator从其它feature上学习不到任何东西。

  • scale函数提供了一个快速而简单的方式: ```python

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

我们可以看到,归一化后的数据,均值为0,方差为1:

  1. >>> X_scaled.mean(axis=0)
  2. array([0., 0., 0.])
  3. >>> X_scaled.std(axis=0)
  4. array([1., 1., 1.])
  • preprocessing模块提供了另一个工具类:StandardScaler,它实现了Transformer API,来计算在一个训练集上的平均值和标准差(standard deviation),同样需要在测试集上使用相同的转换。该类也可以应用在sklearn.pipeline.Pipeline上。
  1. >>> scaler = preprocessing.StandardScaler().fit(X_train)
  2. >>> scaler
  3. StandardScaler()
  4. >>> scaler.mean_
  5. array([1. ..., 0. ..., 0.33...])
  6. >>> scaler.scale_
  7. array([0.81..., 0.81..., 1.24...])
  8. >>> scaler.transform(X_train)
  9. array([[ 0. ..., -1.22..., 1.33...],
  10. [ 1.22..., 0. ..., -0.26...],
  11. [-1.22..., 1.22..., -1.06...]])

scaler实例,可以用在新数据上,并可以以相同的方式在训练集上转换:

  1. >>> X_test = [[-1., 1., 0.]]
  2. >>> scaler.transform(X_test)
  3. array([[-2.44..., 1.22..., -0.26...]])

通过在StandardScaler的构造函数中设置with_mean=False 或者 with_std=False,可以禁止均值中心化(centering)和归一化(scaling)。
如果将with_mean和with_std设置为False ,则将均值μ设置为0 ,将std为1,假设列/特征来自正态高斯分布(均值为0和1 std)。
如果将with_mean和with_std设置为True ,则实际上将使用数据的真实μ和σ 。 这是最常见的方法

将feature归一化到一个范围内

  • [MinMaxScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html#sklearn.preprocessing.MinMaxScaler)将feature归一化到给定的最大、最小值范围内,比如:[0,1]之间.
  1. >>> X_train = np.array([[ 1., -1., 2.],
  2. ... [ 2., 0., 0.],
  3. ... [ 0., 1., -1.]])
  4. ...
  5. >>> min_max_scaler = preprocessing.MinMaxScaler()
  6. >>> X_train_minmax = min_max_scaler.fit_transform(X_train)
  7. >>> X_train_minmax
  8. array([[0.5 , 0. , 1. ],
  9. [1. , 0.5 , 0.33333333],
  10. [0. , 1. , 0. ]])

MaxAbsScaler以相类似的方式运作,它的归一化会介于[-1, 1]之间,主要处理稀疏矩阵,通过在每个feature上分隔最大值来实现。这意味着数据已经是以0为中心的,或者是稀疏数据

  1. >>> X_train = np.array([[ 1., -1., 2.],
  2. ... [ 2., 0., 0.],
  3. ... [ 0., 1., -1.]])
  4. ...
  5. >>> max_abs_scaler = preprocessing.MaxAbsScaler()
  6. >>> X_train_maxabs = max_abs_scaler.fit_transform(X_train)
  7. >>> X_train_maxabs
  8. array([[ 0.5, -1. , 1. ],
  9. [ 1. , 0. , 0. ],
  10. [ 0. , 1. , -0.5]])
  11. >>> X_test = np.array([[ -3., -1., 4.]])
  12. >>> X_test_maxabs = max_abs_scaler.transform(X_test)
  13. >>> X_test_maxabs
  14. array([[-1.5, -1. , 2. ]])
  15. >>> max_abs_scaler.scale_
  16. array([2., 1., 2.])

与一样scale,该模块还提供了便捷功能: minmax_scale以及maxabs_scale,如果您不想创建对象的话。

归一化稀疏sparse矩阵

如果对sparse数据进行中心化,会摧毁数据的稀疏性,十分敏感。我们可以对sparse数据进行特殊的归一化,尤其各种feature以不同的归一化方式进行。
MaxAbsScaler 并且maxabs_scale是专门为缩放稀疏数据而设计的,强烈推荐这种方式
最后,如果该中心化后的数据如预期般足够小,可以通过sparse matricses的toarray方法转成一个数组。