在不少学习算法中,目标函数往往假设其特征均值在 0 附近且方差齐次,若是其中有一个特征的方差远远大于其他特征的方差,那么这个特征将成为影响目标特征的主要因素。模型难以学习到其他特征对目标特征的影响。因此,数据的标准化是数据分析流程中的重要步骤。
Z-score 标准化
简介
Z-score标准化是最常用的标准化方法。该方法通过对数据集中的每个样本进行处理,使得处理后的数据具有固定的均值和标准差。
假设特征
f
f
f的取值集合为 {
f
1
,
f
2
,
…
,
f
n
f_1,f_2,…,f_n
f1,f2,…,fn} ,则特征取值
f
i
f_i
fi 经过 Z-score 标准化后的取值
f
i
′
f_i'
fi′ 为
f
i
′
=
f
i
−
μ
σ
f_i' = \frac{f_i-\mu}{\sigma}
fi′=σfi−μ
其中
μ
=
1
n
∑
i
=
1
n
f
i
\mu=\displaystyle \frac{1}{n}\displaystyle \sum^{n}_{i=1}f_i
μ=n1i=1∑nfi 为特征
f
f
f 的平均值,
σ
=
1
n
∑
i
=
1
n
(
f
i
−
μ
)
2
{\sigma} = \displaystyle\sqrt{\frac{1}{n} \sum^{n}_{i=1}(f_i - \mu)^2}
σ=n1i=1∑n(fi−μ)2 为特征
f
f
f 的标准差。
经过Z-score 标准化后,特征的均值落在 0 附近,样本离 0 的距离可解释为其值远离均值的标准差距离。
当数据存在离群值时,为了降低离群值的影响,可以将 Z-score 标准化方法中的标准差换成平均绝对偏差。此时特征
f
f
f 的平均绝对偏差为
s
=
1
n
∑
i
=
1
n
∣
f
i
−
μ
∣
s = \frac{1}{n}\displaystyle \sum^{n}_{i=1}|f_i - \mu|
s=n1i=1∑n∣fi−μ∣
新的 Z-score 标准化的公式为
f
i
′
=
f
i
−
μ
s
f'_i = \frac{f_i - \mu}{s}
fi′=sfi−μ
Z-score 标准化适用于特征的最大值或最小值未知和样本分布非常分散的情况。
代码实现
# z-score标准化
def get_z_score(data):
return (data - data.mean()) / data.std()
get_z_score(data)
Min-Max 标准化
简介
Min-Max 标准化通过对特征作线性变换,使得转换后特征的取值分布在 [0, 1] 区间内,假设特征
f
f
f的取值集合为 {
f
1
,
f
2
,
…
,
f
n
f_1,f_2,…,f_n
f1,f2,…,fn} ,则特征取值
f
i
f_i
fi 经过 Min-Max 标准化后的取值
f
i
′
f_i'
fi′ 为
f
i
′
=
f
i
−
f
m
i
n
f
m
a
x
−
f
m
i
n
f'_i=\frac{f_i-f_{min}}{f_{max}-f_{min}}
fi′=fmax−fminfi−fmin
其中
f
m
i
n
f_{min}
fmin 为特征
f
f
f 取值的最小值,
f
m
a
x
f_{max}
fmax 为特征
f
f
f 取值的最大值。
同样如果希望将特征
f
f
f 线性映射到任意区间 [a, b] 上,则 Min-Max 标准化方法为
f
i
′
=
b
−
a
f
m
a
x
−
f
m
i
n
(
f
i
−
f
m
i
n
)
+
a
f'_i={\frac{b-a}{f_{max}-f_{min}}}(f_i-f_{min}) +a
fi′=fmax−fminb−a(fi−fmin)+a
Min-Max 标准化适用于需要将特征取值简单地线性映射到某一区间内的情形,其不足之处在于当数据集中有新数据加入时,特征的最大值或最小值会发生变化,此时需要重新计算新的最大值和最小值,并重新进行标准化操作。由于需要计算最大值和最小值,所以当数据含有离群值时,标准化后的效果较差。
代码实现
# min-max标准化
def get_minmax(data, a=0, b=1):
return (data - data.min())*(b - a) / (data.max() - data.min()) + a
get_minmax(data)
小数定标标准化
简介
小数定标标准化(decimal scaling)方法通过移动特征取值的小数点位置来进行标准化,使得标准化后特征取值的绝对值总是小于1。小数点移动的位数取决于特征取值的最大绝对值大小。
假设数据中特征
f
f
f 的取值集合为 {
f
1
,
f
2
,
…
,
f
n
f_1,f_2,…,f_n
f1,f2,…,fn},特征
f
i
f_i
fi 经过小数定标标准化后的取值
f
i
′
f_i'
fi′ 为
f
i
′
=
f
i
1
0
j
f_i'=\frac{f_i}{10^j}
fi′=10jfi
其中
j
j
j 是满足max{
f
1
′
,
f
2
′
,
…
,
f
n
′
f_1',f_2',…,f_n'
f1′,f2′,…,fn′}
<
1
<1
<1的最小整数。例如,某特征的取值范围为
[
−
30735
,
21872
]
[-30735, 21872]
[−30735,21872].特征取值绝对值的最大值为30735,则
j
j
j 取值为5.
小数定标标准化方法适用于特征取值比较分散,尤其是特征取值分布在多个数量级的情况,且在确定小数点的移动位数后,易于还原标准化后的取值特征。
代码实现
# 小数定标标准化
def get_float(data):
return data/10**np.ceil(np.log10(data.abs().max()))
get_float(data)
逻辑斯蒂标准化
简介
逻辑斯蒂(Logistic)标准化利用逻辑斯蒂函数的特性,将特征取值映射到 [0, 1] 区间内,其函数定义形式为
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1
逻辑斯蒂函数将数据从实数域光滑映射到 [0, 1] 区间,可以使用该函数对特征进行标准化处理,假设数据中特征
f
f
f 的取值集合为 {
f
1
,
f
2
,
…
,
f
n
f_1,f_2,…,f_n
f1,f2,…,fn},特征
f
i
f_i
fi 经过逻辑斯蒂标准化后的取值
f
i
′
f_i'
fi′ 为
f
i
′
=
1
1
+
e
−
f
i
f_i'=\frac{1}{1+e^{-f_i}}
fi′=1+e−fi1
逻辑斯蒂标准化方法适用于特征取值分布相对比较集中地分布于 0 两侧的情况。否则,会造成原始特征的分布及取值间关系被改变。
代码实现
def get_log(series):
return [1 / (1 + math.exp((-1)*i)) for i in series]
get_log(series)
总结
每一种标准化处理方法都会因数据的不同而产生不同的效果,在分析处理中,应以实际的数据情况为参考依据。且标准化处理会改变原始特征的取值,因此在实际操作中需要保存所使用的标准化方法的参数,以便对后续的数据进行统一的标准化处理。