很多时候,如果不对数据进行统一化,会导致梯度下降复杂或是损失函数只能选择线性,导致模型效果不佳。
从经验上说,对特征值进行统一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
一、标准化(Standardization),或者去除均值和方差进行缩放
公式:(X-X_mean)/X_std 计算时对每个属性/每列分别进行, Z-score 标准化。
将数据按其属性(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个属性/每列来说所有数据都聚集在0附近,方差值为1。
首先说明下sklearn中preprocessing库里面的scale函数使用方法,默认参数如下:
scale(X, axis=0, with_mean=True, with_std=True, copy=True)
- X:进行标准化的数据,为数组或矩阵
- axis:当 axis=0 时,所有样本数据的每个特征(每列)服从标准正太分布,均值为0,方差为1,默认为0;当axis=1 时,每个样本的所有特征(每行)服从标准正太分布,均值为0,方差为1
- with_mean:布尔类型,默认为True
- with_std:布尔类型,默认为True
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
[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
print(X_scaled.mean(axis=0)) ### 计算X_scaled特征(每列)的均值进行验证
print(X_scaled.std(axis=0)) ### 计算X_scaled特征(每列)的方差进行验证
[ 0. 0. 0.]
[ 1. 1. 1.]
(X_train-X_train.mean(axis=0))/X_train.std(axis=0) ###用原始公式将X_train标准化,结果如下:
[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler().fit(X_train)
scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
print(scaler.mean_)
[ 1. 0. 0.33333333]
print(scaler.scale_)
[ 0.81649658 0.81649658 1.24721913]
scaler.transform(X_train)