跳到主要内容

标准化

一、直观理解:把不同尺子换成“离平均水平几步”​

标准化(Z-score Standardization)把每个变量改写成“距离自身均值多少个标准差”的无量纲数值。

想象班级里同时登记了身高(厘米)、体重(千克)和月消费(元)。若直接拿原始数去做距离、回归或 PCA,月消费动辄几百上千,会把身高、体重的波动完全淹没。标准化相当于先问:“这个人身高比班级平均高还是矮?大概高了几个‘典型波动’?”再对体重、消费问同样的问题。问完之后,三个变量都落在同一套“相对位置”刻度上。

对第 jj 个变量、第 ii 个样本:

zij=xij−xˉjsjz_{ij}=\frac{x_{ij}-\bar x_j}{s_j}

其中 xˉj\bar x_j 是该变量的样本均值,sjs_j 是样本标准差。变换后:

  • 每个变量的均值近似为 0;
  • 每个变量的标准差近似为 1;
  • 变量之间的相对离散结构被保留,但绝对单位被抹去。

需要特别注意:标准化消除的是量纲和数量级差异,并不自动消除异常值,也不改变变量之间的线性相关结构(相关系数在线性变换下不变)。若数据中存在极端值,均值和标准差会被拉偏,标准化后的刻度本身也会失真。

二、适用场景与优缺点​

类型说明
适用场景变量单位或数量级不一致;后续使用依赖距离或尺度的方法(KNN、K-Means、SVM 的 RBF 核、带 L1/L2L_1/L_2 正则的回归、PCA、神经网络等);需要比较不同变量对模型的相对贡献;希望把系数解释为“自变量变化一个标准差时的效应”。
核心优点计算简单、可逆;保留相对排序和线性相关;使正则化惩罚对各变量更公平;是 PCA、聚类等流程中的标准前置步骤。
局限与缺点对异常值敏感(均值、标准差不稳健);要求变量近似连续且方差非零;类别变量、稀疏 0-1 特征通常不宜直接套用;测试集必须沿用训练集的均值与标准差,否则会泄漏或尺度错位。

使用标准化前通常需要完成以下检查:

  1. 确认变量为数值型,且方差不为 0(常数列无法标准化);
  2. 检查是否存在明显异常值;若有,先处理或改用稳健标准化(如中位数 / MAD);
  3. 明确是“列标准化”(按变量)还是特殊任务下的行标准化;
  4. 划分训练 / 测试集之后,只在训练集上估计 xˉj\bar x_j 与 sjs_j;
  5. 记录采用的是样本标准差(分母 n−1n-1)还是总体标准差(分母 nn),保证全文一致。

三、核心原理:中心化后再按波动尺度缩放​

设数据矩阵 X∈Rn×pX\in\mathbb{R}^{n\times p},行是样本,列是变量。

1. 在训练集上估计位置与尺度​

对第 jj 列:

xˉj=1n∑i=1nxij,sj=1n−1∑i=1n(xij−xˉj)2\bar x_j=\frac{1}{n}\sum_{i=1}^{n}x_{ij},\qquad s_j=\sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_{ij}-\bar x_j)^2}

MATLAB 中 std(X,0,1) 对应分母 n−1n-1 的样本标准差;std(X,1,1) 对应分母 nn。

2. 对每个观测做仿射变换​

zij=xij−xˉjsjz_{ij}=\frac{x_{ij}-\bar x_j}{s_j}

若 sj=0s_j=0,该列无信息,应删除或单独标记,而不是强行除零。

3. 把同一套参数应用到测试集​

对测试样本 xijtestx^{\mathrm{test}}_{ij}:

zijtest=xijtest−xˉjtrainsjtrainz^{\mathrm{test}}_{ij}=\frac{x^{\mathrm{test}}_{ij}-\bar x_j^{\mathrm{train}}}{s_j^{\mathrm{train}}}

禁止用测试集自己的均值和标准差,也禁止把训练、测试拼在一起再标准化——这两种做法都会造成数据泄漏或评估偏乐观。

4. 与归一化的本质区别​

对比项标准化(Z-score)最小—最大归一化
参考量均值、标准差最小值、最大值
输出范围理论上无界,常大致在 [−3,3][-3,3]通常压到 [0,1][0,1] 或 [−1,1][-1,1]
对异常值敏感,但比 min-max 稍稳极敏感,一个极值可压扁全体
典型用途PCA、正则回归、多数距离模型神经网络输入、需要有界特征时

四、关键决策 / 如何选参数​

标准化几乎没有“超参数”,但有几项必须事先说清楚的选择:

1. 用样本标准差还是总体标准差​

建模与统计推断中更常见 n−1n-1;若只是做尺度统一且与某软件默认一致,可沿用该软件约定,但要在报告中写明。

2. 是否改用稳健版本​

当异常值较多或分布严重偏态时,可用:

zijrobust=xij−median(xj)MAD(xj)z_{ij}^{\mathrm{robust}}=\frac{x_{ij}-\mathrm{median}(x_j)}{\mathrm{MAD}(x_j)}

