sklearn.preprocessing 包提供了几个常见的实用功能和变换器类型,用来将原始特征向量更改为更适合机器学习模型的形式。

一般来说,机器学习算法受益于数据集的标准化。如果数据集中存在一些离群值,那么稳定的缩放或转换更合适。不同缩放、转换以及归一在一个包含边缘离群值的数据集中的表现在 Compare the effect of different scalers on data with outliers 中有着重说明。

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

在实际情况中,我们经常忽略特征的分布形状,直接经过去均值来对某个特征进行中心化,再通过除以非常量特征(non-constant features)的标准差进行缩放。

例如,在机器学习算法的目标函数(例如SVM的RBF内核或线性模型的l1和l2正则化),许多学习算法中目标函数的基础都是假设所有的特征都是零均值并且具有同一阶数上的方差。如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器并不能像我们说期望的那样,从其他特征中学习。

函数 scale 为数组形状的数据集的标准化提供了一个快捷实现:

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.])Copy
预处理 模块还提供了一个实用类 StandardScaler ,它实现了转化器的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...]])Copy
缩放类对象可以在新的数据上实现和训练集相同缩放操作:

>>> X_test = [[-1., 1., 0.]]
>>> scaler.transform(X_test)
array([[-2.44..., 1.22..., -0.26...]])Copy
你也可以通过在构造函数 :class:StandardScaler 中传入参数 with_mean=False 或者with_std=False 来取消中心化或缩放操作。