当涉及到数据标准化时,常见的方法包括StandardScaler
、MinMaxScaler
和RobustScaler
。下面是它们的对比以及示例代码:
归一化
MinMaxScaler
和标准化StandardScaler
的区别:
- 归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。
- 标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。
光看公式不是很直观,来看一下图片:
mean 归一化
标准化
可以看到 mean 归一化和标准化都将数据分布中心移到原点,
归一化没有改变数据分布的形状,而标准化使样本数据的分布近似为某种分布(通常为正态分布)。
它们的相同点在于:
- 都能取消由于量纲不同引起的误差
- 都是一种线性变换
- 都是对向量X按照比例压缩再进行平移
归一化优势:
- 提高迭代求解的收敛速度
- 提高迭代求解的精度
标准化优势:
- 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上
- 不改变原始数据的分布
-
StandardScaler
(标准化)from sklearn.preprocessing import StandardScaler # 创建StandardScaler对象 scaler = StandardScaler() # 训练集标准化 train_scaled = scaler.fit_transform(train_data) # 验证集标准化 valid_scaled = scaler.transform(valid_data)
- 将数据转换为均值为0、标准差为1的分布,标准化做的是,让每一个特征都服从标准正态分布,消除了每个特征分布不同从而导致结果不同的这个因素。
- 优势:
- 适用于对数据分布没有特定要求的情况。
- 可以保留数据的原始分布形状。
- 不受异常值的影响。
- 适用情况:
- 当数据的分布近似正态分布,或者对算法对数据分布不敏感时,可以选择使用
StandardScaler
。
- 当数据的分布近似正态分布,或者对算法对数据分布不敏感时,可以选择使用
-
MinMaxScaler
(归一化)from sklearn.preprocessing import MinMaxScaler # 创建MinMaxScaler对象 scaler = MinMaxScaler() # 训练集标准化 train_scaled = scaler.fit_transform(train_data) # 验证集标准化 valid_scaled = scaler.transform(valid_data)
- 将数据缩放到指定的范围,通常是[0, 1] 归一化做的是,消除了不同特征之间的数值相差很大从而导致结果不同的因素(比如某一个特征的数都是很大的一些数,另一个特征的数都是很小的数,那么如果不归一化的话,可能那个特征大的那些,稍微发生改变,就会导致结果有很大的不同,所以为了消除数相差很大的影响,对数据进行归一化,让它们都变成0-1之间的数),但是这时候,数据会失去原始的一些信息,但这防止了归一化前直接对原始数据进行梯度下降类似的优化算法时最终解被数值大的特征所主导。归一化之后,各个特征对目标函数的影响权重是一致的。这样的好处是在提高迭代求解的精度。
- 优势:
- 适用于需要将数据映射到特定范围的情况。
- 保持原始数据的相对关系。
- 适用于大部分机器学习算法和模型。
- 适用情况:
- 当需要将数据映射到指定范围内,并且保持数据的相对关系时,可以选择使用
MinMaxScaler
。
- 当需要将数据映射到指定范围内,并且保持数据的相对关系时,可以选择使用
-
RobustScaler
(鲁棒标准化)from sklearn.preprocessing import RobustScaler # 创建RobustScaler对象 scaler = RobustScaler() # 训练集标准化 train_scaled = scaler.fit_transform(train_data) # 验证集标准化 valid_scaled = scaler.transform(valid_data)
- 通过减去中位数并除以四分位距离,将数据缩放到一个较宽的范围。
- 优势:
- 适用于数据中存在异常值或离群点的情况。
- 不受异常值的影响,可以有效地处理异常值。
- 保留数据的相对关系。
- 适用情况:
- 当数据中存在离群点或异常值时,可以选择使用
RobustScaler
进行标准化。
- 当数据中存在离群点或异常值时,可以选择使用
总结
选择合适的标准化方法取决于数据的特点和需求。如果数据分布接近正态分布且无异常值,可以使用StandardScaler
。如果需要将数据映射到特定范围内并保持相对关系,可以使用MinMaxScaler
。如果数据中存在异常值或离群点,可以使用RobustScaler
进行鲁棒标准化。
在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,StandardScaler表现更好(避免不同量纲对方差、协方差计算的影响);在不涉及距离度量、协方差、数据不符合正态分布、异常值较少的时候,可使用MinMaxScaler。(eg:图像处理中,将RGB图像转换为灰度图像后将其值限定在 [0, 255] 的范围);在带有的离群值较多的数据时,推荐使用RobustScaler。
如果不进行特征标准化
如果不进行特征标准化,特征的数值范围可能会对模型的训练和特征权重的解释产生不利影响,从而使得特征筛选变得困难。
以下是一些原因:
1. 数值范围不同:不同特征的数值范围可能存在很大差异。例如,某个特征的取值范围在0-1之间,而另一个特征的取值范围在1000-10000之间。这种情况下,模型可能会偏向于更大数值范围的特征,而忽略了数值范围较小的特征。标准化可以将特征的数值范围统一到相似的尺度,使得模型能够更公平地对待不同特征。
2. 梯度下降的速度不同:在训练过程中,模型的更新依赖于梯度下降算法。如果特征具有不同的数值范围,那么梯度的变化也会不同。这可能导致梯度下降在参数空间中的某些方向上移动得更快,而在其他方向上移动得更慢。这会导致训练过程不稳定,收敛速度变慢,甚至可能无法收敛。通过标准化特征,可以使得梯度下降在各个方向上更加平衡和稳定。
3. 特征权重的可解释性:在模型训练完成后,特征的权重可以用来衡量其对样本标签的贡献度。如果特征具有不同的数值范围,并且没有进行标准化,那么特征权重的大小将受到数值范围的影响。较大数值范围的特征可能会被赋予较大的权重,而较小数值范围的特征可能会被忽略。这样的权重解释可能会误导我们对特征重要性的理解。通过标准化特征,可以使得特征权重更具可比性和可解释性。
综上所述,特征标准化可以消除特征之间的数值范围差异,保证模型对不同特征的公平对待,提高模型的稳定性和解释性。这样,我们可以更准确地评估特征的重要性,并进行有效的特征筛选。
标准化的注意事项
最大的注意事项就是先拆分出test集,只在训练集上标准化,即均值和标准差是从训练集中计算出来的,不要在整个数据集上做标准化,因为那样会将test集的信息引入到训练集中,造成了数据信息泄露,这是一个非常容易犯的错误。
参考:
重温归一化(MinMaxScaler)和标准化(StandardScaler)_standardscaler()_翻滚的小@强的博客-CSDN博客