目录
1. 前提摘要
最近,本人在优化深度神经网络模型时发现为了减少预测标签值和真实标签值之间差距,不仅仅需提高模型本身的性能,还关乎于标签值标准化、数据集划分、模型超参数等一系列初始设定。其中后两项的实验内容俗称“炼丹”,很多研究人员已经炉火丹青,运筹帷幄,唯独标签值标准化容易被人忽略。一个优秀的标准化方法不仅能提高模型训练的稳定性,加速收敛,还能增强模型测试性能,可谓是中流砥柱。
现有模型训练大多默认选用 StandardScaler(),这本没错,但是如果能够参考标签值分布尝试其他方法,并修改为适合的激活函数,无论是回归还是分类任务均能小小的涨点。上篇文章已经粗略的介绍了大部分标准化方法,本次来详细谈谈常见的四种标准化方法。在您为涨点头疼时,尝试下每种标准化方法,或许会有奇效。
2. 标准化方法
2.1 StandardScaler
StandardScaler 是一种最常见的数据标准化方法,用于将特征按其均值和标准差进行缩放。它将数据调整为均值为0,标准差为1,使得每个特征的数据都服从标准正态分布。标准化有助于在训练过程中更稳定地优化模型参数,特别是对于依赖于特征大小的算法。
2.1.1 计算方法
StandardScaler 的主要步骤如下:
-
计算每个特征的均值: 对于给定数据集中的每个特征,计算其均值
。
-
计算每个特征的标准差: 计算每个特征的标准差
。
-
缩放数据: 将每个特征的值减去该特征的均值,再除以该特征的标准差,使得缩放后的数据均值为0,标准差为1。
2.1.2 计算公式
其中, 是原始数据,
是特征的均值,
是特征的标准差。
2.1.3 适用场景
StandardScaler 适用于以下场景:
数据符合正态分布: 当数据的大多数特征接近正态分布时,使用 StandardScaler 可以让每个特征有相同的量纲。
算法对特征缩放敏感: 许多机器学习算法(如支持向量机、K均值聚类和神经网络等)对输入特征的缩放敏感,因此使用 StandardScaler 可以提高模型的收敛速度和性能。
2.2 MinMaxScaler
MinMaxScaler 是一种数据归一化方法,用于将特征缩放到一个指定的范围内,通常是 [0, 1]。该方法将每个特征线性转换到给定的最小值和最大值之间,确保数据的最小值为0,最大值为1(或其他指定范围)。这是最常见的数据归一化方法之一。
2.2.1 计算方法
MinMaxScaler 的主要步骤如下:
-
计算每个特征的最小值和最大值: 对于给定数据集中的每个特征,计算其最小值
和最大值
。
-
缩放数据: 将每个特征的值按以下公式缩放到指定范围(通常是 [0, 1])。
2.2.2 计算公式
其中, 是原始数据,
是特征的最小值,
是特征的最大值。
2.2.3 适用场景
MinMaxScaler 适用于以下场景:
数据不符合正态分布: 当数据不服从正态分布且存在显著的偏态时,MinMaxScaler 可以有效地将数据缩放到同一范围内。
对范围有特定要求: 例如,在某些情况下需要将所有特征的值缩放到 [0, 1] 或 [0, n] 的范围,以满足算法或系统的要求。
保持特征的相对关系: MinMaxScaler 保持了原始数据的特征之间的比例和距离,仅改变了数据的范围。
2.3 RobustScaler
RobustScaler 是一种数据标准化方法,它利用数据的中位数和四分位数范围(IQR)进行缩放和中心化。与传统的 StandardScaler 使用均值和标准差不同,RobustScaler 对异常值(outliers)不敏感,因此在数据中存在离群点时更为稳健。
2.3.1 计算方法
RobustScaler 的主要步骤如下:
-
中心化(Centering): 将数据的每个特征的中位数(median)减去,使数据中心化到零。
-
缩放(Scaling): 使用四分位数范围(IQR,Interquartile Range)缩放数据。四分位数范围是指数据的第75百分位数(Q3)和第25百分位数(Q1)之间的差。
2.3.2 计算公式
其中, 表示原始数据,
表示数据的中位数,
表示四分位数范围。
2.3.3 适用场景
RobustScaler 非常适合于以下场景:
数据中存在显著的离群点(outliers),而这些离群点对标准化过程不应有过多影响。
数据不服从正态分布,且存在偏态分布的情况。
通过使用中位数和四分位数范围,而不是均值和标准差,RobustScaler 能更好地处理异常值,使得这些离群点不会对数据的缩放和中心化产生过大的影响。这使得模型在训练过程中能更好地适应数据的总体特征,而不受极端值的影响。
2.4 MaxAbsScaler
MaxAbsScaler 是一种数据标准化方法,用于将特征缩放到 [-1, 1] 的范围内。与其他标准化方法不同,MaxAbsScaler 不会改变数据的中心化位置(即数据的均值仍可能不是零),而是将数据的每个特征按其最大绝对值进行缩放。
2.4.1 计算方法
MaxAbsScaler 的主要步骤如下:
-
计算每个特征的最大绝对值: 对于给定数据集中的每个特征,计算其最大绝对值 M。
-
缩放数据: 将每个特征的值除以该特征的最大绝对值,使得缩放后的数据在 [-1, 1] 的范围内。
2.4.2 计算公式
其中, 是原始数据,
是每个特征的最大绝对值。
2.4.3 适用场景
MaxAbsScaler 非常适合于以下场景:
稀疏数据: MaxAbsScaler 不会破坏数据的稀疏性。由于其缩放操作是逐元素进行的,没有减去均值的步骤,所以对稀疏矩阵不会增加非零元素的数量。
数据已经是中心化的: 如果数据的均值本身已经是零或接近零,而仅需要控制其幅度范围。
由于 MaxAbsScaler 仅对特征值进行缩放而不改变数据的分布形状,它适用于数据的绝对值范围相对较小且不包含极端值的情况。如果数据包含极端的离群点,这些点可能会对缩放的结果产生较大影响。
3. 代码及拓展
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler, MaxAbsScaler
# 示例数据
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# StandardScaler
standard_scaler = StandardScaler()
data_standard_scaled = standard_scaler.fit_transform(data)
print("StandardScaler:", data_standard_scaled)
# MinMaxScaler
minmax_scaler = MinMaxScaler()
data_minmax_scaled = minmax_scaler.fit_transform(data)
print("MinMaxScaler:", data_minmax_scaled)
# RobustScaler
robust_scaler = RobustScaler()
data_robust_scaled = robust_scaler.fit_transform(data)
print("RobustScaler:", data_robust_scaled)
# MaxAbsScaler
max_abs_scaler = MaxAbsScaler()
data_max_abs_scaled = max_abs_scaler.fit_transform(data)
print("MaxAbsScaler:", data_max_abs_scaled)
更多内容请访问上篇文章: