标准化(standardization)和归一化(normalization)
24 Feb 2019知乎原文:标准化(standardization)和归一化(normalization)
注意,我们下面讨论的归一化和标准化针对的都是特征(数据列),而非针对样本(数据行)进行。
归一化(Normalization)和标准化(Standardization)都是为了解决不同特征取值范围相差太大的问题。因为,如果部分特征的取值特别大而远超其他特征的值,那模型训练的结果就会被这少部分的特征所支配,从而错失了其他小值特征所含有用信息。
标准化
公式
z = (x - u) / s
对每个值x,减去其所在列的平均值u,再除以所在列的标准差s,得到的就是标准化后的值z。每列的标准化独立进行,标准化后的数据每列的均值为0,标准差为1。
工具
sklearn.preprocessing.StandardScaler
示例代码:
>>> from sklearn.preprocessing import StandardScaler
>>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]
>>> scaler = StandardScaler()
>>> scaler.fit(data)
>>> print(scaler.mean_)
[0.5 0.5]
>>> print(scaler.transform(data))
[[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
>>> print(scaler.transform([[2, 2]]))
[[3. 3.]]
归一化
公式
z = (x - min) / (max - min)
对每个值x,减去其所在列的最小值min,再除以所在列的极差(最大值与最小值之差),得到的就是归一化后的值z。每列的归一化独立进行,归一化后的数据每列的取值范围为[0, 1]。
工具
sklearn.preprocessing.MinMaxScaler
示例代码:
>>> from sklearn.preprocessing import MinMaxScaler
>>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
>>> scaler = MinMaxScaler()
>>> scaler.fit(data)
>>> print(scaler.data_max_)
[ 1. 18.]
>>> print(scaler.transform(data))
[[0. 0. ]
[0.25 0.25]
[0.5 0.5 ]
[1. 1. ]]
>>> print(scaler.transform([[2, 2]]))
[[1.5 0. ]]
总结
两种特征缩放的方法都有它们的缺点,如果数据里面含有异常值(Outlier),那归一化会使得绝大部分数据都集中在一个极小的范围值内;而使用标准化转换后的数值可能很大,不像归一化那样有限定的取值范围。