标准化
标准化(standardization)是将数据减去平均数再除以标准差,公式如图1第3个所示
标准差(standard deviation)又叫均方差,公式是
用数据看看效果是什么样的:
import numpy as np
from sklearn import preprocessing
data = np.arange(16).reshape(4,4)
#data:
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15]])
scaler = preprocessing.StandardScaler().fit(data)
print(scaler.mean_)
#array([6., 7., 8., 9.])
print(scaler.scale_)
#array([4.47213595, 4.47213595, 4.47213595, 4.47213595])
data_transformed = scaler.transform(data)
print(data_transformed)
#data_transformed
#array([[-1.34164079, -1.34164079, -1.34164079, -1.34164079],
# [-0.4472136 , -0.4472136 , -0.4472136 , -0.4472136 ],
# [ 0.4472136 , 0.4472136 , 0.4472136 , 0.4472136 ],
# [ 1.34164079, 1.34164079, 1.34164079, 1.34164079]])
从上面的结果来看,是把每一列(每个特征的数据)如第一列0, 4, 8, 12先平移到-6, -2, 2, 6的位置(以0点为中心),然后再以标准差的比例进行缩放(除以4.47)到-1.34, -0.45, 0.45, 1.34的位置。其他每一列都是同样的操作。
归一化
归一化(Normalization)是指将数据缩放到一定范围之类,如(0,1)之间或者(-1,1)之间。
对于不同量级的特征,需要对他们独立地进行归一化。
缩放到(0,1)之间可以用图1第1个rescaling公式, 要处理的数据减去所有数据的最小值,再除以最大值和最小值的差,相当于把最小值的点移到了0点,所以缩放的范围会落在(0,1)之间。
看看数据处理的结果:
data = np.array([[-5,3],[4,-2],[0,8]])
#array([[-5, 3],
# [ 4, -2],
# [ 0, 8]])
data_minmax = min_max_scaler.fit_transform(data)
print(data_minmax)
#array([[0. , 0.5 ],
# [1. , 0. ],
# [0.55555556, 1. ]]))
同样的数据转换也可以适用于未见的测试数据,将测试数据实现和训练数据一致的缩放和移位。
data_test = np.array([[3, -6]])
#data_test
#array([[ 3, -6]])
data_test_minmax = min_max_scaler.transform(data_test)
#data_test_minmax
#array([[ 0.88888889, -0.4 ]])
print(min_max_scaler.scale_)
#array([0.11111111, 0.1 ])
print(min_max_scaler.min_)
#array([0.55555556, 0.2 ])
通过除以这一列特征所有数据的绝对值的最大值缩放到(-1,1)之间,即。
data = np.array([[-5,3],[4,-2],[0,8]])
#data
#array([[-5, 3],
# [ 4, -2],
# [ 0, 8]])
max_abs_scaler = preprocessing.MaxAbsScaler()
data_maxabs = max_abs_scaler.fit_transform(data)
#data_maxabs
#array([[-1. , 0.375],
# [ 0.8 , -0.25 ],
# [ 0. , 1. ]])
print(max_abs_scaler.scale_)
#array([5., 8.])
data_test = np.array([[3, -10]])
data_test_maxabs = max_abs_scaler.transform(data_test)
print(data_test_maxabs)
#array([[ 0.6 , -1.25]])
归一化的原因见图2:
中心化
中心化(Zero-centered)是原始数据减去平均数。
如果数据较稳定,不存在极端的极大值或者极小值,用归一化
如果数据存在较多的噪音和异常值,用标准化,可以通过间接中心化避免极值和异常值的影响。