特征处理--归一化

特征归一化使用最大值最小值(将原始数据x缩放到[0,1]区间,当存在异常值会导致稳定性较差。以下是详细解释和示例:


原因分析

  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)xmin(X)
    其中 max ( X ) \text{max}(X) max(X) min ( X ) \text{min}(X) min(X) 是数据集的极值。如果数据中存在异常值(极大或极小),会导致极值严重偏离正常数据的分布范围,从而压缩大部分正常数据的归一化结果,使其分布范围变小。

  2. 稳定性差
    异常值会导致 max ( X ) \text{max}(X) max(X) min ( X ) \text{min}(X) min(X) 剧烈波动。例如,新增一个异常值会显著改变归一化范围,导致模型在不同批次数据上的表现不稳定。

  3. 适合小数据场景的原因
    在小数据场景中,数据量少且通常经过人工清洗,异常值容易被发现和处理。而大数据场景中,数据自动采集可能包含更多噪声,极值的存在概率更高,此时 min-max 归一化的缺点会被放大。


示例说明

假设有一组学生的考试成绩(满分 100 分):
X = [ 50 , 55 , 60 , 65 , 1000 ] X = [50, 55, 60, 65, \color{black}{1000}] X=[50,55,60,65,1000]
其中 1000 是输入错误导致的异常值。

  1. 计算极值
    min ( X ) = 50 \text{min}(X) = 50 min(X)=50 max ( X ) = 1000 \text{max}(X) = 1000 max(X)=1000

  2. 归一化结果
    x norm = x − 50 1000 − 50 = x − 50 950 x_{\text{norm}} = \frac{x - 50}{1000 - 50} = \frac{x - 50}{950} xnorm=100050x50=950x50

    • 正常数据归一化后:
      ( 50 → 0.0 ) (50 \to 0.0) (500.0) ( 55 → 0.005 ) (55 \to 0.005) (550.005) ( 60 → 0.010 ) (60 \to 0.010) (600.010) ( 65 → 0.016 ) (65 \to 0.016) (650.016)
    • 异常值归一化后:
      ( 1000 → 1.0 ) (1000 \to 1.0) (10001.0)

    问题:正常数据被压缩到接近 0 的极小范围内,而异常值占据了 1.0 的位置,导致数据分布严重失真。

  3. 对模型的影响
    如果使用此数据训练模型(如 KNN、神经网络等),模型会认为大部分正常数据之间的差异极小,而异常值被错误地赋予了极高的重要性,导致模型学习到错误的规律。


让我们通过一个更具体的例子,一步步解释为什么异常值会导致模型学习到错误的规律。

例子:学生考试成绩分类问题

假设我们有一组学生的 语文成绩(特征) 和对应的 是否优秀(标签:0=普通,1=优秀)。数据如下:

学生语文成绩是否优秀
A500
B550
C600
D650
E10001
  • 目标:训练一个模型,根据语文成绩预测学生是否优秀。
  • 问题:学生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=100050x50=950x50
归一化后结果:

学生原始成绩归一化成绩是否优秀
A500.00
B550.0050
C600.0110
D650.0160
E10001.01

步骤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=95063500.014
模型会寻找与F最近的邻居:

  • 最近的是学生D(0.016),但学生D的标签是0(普通)。
  • 异常学生E(1.0) 距离F非常远,不会被考虑。

预测结果正确:学生F被分类为0(普通)。
但问题不在预测阶段,而在训练阶段!


关键问题:模型学到的规律

模型从训练数据中总结的规律是:
“只要成绩接近0.0~0.016,就是普通学生;只有成绩=1.0,才是优秀学生。”
这明显是错误的,因为:

  1. 所有正常学生(A-D)的归一化成绩几乎相同,模型认为他们的成绩差异可以忽略不计。

    • 例如,学生B(55分)和学生D(65分)原本有10分的差异,但归一化后只有0.005 vs 0.016,差异被严重压缩。
    • 模型认为:“55分和65分几乎一样,对分类结果没有影响。”
  2. 异常学生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=95090500.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=6550x50=15x50
归一化后结果:

学生原始成绩归一化成绩是否优秀
A500.00
B550.330
C600.670
D651.00
E651.01

此时问题暴露:所有学生成绩被正确归一化到0~1,但学生E的标签为1,成绩却和其他学生重叠。
模型会发现矛盾:“成绩=1.0的学生中,有些是普通(D),有些是优秀(E)。”
此时模型会学到更复杂的规律(例如考虑其他特征),而不是被单一异常值误导。


总结

  • 异常值的破坏性
    它扭曲了归一化范围,导致正常数据之间的差异被压缩,模型无法感知真实的数据分布。
  • 模型的行为
    模型会过度关注异常值(例如认为“只有成绩=1.0才是优秀”),或完全忽略正常数据之间的差异(例如认为“55分和65分没区别”)。
  • 解决方法
    使用鲁棒的归一化方法(如Z-score或基于分位数的缩放),或提前检测并处理异常值。

对比其他归一化方法

为了缓解异常值影响,可采用以下方法:

  1. Z-score 标准化
    公式: ( x std = x − μ σ (x_{\text{std}} = \frac{x - \mu}{\sigma} (xstd=σxμ μ \mu μ 是均值, σ \sigma σ 是标准差)

    • 优点:对异常值的敏感度低于 min-max。
    • 缺点:若异常值极端,均值和标准差仍会被拉偏。
  2. 鲁棒归一化(Robust Scaling)
    公式: ( x robust = x − median ( X ) IQR ( X ) ) (x_{\text{robust}} = \frac{x - \text{median}(X)}{\text{IQR}(X)}) (xrobust=IQR(X)xmedian(X))
    (IQR 是四分位距,即 75% 分位数 - 25% 分位数)

    • 优点:基于中位数和 IQR,对异常值不敏感。

总结

  • min-max 归一化的问题:依赖数据极值,异常值会扭曲归一化范围。
  • 适用场景人工清洗过的小数据集,或已知数据分布均匀且无异常值的情况。
  • 替代方案:大数据场景优先使用 Z-score 或鲁棒归一化,或先通过异常检测(如 IQR 法、3σ 原则)清理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值