数据预处理
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函数提供了一个快速而简单的方式: ```pythonfrom 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:
>>> X_scaled.mean(axis=0)array([0., 0., 0.])>>> X_scaled.std(axis=0)array([1., 1., 1.])
- preprocessing模块提供了另一个工具类:
StandardScaler,它实现了Transformer API,来计算在一个训练集上的平均值和标准差(standard deviation),同样需要在测试集上使用相同的转换。该类也可以应用在sklearn.pipeline.Pipeline上。
>>> scaler = preprocessing.StandardScaler().fit(X_train)>>> scalerStandardScaler()>>> 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...]])
通过在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]之间.
>>> 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_minmaxarray([[0.5 , 0. , 1. ],[1. , 0.5 , 0.33333333],[0. , 1. , 0. ]])
MaxAbsScaler以相类似的方式运作,它的归一化会介于[-1, 1]之间,主要处理稀疏矩阵,通过在每个feature上分隔最大值来实现。这意味着数据已经是以0为中心的,或者是稀疏数据
>>> 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_maxabsarray([[ 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_maxabsarray([[-1.5, -1. , 2. ]])>>> max_abs_scaler.scale_array([2., 1., 2.])
与一样scale,该模块还提供了便捷功能: minmax_scale以及maxabs_scale,如果您不想创建对象的话。
归一化稀疏sparse矩阵
如果对sparse数据进行中心化,会摧毁数据的稀疏性,十分敏感。我们可以对sparse数据进行特殊的归一化,尤其各种feature以不同的归一化方式进行。
MaxAbsScaler 并且maxabs_scale是专门为缩放稀疏数据而设计的,强烈推荐这种方式
最后,如果该中心化后的数据如预期般足够小,可以通过sparse matricses的toarray方法转成一个数组。
