特征缩放是机器学习数据预处理中的关键步骤,用于将不同特征的数值范围调整到相似的尺度,以提高模型性能和训练效率。

为什么要进行特征缩放?
主要目的:
- 加速收敛:梯度下降等优化算法在特征尺度相近时收敛更快
- 避免数值问题:防止大范围特征主导模型,造成数值不稳定
- 公平对待特征:让所有特征对模型的贡献度处于相同量级
- 提高精度:某些算法(如KNN、SVM)对特征尺度敏感
常用特征缩放方法
标准化(Z-Score标准化)
- 公式:$x' = \frac{x - \mu}{\sigma}$
- 将数据转换为均值为0,标准差为1的分布
- 适用于特征近似正态分布的情况
- 对异常值敏感
最小-最大缩放(归一化)
- 公式:$x' = \frac{x - min(x)}{max(x) - min(x)}$
- 将数据缩放到[0, 1]区间
- 简单直观,适用于有界数据
- 对异常值非常敏感
最大绝对值缩放
- 公式:$x' = \frac{x}{max(|x|)}$
- 将数据缩放到[-1, 1]区间
- 保持数据的稀疏性(零值保持为零)
- 适用于已有零中心的数据
鲁棒缩放
- 公式:$x' = \frac{x - Q_1}{Q_3 - Q_1}$(基于四分位距)
- 使用中位数和四分位数进行缩放
- 对异常值不敏感
- 适用于包含异常值的数据
对数变换
- 公式:$x' = log(1 + x)$
- 适用于右偏(正偏)分布的数据
- 可以将指数分布转换为近似正态分布
如何选择缩放方法?
考虑因素:
-
数据分布
- 正态分布 → 标准化
- 均匀分布 → 最小-最大缩放
- 包含异常值 → 鲁棒缩放
-
算法需求
- 基于距离的算法(KNN、K-Means、SVM)→ 必须缩放
- 基于树的算法(决策树、随机森林)→ 不需要缩放
- 神经网络 → 强烈建议缩放
- 线性模型(线性回归、逻辑回归)→ 建议缩放(尤其使用正则化时)
-
数据特性
- 稀疏数据 → 最大绝对值缩放
- 图像数据 → 通常使用最小-最大缩放到[0,1]或[-1,1]
实践注意事项
避免数据泄漏
- 正确做法:只在训练集上计算缩放参数,然后应用到验证集和测试集
- 错误做法:在整个数据集上计算缩放参数
# 正确示例 from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 划分数据 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 只在训练集上拟合缩放器 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) # 用训练集的参数转换测试集 X_test_scaled = scaler.transform(X_test)
处理异常值
- 先处理异常值,再进行特征缩放
- 或使用对异常值不敏感的缩放方法(如鲁棒缩放)
分类型特征
- 特征缩放只适用于数值型特征
- 分类特征需要先进行编码(如独热编码)
示例对比
| 特征 | 原始值 | 标准化后 | 最小-最大缩放后 |
|---|---|---|---|
| 年龄 | 25 | -0.95 | 25 |
| 年龄 | 40 | 47 | 67 |
| 年龄 | 60 | 89 | 00 |
| 工资(万) | 15 | -1.18 | 00 |
| 工资(万) | 30 | -0.12 | 50 |
| 工资(万) | 45 | 31 | 00 |
注:经过缩放后,年龄和工资处于相似尺度,模型可以公平对待这两个特征。
特征缩放是数据预处理中的重要步骤,能够显著影响模型性能,选择哪种方法取决于数据特性、算法需求和应用场景,在实践中,建议尝试不同的缩放方法,并通过交叉验证评估哪种方法对特定任务最有效。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。