数据归一化
1. 什么是数据归一化
数据归一化(Normalization 或 Scaling)是一种数据预处理技术,旨在调整数据的尺度,使得不同特征之间具有可比性,或者满足特定算法的输入要求。这一过程对于数据分析、机器学习模型的训练尤为重要,因为它可以带来以下好处:
消除量纲影响:通过归一化,可以消除不同特征因量纲不同(如米、秒、千克)导致的不可比性,使得特征之间的比较有意义。
提高模型收敛速度:在梯度下降等迭代优化算法中,归一化可以减少参数更新时的摆动幅度,加速模型收敛。
减少奇异样本的影响:异常值(outliers)可能导致模型学习偏向,归一化可以减小它们的影响力。
权重初始化和平衡特征:在神经网络等模型中,合理的归一化有助于权重的初始化,确保各层激活值的范围适宜,避免梯度消失或爆炸问题。
2. 数据归一化的方法
常见的数据归一化方法包括:
最小-最大归一化(Min-Max Scaling): 又称
0-1标准化
,公式为 。它将数据线性映射到[0, 1]区间内。这种方法简单直观,但易受极端值(最大值和最小值)影响。最小-最大归一化保留了原始数据值之间的关系。如果归一化的未来输入案例超出A的原始数据范围,它将遇到“越界”错误。
Z-Score 标准化(Standardization): 也称为
标准化
,通过减去均值并除以标准差进行,公式为 ,其中 是平均值, 是标准差。处理后数据具有平均值0,标准差1,符合标准正态分布,适合于需要保持数据的原始分布形态的场景。小数定标标准化(Decimal Scaling): 通过移动小数点的方式进行,根据特征的最大绝对值确定小数点移动位数,简化而快速,但不如前两者常用。
3. 举例说明
最小-最大归一化(Min-Max Scaling)示例
假设我们有一组学生考试成绩数据:[60, 75, 88, 92, 100]
- 计算最大值 : 100
- 计算最小值 : 60
- 进行归一化:
- 第一个分数 的归一化值为
- 第二个分数 的归一化值为
- 第三个分数 的归一化值为
- 第四个分数 的归一化值为
- 第五个分数 的归一化值为
归一化后,成绩数据变为:,位于[0, 1]区间内。
Z-Score标准化示例
继续使用上面的成绩数据:[60, 75, 88, 92, 100]
- 计算平均值 :
- 计算标准差 : 具体计算略,假设得到 (实际计算需精确)
- 进行Z-Score标准化:
- 第一个分数 的标准化值为 ≈ -1.08
- 类似地,计算其余分数的标准化值。
小数定标标准化示例
对于同一组成绩数据:[60, 75, 88, 92, 100]
- 确定最大绝对值:100
- 确定小数点移动位数:因为最大值为100,移动2位小数点,使其成为1.00。
- 进行小数定标标准化:
- 所有分数都除以100,得到:
小数定标标准化不依赖于数据的分布,而是简单地通过移动小数点进行尺度调整,适用于快速预处理,但可能不会改变数据的分布形态。
4. 代码示例
- 最小-最大归一化
from sklearn.preprocessing import MinMaxScaler
data = [[60], [75], [88], [92], [100]]
# 初始化缩放器
scaler = MinMaxScaler()
# 训练并转换数据
normalized_data = scaler.fit_transform(data)
print(normalized_data)
- Z-Score标准化
from sklearn.preprocessing import StandardScaler
data = [[60], [75], [88], [92], [100]]
# 初始化标准化器
scaler = StandardScaler()
# 训练并转换数据
standardized_data = scaler.fit_transform(data)
print(standardized_data)
- 小数定标标准化
data = [60, 75, 88, 92, 100]
max_abs_value = max(abs(i) for i in data)
# 小数定标标准化
decimal_scaled_data = [x / (10 ** int(np.log10(max_abs_value))) for x in data]
print(decimal_scaled_data)