特征预处理之标准化
1 课程概览
本课讲解特征预处理中的标准化方法。详细讲解标准化的公式、与归一化的对比、正态分布概念、方差与标准差的计算,以及StandardScaler API的使用。强调标准化适用于大数据集,是实际开发中更常用的预处理方法。
2 核心概念与定义
- 标准化(Standardization):对原始数据进行变换,转化为均值为0、标准差为1的标准正态分布数据。
- StandardScaler:标准化的API类,位于sklearn.preprocessing模块。
- 均值(Mean,μ):该列所有值的平均值。
- 方差(Variance,σ²):该列每个值与均值差值的平方和的平均值。
- 标准差(Standard Deviation,σ):方差的平方根。
- 正态分布(Normal Distribution):也叫高斯分布或钟形分布,自然界很多数据符合此分布。
- 鲁棒性(Robustness):程序面对异常值时的稳定性。
3 算法与模型详解
3.1 标准化公式
$$X' = \frac{X - \mu}{\sigma}$$
参数说明:
- $X$:当前值
- $\mu$:该列的均值(平均值)
- $\sigma$:该列的标准差
3.2 方差与标准差计算
方差公式: $$\sigma^2 = \frac{1}{N}\sum_{i=1}^{N}(X_i - \mu)^2$$
标准差公式: $$\sigma = \sqrt{\sigma^2} = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(X_i - \mu)^2}$$
计算步骤:
- 计算该列均值μ
- 计算每个值与均值的差值
- 对差值求平方
- 求平方和的平均值(即方差)
- 对方差开平方根(即标准差)
3.3 归一化与标准化对比
| 对比维度 | 归一化(MinMaxScaler) | 标准化(StandardScaler) |
|---|---|---|
| 公式 | (X-min)/(max-min) | (X-μ)/σ |
| 参考值 | 最大值、最小值 | 均值、标准差 |
| 映射区间 | [mi, mx](默认0~1) | 均值0,标准差1的正态分布 |
| 异常值影响 | 易受影响(鲁棒性差) | 数据量大时影响小(鲁棒性好) |
| 适用场景 | 小数据集 | 大数据集 |
| 使用频率 | 较少 | 常用 |
3.4 正态分布
定义:一种概率分布,也叫高斯分布或钟形分布。
特点:
- μ(均值)决定分布的位置
- σ(标准差)决定分布的幅度(宽窄)
- 标准正态分布:μ=0,σ=1
三西格玛法则:
| 区间 | 占比 |
|---|---|
| μ±σ | 68.2% |
| μ±2σ | 95.4% |
| μ±3σ | 99.7% |
3.5 标准化API
from sklearn.preprocessing import StandardScaler
| 方法 | 用途 |
|---|---|
| fit_transform | 训练+转换(训练集) |
| transform | 仅转换(测试集) |
| mean_ | 查看均值(属性,带下划线) |
| std_ | 查看标准差(属性,带下划线) |
带下划线的属性(如mean_、std_)表示程序自带的属性,用于与用户自定义变量区分。
4 数学原理与推导
4.1 标准化公式
$$X' = \frac{X - \mu}{\sigma}$$
4.2 方差公式
$$\sigma^2 = \frac{1}{N}\sum_{i=1}^{N}(X_i - \mu)^2$$
计算步骤:
- 计算均值:$\mu = \frac{1}{N}\sum_{i=1}^{N}X_i$
- 计算每个值与均值的差:$X_i - \mu$
- 对差值求平方:$(X_i - \mu)^2$
- 求平方和的平均值(方差):$\sigma^2 = \frac{1}{N}\sum_{i=1}^{N}(X_i - \mu)^2$
4.3 标准差公式
$$\sigma = \sqrt{\sigma^2} = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(X_i - \mu)^2}$$
4.4 计算示例
数据:90, 60, 75
均值:μ = (90+60+75)/3 = 75
方差: $$\sigma^2 = \frac{(90-75)^2 + (60-75)^2 + (75-75)^2}{3} = \frac{225 + 225 + 0}{3} = 150$$
标准差: $$\sigma = \sqrt{150} \approx 12.25$$
标准化结果:
| 当前值X | X' = (X-75)/12.25 | 结果 |
|---|---|---|
| 90 | (90-75)/12.25 | 1.22 |
| 60 | (60-75)/12.25 | -1.22 |
| 75 | (75-75)/12.25 | 0 |
标准化后数据有正有负,符合正态分布。
5 代码示例
# 1. 导包
from sklearn.preprocessing import StandardScaler
# 2. 准备数据集(标准化之前的原数据)
x_train = [[90, 2, 10, 40],
[60, 4, 15, 45],
[75, 3, 13, 46]]
# 3. 创建标准化对象
scaler = StandardScaler()
# 4. 对原数据进行标准化操作
x_train_new = scaler.fit_transform(x_train)
# 5. 打印处理后的数据
print("标准化后的数据集为\n", x_train_new)
# 6. 打印均值和标准差
print("数据集的均值为", scaler.mean_)
print("数据集的标准差为", scaler.std_)
输出:
标准化后的数据集为
[[ 1.22 -1.22 -1.22 -1.22]
[-1.22 1.22 1.22 0. ]
[ 0. 0. 0. 1.22]]
数据集的均值为 [75. 3. 12.67 43.67]
数据集的标准差为 [12.25 0.82 2.05 2.49]
6 重难点与易错提醒
- ❗重点:标准化公式:X' = (X-μ)/σ,映射到均值为0、标准差为1的正态分布。
- ❗重点:标准化适用于大数据集,是实际开发中更常用的方法。
- ❗重点:方差=该列每个值与均值差值的平方和的平均值;标准差=方差的平方根。
- ⚠️易错:标准化参考的是均值和标准差,不是最大值和最小值。
- ⚠️易错:带下划线的属性(mean_、std_)是程序自带属性,用于与用户变量区分。
- 💡深入理解:数据量越大,异常值对均值影响越小,因此标准化鲁棒性更好。
7 课堂问答精选
Q: 归一化和标准化的共同目的是什么?
A: 都是为了解决量纲(单位)问题,防止因特征列方差相差较大而影响模型最终结果。通过公式将各列特征值映射到同一区间,使各列权重保持一致。
Q: 标准化在什么情况下可以忽略异常值的影响?
A: 在样本数据量大的情况下。因为标准化参考的是均值和标准差,当数据量达到一定量级时,少量异常点对均值的影响会越来越小。
Q: 标准化后的数据有什么特点?
A: 标准化后的数据符合均值为0、标准差为1的标准正态分布,数据有正有负。
8 本课小结
- 标准化公式:X' = (X-μ)/σ,映射到均值为0、标准差为1的正态分布。
- 方差=每个值与均值差值的平方和的平均值;标准差=方差的平方根。
- 标准化API:StandardScaler,位于sklearn.preprocessing。
- 标准化适用于大数据集,鲁棒性好,是实际开发中更常用的方法。
- 归一化与标准化目的相同:解决量纲问题,使各列权重一致。
9 延伸思考与实践
- 实践:对比归一化和标准化处理同一数据集的结果差异。
- 思考:为什么标准化比归一化更适用于大数据集?
- 预习:KNN算法鸢尾花分类案例。