Sklearn的 Preprocessing模块提供了常见的将原始特征向量转换为更适合下行估计器表示的函数和类. 一般而言,学习算法受益于数据集的标准化,如果数据集当中存在异常值,一些robust scaler和 transformer会更加适用. 在同一个数据集上不同的 scaler, transformer 和normalizer 的表现可以在以下网页上查看:
http://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py
标准化
数据集的标准化是许多机器学习建模的普遍要求,如果特征看起来一点都不像符合标准正态分布的话,训练得到的模型可能就会很糟心. 实际操作中我们经常会忽略数据分布的形状,仅仅对数据进行减去均值再除以标准差的集中化转换.
例如,学习算法的目标函数(比如支持向量机的RBF 内核或者线性模型中的 l1和 l2的正则项)用到的许多元素均假设所有特征都集中在0附近并具有相同量级的方差. 如果某个特征的方差数量级远大于其他特征,那么这个特征很可能主导目标函数并且使模型无法按照我们期待的那样去正确的学习其他特征,从而使其他特征失效.
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...]])
经过scale 处理的数据将具有0均值和单位方差:
>>> X_scaled.mean(axis=0)
array([ 0., 0., 0.])
>>> X_scaled.std(axis=0)
array([ 1., 1., 1.])
sklearn.preprocessing.scale可以沿着特定的坐标轴对数据集进行标准化,在均值附近集中化数据并缩放至单位方差.
参数包括:sklearn.preprocessing.scale(X, axis = 0, with_mean=True, with_std=True, copy=True)
X:需要进行集中化和缩放的数据,类似于数组,稀疏矩阵
axis:整数(默认是 0 )用来计算均值和标准差的轴. 当 axis=0 时,对各个特征进行标准化;当 axis=1 时,会对每个样本进行标准化
with_mean:boolean,布尔型,默认是 True,即在缩放之前对数据进行集中化
with_std:boolean,布尔型,默认是 True,即缩放数据至单位方差( 或单位标准差)
copy:boolean,布尔型,默认是 True,可选填. 设置为 False 的时候即在原数据行上进行标准化,并禁止复制( 如果输入是 numpy 数组或是 scipy.sparse CSC 矩阵并且 axis = 1)
Preprocessing 模块还提供实用程序类 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...]])
得到的 scaler 就可以用同样的方法去转换新的数据集了:
>>> X_test = [[-1., 1., 0.]]
>>> scaler.transform(X_test)
array([[-2.44..., 1.22..., -0.26...]])
通过传递 with_mean=False 或者 with_std=False 可以禁止 StandardScaler 构造函数进行居中或缩放.
参数包括:class.sklearn.preprocessing.StandardScaler(copy = True, with_mean = True, with_std = True )
copy:boolean,布尔型,可选填,默认为 True,设置为 False 时则会在原数据上进行缩放并且禁止副本. 然而这并不保证一直在原数据上操作,例外情况比如数据不是 numpy 的数组或者scipy.sparse CSR 矩阵,依然会返回一个副本
with_mean:boolean,布尔型,默认为 True,即在缩放前集中化数据
with_std:boolean,布尔型,默认为 True,即缩放数据至单位方差( 或单位标准差)
Attributes 包括:scale_ 每个特征的相对标度,mean_训练集中每个特征的均值,var_训练集中每个特征的方差