特征归一化使用最大值和最小值(将原始数据x缩放到[0,1]区间,当存在异常值会导致稳定性较差。以下是详细解释和示例:
原因分析
-
对极值敏感
min-max 归一化公式为:
x norm = x − min ( X ) max ( X ) − min ( X ) x_{\text{norm}} = \frac{x - \text{min}(X)}{\text{max}(X) - \text{min}(X)} xnorm=max(X)−min(X)x−min(X)
其中 max ( X ) \text{max}(X) max(X) 和 min ( X ) \text{min}(X) min(X) 是数据集的极值。如果数据中存在异常值(极大或极小),会导致极值严重偏离正常数据的分布范围,从而压缩大部分正常数据的归一化结果,使其分布范围变小。 -
稳定性差
异常值会导致 max ( X ) \text{max}(X) max(X) 和 min ( X ) \text{min}(X) min(X) 剧烈波动。例如,新增一个异常值会显著改变归一化范围,导致模型在不同批次数据上的表现不稳定。 -
适合小数据场景的原因
在小数据场景中,数据量少且通常经过人工清洗,异常值容易被发现和处理。而大数据场景中,数据自动采集可能包含更多噪声,极值的存在概率更高,此时 min-max 归一化的缺点会被放大。
示例说明
假设有一组学生的考试成绩(满分 100 分):
X
=
[
50
,
55
,
60
,
65
,
1000
]
X = [50, 55, 60, 65, \color{black}{1000}]
X=[50,55,60,65,1000]
其中 1000
是输入错误导致的异常值。
-
计算极值
min ( X ) = 50 \text{min}(X) = 50 min(X)=50, max ( X ) = 1000 \text{max}(X) = 1000 max(X)=1000。 -
归一化结果
x norm = x − 50 1000 − 50 = x − 50 950 x_{\text{norm}} = \frac{x - 50}{1000 - 50} = \frac{x - 50}{950} xnorm=1000−50x−50=950x−50- 正常数据归一化后:
( 50 → 0.0 ) (50 \to 0.0) (50→0.0), ( 55 → 0.005 ) (55 \to 0.005) (55→0.005), ( 60 → 0.010 ) (60 \to 0.010) (60→0.010), ( 65 → 0.016 ) (65 \to 0.016) (65→0.016) - 异常值归一化后:
( 1000 → 1.0 ) (1000 \to 1.0) (1000→1.0)
问题:正常数据被压缩到接近 0 的极小范围内,而异常值占据了 1.0 的位置,导致数据分布严重失真。
- 正常数据归一化后:
-
对模型的影响
如果使用此数据训练模型(如 KNN、神经网络等),模型会认为大部分正常数据之间的差异极小,而异常值被错误地赋予了极高的重要性,导致模型学习到错误的规律。
让我们通过一个更具体的例子,一步步解释为什么异常值会导致模型学习到错误的规律。
例子:学生考试成绩分类问题
假设我们有一组学生的 语文成绩(特征) 和对应的 是否优秀(标签:0=普通,1=优秀)。数据如下:
学生 | 语文成绩 | 是否优秀 |
---|---|---|
A | 50 | 0 |
B | 55 | 0 |
C | 60 | 0 |
D | 65 | 0 |
E | 1000 | 1 |
- 目标:训练一个模型,根据语文成绩预测学生是否优秀。
- 问题:学生E的成绩是异常值(输入错误,实际应为65分,但错误输入为1000分)。
步骤1:数据归一化
使用 min-max 归一化,将成绩缩放到 [0, 1] 范围:
x
norm
=
x
−
50
1000
−
50
=
x
−
50
950
x_{\text{norm}} = \frac{x - 50}{1000 - 50} = \frac{x - 50}{950}
xnorm=1000−50x−50=950x−50
归一化后结果:
学生 | 原始成绩 | 归一化成绩 | 是否优秀 |
---|---|---|---|
A | 50 | 0.0 | 0 |
B | 55 | 0.005 | 0 |
C | 60 | 0.011 | 0 |
D | 65 | 0.016 | 0 |
E | 1000 | 1.0 | 1 |
步骤2:模型如何“看”数据
假设用 KNN算法(k=1) 训练模型,规则是:
“如果一个学生的归一化成绩接近另一个学生,则他们的标签(是否优秀)应该相同。”
- 正常学生(A-D)的归一化成绩:集中在 0.0~0.016,几乎重叠。
- 异常学生E的归一化成绩:单独在 1.0,远离其他学生。
步骤3:模型预测时的错误
如果新来一个学生F,语文成绩为 63分(实际属于普通学生):
x
norm
=
63
−
50
950
≈
0.014
x_{\text{norm}} = \frac{63 - 50}{950} \approx 0.014
xnorm=95063−50≈0.014
模型会寻找与F最近的邻居:
- 最近的是学生D(0.016),但学生D的标签是0(普通)。
- 异常学生E(1.0) 距离F非常远,不会被考虑。
预测结果正确:学生F被分类为0(普通)。
但问题不在预测阶段,而在训练阶段!
关键问题:模型学到的规律
模型从训练数据中总结的规律是:
“只要成绩接近0.0~0.016,就是普通学生;只有成绩=1.0,才是优秀学生。”
这明显是错误的,因为:
-
所有正常学生(A-D)的归一化成绩几乎相同,模型认为他们的成绩差异可以忽略不计。
- 例如,学生B(55分)和学生D(65分)原本有10分的差异,但归一化后只有0.005 vs 0.016,差异被严重压缩。
- 模型认为:“55分和65分几乎一样,对分类结果没有影响。”
-
异常学生E(1000分)被单独归为1.0,模型会认为:“只要成绩=1.0,就是优秀学生。”
- 但实际上,成绩=1.0是输入错误,并非真实规律。
极端后果:模型完全依赖异常值
如果测试数据中出现一个真实优秀学生(成绩=90分,标签=1),归一化后:
x
norm
=
90
−
50
950
≈
0.042
x_{\text{norm}} = \frac{90 - 50}{950} \approx 0.042
xnorm=95090−50≈0.042
模型会如何分类?
- 最近的邻居是学生D(0.016),标签=0(普通)。
- 模型错误预测为0(普通),漏掉了真正的优秀学生。
- 因为模型只认“成绩=1.0”为优秀,而真实优秀学生的成绩在0.042,模型无法识别。
对比:无异常值的正确情况
如果修正学生E的成绩为65分(无异常值),数据归一化范围变为 [50, 65]:
x
norm
=
x
−
50
65
−
50
=
x
−
50
15
x_{\text{norm}} = \frac{x - 50}{65 - 50} = \frac{x - 50}{15}
xnorm=65−50x−50=15x−50
归一化后结果:
学生 | 原始成绩 | 归一化成绩 | 是否优秀 |
---|---|---|---|
A | 50 | 0.0 | 0 |
B | 55 | 0.33 | 0 |
C | 60 | 0.67 | 0 |
D | 65 | 1.0 | 0 |
E | 65 | 1.0 | 1 |
此时问题暴露:所有学生成绩被正确归一化到0~1,但学生E的标签为1,成绩却和其他学生重叠。
模型会发现矛盾:“成绩=1.0的学生中,有些是普通(D),有些是优秀(E)。”
此时模型会学到更复杂的规律(例如考虑其他特征),而不是被单一异常值误导。
总结
- 异常值的破坏性:
它扭曲了归一化范围,导致正常数据之间的差异被压缩,模型无法感知真实的数据分布。 - 模型的行为:
模型会过度关注异常值(例如认为“只有成绩=1.0才是优秀”),或完全忽略正常数据之间的差异(例如认为“55分和65分没区别”)。 - 解决方法:
使用鲁棒的归一化方法(如Z-score或基于分位数的缩放),或提前检测并处理异常值。
对比其他归一化方法
为了缓解异常值影响,可采用以下方法:
-
Z-score 标准化
公式: ( x std = x − μ σ (x_{\text{std}} = \frac{x - \mu}{\sigma} (xstd=σx−μ μ \mu μ 是均值, σ \sigma σ 是标准差)- 优点:对异常值的敏感度低于 min-max。
- 缺点:若异常值极端,均值和标准差仍会被拉偏。
-
鲁棒归一化(Robust Scaling)
公式: ( x robust = x − median ( X ) IQR ( X ) ) (x_{\text{robust}} = \frac{x - \text{median}(X)}{\text{IQR}(X)}) (xrobust=IQR(X)x−median(X))
(IQR 是四分位距,即 75% 分位数 - 25% 分位数)- 优点:基于中位数和 IQR,对异常值不敏感。
总结
- min-max 归一化的问题:依赖数据极值,异常值会扭曲归一化范围。
- 适用场景:人工清洗过的小数据集,或已知数据分布均匀且无异常值的情况。
- 替代方案:大数据场景优先使用 Z-score 或鲁棒归一化,或先通过异常检测(如 IQR 法、3σ 原则)清理数据。