其中 MAD\mathrm{MAD} 为中位数绝对偏差。稳健标准化更抗极端值,但与经典 PCA / 正态假设下的理论叙述不再严格对应。

3. 是否先做非线性变换​

收入、污染物浓度等右偏变量,有时先取对数或 Box-Cox,再标准化,后续线性模型残差更合理。顺序应是:处理异常与缺失 →(可选)非线性变换 → 标准化。

4. 训练集规模过小时​

nn 很小则 sjs_j 估计不稳,标准化可能放大噪声。可报告 bootstrap 下尺度参数的波动,或对近似同质的变量共享尺度。

5. 多折交叉验证中的正确做法​

每一折都要在该折训练集上重新估计均值和标准差,再变换验证折。把标准化放在 CV 外层一次性做完,等于泄漏了验证折信息。

五、MATLAB 示例​

下面用身高、体重、月消费三列数据演示:在“训练集”上估计参数,再变换“测试集”,并核对变换后的均值与标准差。

% 模拟数据:列1身高(cm),列2体重(kg),列3月消费(元)
X_train = [
170, 65, 1200;
165, 55, 800;
180, 75, 1500;
175, 70, 1100;
160, 50, 600
];

X_test = [
172, 68, 1000;
168, 58, 900
];

featureNames = ["身高", "体重", "月消费"];

% ----- 仅在训练集上估计均值与标准差 -----
mu = mean(X_train, 1); % 1 x p
sigma = std(X_train, 0, 1); % 样本标准差,分母 n-1

% 防止零方差
sigma(sigma == 0) = 1;

% 标准化
Z_train = (X_train - mu) ./ sigma;
Z_test = (X_test - mu) ./ sigma;

% 也可用 zscore,但注意:zscore 默认用当前矩阵自己的统计量
% 跨集合变换时必须手动沿用训练集参数,如下所示更安全

disp("训练集标准化后的均值(应接近 0):");
disp(mean(Z_train, 1));

disp("训练集标准化后的标准差(应接近 1):");
disp(std(Z_train, 0, 1));

disp("测试集标准化结果:");
disp(array2table(Z_test, "VariableNames", featureNames));

% 还原到原始量纲(写论文解释时常用)
X_test_recovered = Z_test .* sigma + mu;
disp("由标准化结果还原的测试集:");
disp(X_test_recovered);

若数据已在一个矩阵中且暂时不做划分,可直接:

Z = zscore(X_train); % 等价于按列减均值除样本标准差

六、如何解释结果​

标准化之后,单个 zijz_{ij} 的含义是:

样本 ii 在变量 jj 上比训练集平均水平高(或低)了 ∣zij∣|z_{ij}| 个标准差。

经验上(仅当分布近似正态时):

  • ∣z∣≈1|z|\approx 1:处于常见波动范围内;
  • ∣z∣≈2|z|\approx 2:较明显偏离平均;
  • ∣z∣>3|z|>3:可与 3σ 法则衔接,作为异常候选。

在报告中建议写明:

  1. 参与标准化的变量列表与原始单位;
  2. 均值、标准差的估计样本(仅训练集 / 哪一折);
  3. 标准差定义(nn 还是 n−1n-1);
  4. 标准化前后各变量的均值、标准差或箱线图对比;
  5. 是否对异常值做了事先处理;
  6. 下游模型(如 PCA、回归)在标准化前后的表现差异。

解释回归系数时,标准化后的系数表示“该自变量增加一个标准差时,因变量的变化量”,便于比较不同自变量的相对重要性;但若赛题需要政策含义(如“房价每贵 1000 元”),仍应同时给出原始量纲下的模型或把系数换算回去。

七、常见误区​

1. 用全数据(含测试集)估计均值和标准差​

这是最常见的泄漏。正确做法是:参数只来自训练折,测试折只做变换。

2. 以为标准化能“去掉异常值”​

极端值仍在,只是被表示成很大的 ∣z∣|z|。对异常敏感的算法,标准化后问题可能依旧存在。

3. 对类别变量或独热编码后的稀疏列盲目标准化​

0-1 特征标准化后失去清晰的类别含义,且稀疏性被破坏。树模型通常也不需要标准化。

4. 零方差或近零方差变量未处理​

sj≈0s_j\approx 0 会导致数值爆炸。应先做方差阈值过滤。

5. 把“标准化”和“归一化”混为一谈​

中文建模报告里二者经常被互换使用。写作时应明确公式是 Z-score 还是 min-max,避免评委误解。

八、小结​

标准化通过减去均值、除以标准差,把不同单位、不同数量级的变量拉到同一相对刻度上,是距离模型、正则化方法和 PCA 最常用的前置步骤。

它的核心思想可以概括为:

不比较“原始读数有多大”,而比较“相对自身平均水平偏离了几个典型波动”。

使用时务必在训练集上估计参数、警惕异常值与零方差列,并在论文中清楚区分标准化与归一化。标准化解决的是尺度公平问题,不能替代缺失处理、异常核查和模型验证。