特征预处理之归一化
1 课程概览
本课讲解特征预处理中的归一化方法。详细讲解归一化的目的(解决量纲问题)、公式推导、计算示例、API使用及代码实现。同时分析归一化的弊端(易受最大值最小值影响),指出其适用于小数据集。
2 核心概念与定义
- 量纲:数据的单位,不同特征单位不同会导致方差相差较大,影响模型结果。
- 归一化(Normalization):通过对原始数据变换,把数据映射到指定区间(默认0~1)的方法。
- Min-Max Scaling:归一化的API类,位于sklearn.preprocessing模块。
- feature_range:归一化的缩放区间参数,默认为(0, 1)。
- fit_transform:训练+转换方法,适用于第一次处理(训练集)。
- transform:仅转换方法,适用于后续处理(测试集)。
3 算法与模型详解
3.1 特征预处理的目的
问题:不同特征的单位(量纲)不同,导致方差相差较大,影响模型最终结果。
示例:
| 特征 | 单位 | 数值范围 |
|---|---|---|
| 身高 | 米 | 1.6~1.8(绝对到不了3) |
| 体重 | 千克 | 50~250(可达250) |
体重数值远大于身高,导致体重特征权重过大,支配模型结果。
解决:通过归一化/标准化,将各列特征值映射到同一区间,使权重保持一致。
3.2 归一化公式
第一步(计算中间值X'): $$X' = \frac{X - \min}{\max - \min}$$
第二步(映射到指定区间X''): $$X'' = X' \times (mx - mi) + mi$$
参数说明:
- $X$:当前值
- $\min$:该列最小值
- $\max$:该列最大值
- $mi$:目标区间最小值(默认0)
- $mx$:目标区间最大值(默认1)
- $X'$:中间计算值
- $X''$:最终结果
3.3 归一化计算示例
原数据:90, 60, 75(该列最小值60,最大值90)
| 当前值X | X' = (X-60)/(90-60) | X'' = X'×(1-0)+0 | 结果 |
|---|---|---|---|
| 90 | (90-60)/30 = 1 | 1×1+0 = 1 | 1 |
| 60 | (60-60)/30 = 0 | 0×1+0 = 0 | 0 |
| 75 | (75-60)/30 = 0.5 | 0.5×1+0 = 0.5 | 0.5 |
映射到3~5区间:
| 当前值X | X' | X'' = X'×(5-3)+3 | 结果 |
|---|---|---|---|
| 90 | 1 | 1×2+3 = 5 | 5 |
| 60 | 0 | 0×2+3 = 3 | 3 |
| 75 | 0.5 | 0.5×2+3 = 4 | 4 |
3.4 归一化的弊端
- 易受最大值和最小值影响:公式只考虑该列的最大值和最小值,忽略其他数据。
- 鲁棒性差:若最大值或最小值是异常值,所有计算结果都会受影响。
- 适用场景:小数据集。数据量小时,异常值影响大;数据量大时,应使用标准化。
3.5 归一化API
from sklearn.preprocessing import MinMaxScaler
| 方法 | 用途 | 适用场景 |
|---|---|---|
| fit_transform | 训练+转换 | 第一次处理(训练集) |
| transform | 仅转换 | 后续处理(测试集) |
第一次用fit_transform(训练参数+转换),之后用transform(仅转换)。
4 数学原理与推导
4.1 归一化公式推导
目标:将数据映射到[mi, mx]区间
步骤1:将原始数据线性映射到[0,1] $$X' = \frac{X - \min}{\max - \min}$$
步骤2:将[0,1]映射到[mi, mx] $$X'' = X' \times (mx - mi) + mi$$
验证:
- 当X = max时,X' = 1,X'' = mx(映射到区间最大值)
- 当X = min时,X' = 0,X'' = mi(映射到区间最小值)
5 代码示例
# 1. 导包
from sklearn.preprocessing import MinMaxScaler
# 2. 准备数据集(归一化之前的原数据)
x_train = [[90, 2, 10, 40],
[60, 4, 15, 45],
[75, 3, 13, 46]]
# 3. 创建归一化对象
# feature_range默认(0, 1),可省略
scaler = MinMaxScaler(feature_range=(0, 1))
# 4. 对原数据进行归一化操作
x_train_new = scaler.fit_transform(x_train)
# 5. 打印处理后的数据
print("归一化后的数据集为\n", x_train_new)
输出:
归一化后的数据集为
[[1. 0. 0. 0. ]
[0. 1. 1. 0.5 ]
[0.5 0.5 0.6 1. ]]
自定义区间(3~5):
scaler = MinMaxScaler(feature_range=(3, 5))
6 重难点与易错提醒
- ❗重点:归一化公式:X' = (X-min)/(max-min),X'' = X'×(mx-mi)+mi。
- ❗重点:归一化易受最大值和最小值影响,适用于小数据集。
- ❗重点:fit_transform用于训练集(第一次),transform用于测试集(后续)。
- ⚠️易错:归一化的区间值差不宜过大(如3~5可以,3~500无意义)。
- ⚠️易错:归一化只考虑最大值和最小值,忽略其他数据,鲁棒性差。
- 💡深入理解:数据量越大,异常值对均值影响越小,因此大数据集应使用标准化。
7 课堂问答精选
Q: 归一化和标准化哪个用得更多?
A: 标准化用得更多。归一化几乎只在今天用一次,以后主要用标准化。因为归一化易受最大值和最小值影响,鲁棒性差,只适用于小数据集。
Q: fit_transform和transform有什么区别?
A: fit_transform是训练+转换,适用于第一次处理(训练集),会计算并保存参数。transform是仅转换,适用于后续处理(测试集),使用已保存的参数进行转换。
8 本课小结
- 归一化目的:解决量纲问题,将各列特征映射到同一区间(默认0~1)。
- 归一化公式:X' = (X-min)/(max-min),X'' = X'×(mx-mi)+mi。
- 归一化API:MinMaxScaler,位于sklearn.preprocessing。
- 归一化弊端:易受最大值最小值影响,适用于小数据集。
- fit_transform用于训练集,transform用于测试集。
9 延伸思考与实践
- 实践:修改feature_range参数,观察输出结果变化。
- 思考:为什么归一化只适用于小数据集?
- 预习:特征预处理之标准化。