您的位置:首页 > 其它

详解特征归一化

2017-02-20 20:50 232 查看

介绍

机器学习中,提取某个样本特征的过程,叫
特征工程


同一个样本,可能具备不同类型的特征,各特征的数值大小范围不一致。所谓
特征归一化
,就是将不同类型的特征数值大小变为一致的过程。

举例:假设有4个样本及他们的特征如下

样本特征1特征2
1100012
2160204
3120086
4131318
可见归一化前,特征1和特征2的大小不是一个数量级。归一化后,特征变为

样本特征1特征2
100
210.33
30.730.67
40.811
特征归一化
有很多不同的叫法,比如:
特征缩放
Feature Normalization
Feature Scaling
,其实都是同一个意思。

特征归一化的意义

各特征之间的大小范围一致,才能使用距离度量等算法

加速梯度下降算法的收敛

在SVM算法中,一致化的特征能加速寻找支持向量的时间

不同的机器学习算法,能接受的输入数值范围不一样

两种常用特征归一化方法

下面详细介绍
sklearn
中最常用的特征归一化方法
MinMaxScaler
StandardScaler


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
1100012
2160204
3120086
4131318
X.max160208
X.min100012
归一化的过程如下,假设归一化后的矩阵为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
中,
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
1100012
2160204
3120086
4131318
列均值127905
列标准差2175.962.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

总结

本文详细介绍了
MinMaxScaler
StandardScaler
的计算过程。有这个过程可以看出:

当我们需要将特征值都归一化为某个范围[a,b]时,选
MinMaxScaler


当我们需要归一化后的特征值均值为0,标准差为1,选
StandardScaler


参考

特徵縮放,https://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%B5%E7%B8%AE%E6%94%BE

numpy与matlab标准差计算区别,http://stackoverflow.com/questions/27600207/why-does-numpy-std-give-a-different-result-to-matlab-std
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: