机器学习中的标准化与归一化:概念、区别及应用
机器学习中的标准化与归一化:概念、区别及应用
标准化和归一化是机器学习中常见的数据预处理步骤,它们在提升模型精度和收敛速度方面发挥着重要作用。本文将详细解释标准化和归一化的概念、区别以及各自的优缺点,并通过具体的数学公式和代码示例进行说明。
1. 概念辨析
数据组织形式
数据通常以表格形式组织,其中一行代表一条样本,一列代表一个特征。无论是归一化还是标准化,都是针对特征(即列方向)进行的处理。
编号 | 身高/cm | 体重/kg | 脚尺码 |
---|---|---|---|
0 | 175 | 66 | 43 |
1 | 182 | 75 | 45 |
2 | 160 | 58 | 38 |
归一化
归一化的目的是将特征的值缩放到0到1之间,其计算公式为:
$$
X_n = \frac{X - X_{min}}{X_{max} - X_{min}}
$$
标准化
标准化的目的是将特征的值缩放成均值为0,方差为1,其计算公式为:
$$
z = \frac{x - \mu}{\sigma}
$$
2. 好处
提升模型精度
在许多机器学习算法中,目标函数假设所有特征都是零均值并且具有同一阶数上的方差。如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器不能有效地从其他特征中学习。
例如,在上述数据中,身高的数值比脚尺码大得多,如果不进行预处理,身高这个特征将对模型产生更大的影响。通过标准化或归一化,可以缩小不同特征之间的差异,使模型能够更公平地考虑所有特征。
提升收敛速度
标准化和归一化还可以加快模型的收敛速度。下图展示了在进行归一化处理前后的收敛速度对比:
如上图所示,归一化以后,收敛速度更快。
3. 标准化与归一化的对比
归一化应用场景有限
归一化在某些情况下可能会导致问题。例如,对于特征值为[2, 3, 1000]的情况:
- 归一化后,值被缩放到[0, 0.001, 1],前两个特征间的距离变得非常近,难以区分。
- 标准化后,值变为[-0.708, -0.706, 1.414],特征间的区分度保持得更好。
通过代码实现可以进一步验证这一点:
import numpy as np
a = [2, 3, 1000]
mean = np.mean(a)
std = np.std(a)
res = (a - mean) / std
print('变换前,均值:', mean)
print('变换前,标准差:', std)
print('---------------------')
print('变换后的值:', res)
print('变换后,均值:', np.mean(res))
print('变换后,方差:', np.var(res))
标准化更符合统计学假设
对于数值特征来说,最初的数据很大可能服从正态分布(中心极限定理)。标准化基于这个隐含的假设。只不过将正态分布调整为均值为0,方差为1的标准正态分布。
关于分布
标准化(归一化)不会改变数据的分布类型,只是将数据的范围进行变换。例如,如果原始数据服从均匀分布,归一化后,值被缩放到0-1之间,但分布类型保持不变。
通过代码可以验证这一点:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
import os
import PySide2
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
# 均匀分布
x = np.random.uniform(5, 500, 1000)
mean = np.mean(x)
std = np.std(x)
standardization = (x - mean) / std
print('原始数据,均值:', mean, '标准差:', std)
print('---------------------')
mean2 = np.sum(standardization)
var = np.var(standardization)
# 归一化
norm = (x - np.min(x)) / (np.max(x) - np.min(x))
print('归一化,均值:', np.mean(norm), '方差:', np.std(norm))
print('---------------------')
print('标准化,均值:', mean2, '方差:', var)
# 画图
pyplot.rcParams['font.sans-serif'] = ['SimHei']
pyplot.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10, 5))
plt.subplot()
plt.subplot(131)
plt.title('源数据')
plt.hist(x)
plt.subplot(132)
plt.title('归一化')
plt.hist(norm)
plt.subplot(133)
plt.title('标准化')
plt.hist(standardization)
plt.show()
4. 小结
- 归一化将值缩放到0-1之间
- 标准化改变数据的均值和方差为0和1
- 归一化、标准化都不改变数据的分布
- 如果数据中,最大值和最小值差距较大,使用归一化会导致较小的值被缩放到很小,较小值之间不容易区分,同时,对结果的起作用较小。
本文原文来自CSDN