趋近智
虽然标准化将数据中心置于零点并根据标准差进行缩放,但归一化(通常称为最小-最大值缩放)采用不同的方法。它的主要目的是将数值特征重新缩放到一个特定、预设的范围内,最常见的是 [0, 1]。
当您需要将特征限制在一个一致的区间内时,这种技术尤其有用。这对于不强烈依赖数据分布假设的算法(与标准化不同,标准化适用于近似高斯分布),或者对于计算距离或使用梯度下降的算法通常有益,因为特征尺度差异大可能会导致问题。图像处理常使用归一化来缩放像素强度,像素强度自然落在 [0, 255] 等范围内,并将其缩放到 [0, 1]。
这种转换通过以下公式对每个特征 X 实现:
X归一化=Xmax−XminX−Xmin这里:
这个公式将原始特征范围 [Xmin,Xmax] 线性映射到新范围 [0, 1]。如果一个值等于最小值 (Xmin),它将被映射到 0。如果它等于最大值 (Xmax),它将被映射到 1。所有其他值按比例落在两者之间。
虽然 [0, 1] 是最常见的目标范围,但该公式可以推广以缩放到任意范围 [a,b]:
X归一化=a+Xmax−Xmin(X−Xmin)(b−a)然而,Scikit-learn 的实现默认使用 [0, 1] 范围,这足以应对大多数使用场景。
Scikit-learn 通过 sklearn.preprocessing 模块中的 MinMaxScaler 类提供便捷实现。像 Scikit-learn 中的其他转换器一样,它遵循 fit 和 transform 模式。
重要提示: 缩放器必须仅使用训练数据进行拟合。在此 fit 步骤中获得的最小值 (Xmin) 和最大值 (Xmax) 随后用于 transform 训练数据和任何后续数据(如验证集或测试集)。这避免了测试集信息渗入预处理步骤,从而确保对模型性能的准确评估。
以下是一个基本例子:
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
# 示例数据
data = {'Feature1': np.random.rand(100) * 100,
'Feature2': np.random.rand(100) * 50 - 25} # 包含负值
df = pd.DataFrame(data)
# 添加一个异常值以说明敏感性
df.loc[100] = {'Feature1': 1000, 'Feature2': 200}
# 分割数据(在拟合缩放器之前必不可少)
X_train, X_test = train_test_split(df, test_size=0.2, random_state=42)
# 初始化缩放器
scaler = MinMaxScaler(feature_range=(0, 1)) # 默认范围
# 仅在训练数据上拟合缩放器
scaler.fit(X_train)
# 转换训练和测试数据
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 结果是 NumPy 数组。如果需要,可转换回 DataFrame。
X_train_scaled_df = pd.DataFrame(X_train_scaled, columns=X_train.columns, index=X_train.index)
X_test_scaled_df = pd.DataFrame(X_test_scaled, columns=X_test.columns, index=X_test.index)
print("原始训练数据示例:\n", X_train.head())
# print("\n学习到的最小值:", scaler.data_min_) # 从训练数据学习到的最小值
# print("学习到的最大值:", scaler.data_max_) # 从训练数据学习到的最大值
print("\n缩放后的训练数据示例:\n", X_train_scaled_df.head())
print("\n缩放后的测试数据示例:\n", X_test_scaled_df.head())
# 验证缩放后训练数据的范围(应接近 0 和 1)
print("\n缩放后训练数据最小值:\n", X_train_scaled_df.min())
print("\n缩放后训练数据最大值:\n", X_train_scaled_df.max())
# 注意:如果测试数据包含训练期间观测范围之外的值,
# 缩放后的值可能会超出 [0, 1] 范围。这是预期行为。
print("\n缩放后测试数据最小值:\n", X_test_scaled_df.min())
print("\n缩放后测试数据最大值:\n", X_test_scaled_df.max())
注意 scaler.fit() 只调用一次,使用 X_train。 X_train 和 X_test 随后都使用 scaler.transform() 进行缩放。
最小-最大值缩放将数据压缩到 [0, 1] 范围,但保留了分布的整体形状。然而,异常值会很大程度影响其他数据点的缩放。
分布形状得以保留,但范围被压缩到 [0, 1]。请注意,单个大的异常值 (1000) 的存在如何将大部分数据点在缩放后的版本中挤压到 [0, 1] 范围的很小一部分。
优点:
缺点:
在以下情况下选择最小-最大值缩放:
如果您的数据包含明显的异常值,或者您的算法得益于零均值和单位方差的数据(如 PCA、SVM、逻辑回归、线性回归),那么标准化或缩放(将在下文讨论)通常是更好的选择。
总之,最小-最大值缩放是将特征带到共同尺度的一种直接方法,但它对异常值的敏感性需要仔细考虑。始终记住在训练数据上拟合缩放器,并一致地转换训练集和测试集。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造