【机器学习笔记Ⅰ】9 特征缩放
特征缩放(Feature Scaling)详解
特征缩放是机器学习数据预处理的关键步骤,旨在将不同特征的数值范围统一到相近的尺度,从而加速模型训练、提升性能并避免某些特征主导模型。
1. 为什么需要特征缩放?
(1) 问题背景
- 量纲不一致:例如:
- 特征1:年龄(范围 0-100)
- 特征2:收入(范围 0-1,000,000)
- 梯度下降的困境:
- 量纲大的特征(如收入)会导致梯度更新方向偏离最优路径,收敛缓慢。
- 量纲小的特征(如年龄)的权重更新可能被忽略。
(2) 影响
- 模型收敛慢:梯度下降需要更多迭代。
- 某些算法失效:
- 距离类算法(如KNN、SVM)受特征尺度直接影响。
- 正则化模型(如岭回归)对未缩放的系数惩罚不均。
2. 常用特征缩放方法
(1) 标准化(Standardization)
- 公式:
[
x’ = \frac{x - \mu}{\sigma}
]- ( \mu ):特征均值,( \sigma ):标准差。
- 结果:数据均值为0,方差为1(服从标准正态分布)。
- 适用场景:大多数算法(如线性回归、神经网络)。
Python实现:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
(2) 归一化(Normalization)
- 公式(Min-Max缩放):
[
x’ = \frac{x - \min(x)}{\max(x) - \min(x)}
] - 结果:数据被压缩到 [0, 1] 区间。
- 适用场景:图像像素值、神经网络输入层。
Python实现:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
(3) 鲁棒缩放(Robust Scaling)
- 公式:
[
x’ = \frac{x - \text{median}(x)}{\text{IQR}(x)}
]- IQR(四分位距)= Q3 - Q1。
- 特点:抗异常值干扰。
- 适用场景:数据含离群点时。
3. 不同算法的需求
算法类型 | 是否需要特征缩放 | 原因 |
---|---|---|
梯度下降类 | 必须(如线性回归、神经网络) | 加速收敛,避免震荡。 |
距离类(KNN、SVM) | 必须 | 距离计算依赖特征尺度。 |
树模型(决策树、随机森林) | 不需要 | 基于特征排序,不受尺度影响。 |
正则化模型(Lasso/Ridge) | 必须 | 公平惩罚各特征系数。 |
4. 代码示例对比
未缩放的梯度下降问题
import numpy as np# 未缩放的数据(年龄 vs 收入)
X = np.array([[30, 50000], [40, 60000], [25, 30000]])
y = np.array([1, 2, 0])# 梯度下降(收敛慢)
def gradient_descent(X, y, lr=0.000001, epochs=100):w = np.zeros(X.shape[1])for _ in range(epochs):y_pred = X.dot(w)grad = X.T.dot(y_pred - y) / len(y)w -= lr * gradreturn ww = gradient_descent(X, y) # 需要极小的学习率和大量迭代
缩放后的优化效果
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_scaled = scaler.fit_transform(X)w_scaled = gradient_descent(X_scaled, y, lr=0.1) # 学习率更大,收敛更快
5. 注意事项
- 划分数据后缩放:先拆分训练集/测试集,仅用训练集统计量(均值、方差)缩放测试集,避免数据泄漏。
scaler.fit(X_train) # 仅用训练集计算参数 X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 测试集用相同的scaler
- 分类特征:独热编码后的二元特征通常无需缩放。
- 树模型例外:决策树类模型不依赖特征尺度,但缩放有时能提升计算效率。
6. 总结
- 核心目标:消除特征间的量纲差异,使模型公平对待每个特征。
- 方法选择:
- 默认用标准化(StandardScaler)。
- 数据有界时用归一化(MinMaxScaler)。
- 含离群点时用鲁棒缩放(RobustScaler)。
- 关键口诀:
“梯度下降必缩放,距离模型量纲关;
树模型前可忽略,防漏数据记心间。”