特征归一化有很多不同的叫法,比如:特征缩放,Feature Normalization,Feature Scaling
 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
特征归一化的意义
 - 各特征之间的大小范围一致,才能使用距离度量等算法
- 加速梯度下降算法的收敛
- 在SVM算法中,一致化的特征能加速寻找支持向量的时间
- 不同的机器学习算法,能接受的输入数值范围不一样
以下是两种常用的归一化方法:
- Min-Max标准化(Min-Max Normalization)线性归一化
称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 1]之间。转换函数如下:
x^*=\frac{x-min}{max-min}该方法实现对原始数据的等比例缩放,其中x^*为归一化后的数据,x为原始数据,max为样本数据的最大值,min为样本数据的最小值。
缺点:
- 当有新数据加入时,可能导致max和min的变化,需要重新定义。
- 数据不稳定,存在异常值和较多噪音
优点:
- 当我们需要将特征值都归一化为某个范围[a,b]时,选MinMaxScaler
- 0均值标准化(Z-score standardization)
这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。将原始数据集归一化为均值为0、方差1的数据集,转化函数为:
x^*=\frac{x-\mu}{\delta}其中μ、δ分别为原始数据集的均值和方法。该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕。
优点:
- 适用于数据的最大值和最小值未知,或存在孤立点
- 比较
以上为两种比较普通但是常用的归一化技术,那这两种归一化的应用场景是怎么样的呢?什么时候第一种方法比较好、什么时候第二种方法比较好呢?下面做一个简要的分析概括:
- 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score
 standardization)表现更好。
- 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0
 255]的范围。
下面用Python来实现上述
 举例:假设有4个样本及他们的特征如下
 样本 | 特征1 | 特征2
 ---|---|---
 1 | 10001 | 2
 2 | 16020 | 4
 3 | 12008 | 6
 4 | 13131 | 8
可见归一化前,特征1和特征2的大小不是一个数量级。归一化后,特征变为
| 样本 | 特征1 | 特征2 | 
|---|---|---|
| 1 | 0 | 0 | 
| 2 | 1 | 0.33 | 
| 3 | 0.73 | 0.67 | 
| 4 | 0.81 | 1 | 
min-max标准化(Min-Max Normalization)线性归一化
sklearn.preprocessing.MinMaxScaler
 在sklearn中,sklearn.preprocessing.MinMaxScaler是一种用于特征归一化的方法。使用示例如下
from sklearn.preprocessing import MinMaxScaler
x = [[10001,2],[16020,4],[12008,6],[13131,8]]
min_max_scaler = MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(x)#归一化后的结果
X_train_minmax
array([[ 0.        ,  0.        ],[ 1.        ,  0.33333333],[ 0.33344409,  0.66666667],[ 0.52001994,  1.        ]])它默认将每种特征的值都归一化到[0,1]之间,归一化后的数值大小范围是可调的(根据MinMaxScaler的参数feature_range调整)。下面代码能将特征归一化到[-1,1]之间。
min_max_scaler = MinMaxScaler(feature_range=(-1,1))
X_train_minmax = min_max_scaler.fit_transform(x)#归一化后的结果
X_train_minmax
array([[-1.        , -1.        ],[ 1.        , -0.33333333],[ 0.46574339,  0.33333333],[ 0.6152873 ,  1.        ]])MinMaxScaler的实现公式如下
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min这是向量化的表达方式,说明X是矩阵,其中
- X_std:将X归一化到[0,1]之间
- X.min(axis=0)表示列最小值
- max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
以下例说明计算过程(max=1,min=0)
 样本 | 特征1 | 特征2
 ---|---|---
 1 | 10001 | 2
 2 | 16020 | 4
 3 | 12008 | 6
 4 | 13131 | 8
 X.max | 16020 | 8
 X.min | 10001 | 2
归一化的过程如下,假设归一化后的矩阵为S
- S11=(10001-10001)/(16020-10001)=0
- S21=(16020-10001)/(16020-10001)=1
- S31=(12008-10001)/(16020-10001)=0.333444
- S41=(13131-10001)/(16020-10001)=0.52002
- S12=(2-2)/(8-2)=0
- S22=(4-2)/(8-2)=0.33
- S32=(6-2)/(8-2)=0.6667
- S42=(8-2)/(8-2)=1
可见,结果与章节“MinMaxScaler使用”中的计算结果一致。
StandardScaler标准化方法 零均值归一化
sklearn.preprocessing.StandardScaler
sklearn.preprocessing.robust_scale
 在sklearn中,sklearn.preprocessing.StandardScaler是一种用于特征归一化的方法。使用示例如下
from sklearn.preprocessing import StandardScaler
x = [[10001,2],[16020,4],[12008,6],[13131,8]]
X_scaler = StandardScaler()
X_train = X_scaler.fit_transform(x)
X_train
array([[-1.2817325 , -1.34164079],[ 1.48440157, -0.4472136 ],[-0.35938143,  0.4472136 ],[ 0.15671236,  1.34164079]])归一化后,矩阵每列的均值为0,标准差为1。注意,这里的标准差是指加了Delta Degrees of Freedom因子后的标准差,这与传统的标准差计算公式有区别。(在numpy中,有std()函数用于计算标准差)
StandardScaler的归一化方式是用每个特征减去列均值,再除以列标准差。
 以下例说明计算过程,注意标准差是用np.std()计算的。
| 样本 | 特征1 | 特征2 | 
|---|---|---|
| 1 | 10001 | 2 | 
| 2 | 16020 | 4 | 
| 3 | 12008 | 6 | 
| 4 | 13131 | 8 | 
| 列均值 | 12790 | 5 | 
| 列标准差 | 2175.96 | 2.236 | 
归一化的过程如下,假设归一化后的矩阵为S
- S11=(10001-12790)/2175.96=-1.28173
- S21=(16020-12790)/2175.96=1.484
- S31=(12008-12790)/2175.96=-0.35938
- S41=(13131-12790)/2175.96=0.1567
- S12=(2-5)/2.236=-1.342
- S22=(4-5)/2.236=-0.447
- S32=(6-5)/2.236=0.447
- S42=(8-5)/2.236=1.3416