目录
一、介绍
方法名称 | 缩放范围 | 适用条件 |
---|---|---|
StandardScaler | 均值为0,方差为1 | 数据具有正态分布的情况下效果最佳 |
MinMaxScaler | [0, 1] | 数据分布不平衡或有明显的上下界限 |
RobustScaler | 根据四分位数缩放 | 数据包含异常值 |
MaxAbsScaler | [-1, 1] | 数据已经中心化,即没有偏移 |
Normalizer | 每个样本的范数为1 | 样本之间有显著的差异,需要将其归一化 |
QuantileTransformer | [0,1]或正态分布 | 数据分布不均匀 |
PowerTransformer (Yeo- Johnson) | 均值为0,方差为1 | 数据具有正态分布或接近正态分布 |
Log Transform | 非负数据的对数缩放 | 数据必须为正值或非负值 |
二、总结
- StandardScaler:适用于数据本身的分布近似正态分布,通过将数据缩放到均值为0、方差为1,消除不同特征的量纲影响。
- MinMaxScaler:将数据缩放到指定的最小值和最大值(默认是0和1)之间,适合数据分布有明显上下界的情况。
- RobustScaler:基于四分位数进行缩放,对于异常值不敏感,适用于数据包含离群点的情况。
- MaxAbsScaler:将数据缩放到最大绝对值为1,适用于已经中心化的数据,特别适合稀疏数据。
- Normalizer:对每个样本独立进行缩放,将其范数缩放为1,适用于需要将样本归一化的情况。
- QuantileTransformer:通过非线性变换将数据转换为均匀分布或正态分布,适用于数据分布不均匀的情况。
- PowerTransformer (Yeo-Johnson):对数据进行幂变换,使其更接近正态分布,适用于包含负值的数据。
- Log Transform:对数据进行对数变换,适用于数据呈指数型增长的情况,但要求数据必须为正值或非负值。
三、详情
1. StandardScaler
功能: 通过将数据的均值调整为0,标准差调整为1,使数据服从标准正态分布。
公式: 其中,
是均值,
是标准差。
适用场景: 大多数机器学习算法,特别是假设数据服从正态分布的算法,如线性回归、逻辑回归和支持向量机。
2. MinMaxScaler
功能: 将数据缩放到给定的最小值和最大值(通常是0和1)之间。
公式:
适用场景: 数据范围已知且确定要将数据缩放到特定范围内的场景,例如图像处理(像素值通常在0到255之间)。
3. RobustScaler
功能: 使用中位数和四分位距进行缩放,适用于包含异常值的数据。
公式: 其中,
表示四分位距(75th percentile - 25th percentile)。
适用场景: 数据中存在较多异常值。
4. MaxAbsScaler
功能: 按每个特征的最大绝对值进行缩放,使数据在 [-1, 1] 范围内。
公式:
适用场景: 数据已经被稀疏化且包含正负值。
5. Normalizer
功能: 将每个样本缩放为单位范数(通常是L2范数),使每个样本的向量长度为1。
公式:
适用场景: 当你希望将数据缩放为相同的尺度(单位向量)以用于聚类或其它机器学习算法。
6. QuantileTransformer
功能: 通过将数据转换为服从均匀分布或高斯分布,减小数据中的偏态和异常值的影响。
方法:使用分位数进行转换。
适用场景: 当数据具有很强的偏态或需要服从特定分布时。
7. PowerTransformer
功能: 使用幂变换(如Box-Cox或Yeo-Johnson)将数据变换为更接近正态分布的形式。
公式: Box-Cox变换: (需要所有值为正)
Yeo-Johnson变换: 适用于正负值数据。
适用场景: 当数据分布明显偏离正态分布且包含负值时。
8. Log Transform
功能: 通过对数据应用对数变换,减小数据的偏态。
公式:
适用场景: 数据具有指数增长或极度偏态分布。
四、示例
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler, MaxAbsScaler, Normalizer, QuantileTransformer, PowerTransformer
# 示例数据
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)
# Normalizer
normalizer = Normalizer()
data_normalized = normalizer.fit_transform(data)
print("Normalizer:", data_normalized)
# QuantileTransformer
quantile_transformer = QuantileTransformer(output_distribution='normal')
data_quantile_transformed = quantile_transformer.fit_transform(data)
print("QuantileTransformer:", data_quantile_transformed)
# PowerTransformer (Yeo-Johnson)
power_transformer_yeo_johnson = PowerTransformer(method='yeo-johnson')
data_power_yeo_johnson_transformed = power_transformer_yeo_johnson.fit_transform(data)
print("PowerTransformer (Yeo-Johnson):", data_power_yeo_johnson_transformed)
# Log Transform
data_log_transformed = np.log1p(data) # 使用log1p避免对零值进行log变换时出现负无穷大
print("Log Transform:", data_log_transformed)
五、心得
最常用的还是 StandardScaler 或者 MinMaxScaler,其他的几种标准化方法很少用到,不到特殊情况下不要轻易尝试。
当换了一种标准化方法时,切记模型中的激活函数可能也要跟随调整。