特征归一化:为什么需要对数值类型的特征做归一化?
对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值区间。
特征归一化的方法
最常用的方法主要有以下两种:
(1)线性函数归一化(Min-Max Scaling)
它对原始数据进行线性变换,使结果映射到
[
0
,
1
]
[0,1]
[0,1]的范围,实现对原始数据的等比缩放。归一化公式如下:
X
n
o
r
m
=
X
−
X
m
i
n
X
m
a
x
−
X
m
i
n
X_{norm}=\frac{X-X_{min}}{X_{max}-X_{min}}
Xnorm=Xmax−XminX−Xmin其中
X
X
X为原始数据,
X
m
a
x
、
X
m
i
n
X_{max}、X_{min}
Xmax、Xmin分别为数据最大值和最小值。
(2)零均值归一化(Z-Score Normalization)
它会将原始数据映射到均值为0,标准差为1的分布上。具体来说,假设原始特征的均值为
μ
\mu
μ,标准差为
σ
\sigma
σ,那么归一化公式为:
z
=
x
−
μ
σ
z=\frac{x-\mu}{\sigma}
z=σx−μ
为什么要对数值型特征做归一化?
那么,为什么需要对数值型特征做归一化呢?借助随机梯度下降
的实例来说明归一化的重要性。假设有两种数值型特征,
x
1
x_1
x1取值范围为
[
0
,
10
]
[0,10]
[0,10],
x
2
x_2
x2的取值范围为
[
0
,
3
]
[0,3]
[0,3],于是可以构造一个目标函数符合下图中(a)所示的等值图。
在学习速率相同的情况下,
x
1
x_1
x1的更新速度会大于
x
2
x_2
x2,需要较多的迭代才能找到最优解。如果将
x
1
x_1
x1和
x
2
x_2
x2归一化到相同的数值区间后,优化目标的等值图会变成上图(b)所示的圆形,
x
1
x_1
x1和
x
2
x_2
x2的更新速度会变得更为一致,容易更快地通过梯度下降找到最优解。
是否所有方法都需要对数值进行归一化?
当然,数据归一化并不是万能的。在实际应用中,通过梯度下降法求解的模型通常是需要归一化的,包括线性回归、逻辑回归、支持向量机、神经网络等模型。但对于决策树模型则并不适用,以C4.5为例,决策树在进行节点分裂时主要依据数据集D关于特征x的信息增益比,而信息增益比跟特征是否经过归一化时无关的,因此归一化并不会改变样本在特征x上的信息增益。
代码演示
(1)线性函数归一化
sklearn归一化API: sklearn.preprocessing.MinMaxScaler
- MinMaxScalar(feature_range=(0,1)…):每个特征缩放到给定范围(默认[0,1])
- MinMaxScalar.fit_transform(X) :将X应用到归一化器上,转换后返回形状相同的array
(2)标准化,即零均值归一化
sklearn特征化API:scikit-learn.preprocessing.StandardScaler
- StandardScaler(…)
- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1;
- StandardScaler.fit_transform(X,y)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
- StandardScaler.mean_
- 原始数据中每列特征的平均值
- StandardScaler.std_
- 原始数据每列特征的方差
- 原始数据每列特征的方差
参考资料
- 《百面机器学习》