标准化
一、直观理解:把不同尺子换成“离平均水平几步”
标准化(Z-score Standardization)把每个变量改写成“距离自身均值多少个标准差”的无量纲数值。
想象班级里同时登记了身高(厘米)、体重(千克)和月消费(元)。若直接拿原始数去做距离、回归或 PCA,月消费动辄几百上千,会把身高、体重的波动完全淹没。标准化相当于先问:“这个人身高比班级平均高还是矮?大概高了几个‘典型波动’?”再对体重、消费问同样的问题。问完之后,三个变量都落在同一套“相对位置”刻度上。
对第 个变量、第 个样本:
其中 是该变量的样本均值, 是样本标准差。变换后:
- 每个变量的均值近似为 0;
- 每个变量的标准差近似为 1;
- 变量之间的相对离散结构被保留,但绝对单位被抹去。
需要特别注意:标准化消除的是量纲和数量级差异,并不自动消除异常值,也不改变变量之间的线性相关结构(相关系数在线性变换下不变)。若数据中存在极端值,均值和标准差会被拉偏,标准化后的刻度本身也会失真。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 变量单位或数量级不一致;后续使用依赖距离或尺度的方法(KNN、K-Means、SVM 的 RBF 核、带 正则的回归、PCA、神经网络等);需要比较不同变量对模型的相对贡献;希望把系数解释为“自变量变化一个标准差时的效应”。 |
| 核心优点 | 计算简单、可逆;保留相对排序和线性相关;使正则化惩罚对各变量更公平;是 PCA、聚类等流程中的标准前置步骤。 |
| 局限与缺点 | 对异常值敏感(均值、标准差不稳健);要求变量近似连续且方差非零;类别变量、稀疏 0-1 特征通常不宜直接套用;测试集必须沿用训练集的均值与标准差,否则会泄漏或尺度错位。 |
使用标准化前通常需要完成以下检查:
- 确认变量为数值型,且方差不为 0(常数列无法标准化);
- 检查是否存在明显异常值;若有,先处理或改用稳健标准化(如中位数 / MAD);
- 明确是“列标准化”(按变量)还是特殊任务下的行标准化;
- 划分训练 / 测试集之后,只在训练集上估计 与 ;
- 记录采用的是样本标准差(分母 )还是总体标准差(分母 ),保证全文一致。
三、核心原理:中心化后再按波动尺度缩放
设数据矩阵 ,行是样本,列是变量。
1. 在训练集上估计位置与尺度
对第 列:
MATLAB 中 std(X,0,1) 对应分母 的样本标准差;std(X,1,1) 对应分母 。
2. 对每个观测做仿射变换
若 ,该列无信息,应删除或单独标记,而不是强行除零。
3. 把同一套参数应用到测试集
对测试样本 :
禁止用测试集自己的均值和标准差,也禁止把训练、测试拼在一起再标准化——这两种做法都会造成数据泄漏或评估偏乐观。
4. 与归一化的本质区别
| 对比项 | 标准化(Z-score) | 最小—最大归一化 |
|---|---|---|
| 参考量 | 均值、标准差 | 最小值、最大值 |
| 输出范围 | 理论上无界,常大致在 | 通常压到 或 |
| 对异常值 | 敏感,但比 min-max 稍稳 | 极敏感,一个极值可压扁全体 |
| 典型用途 | PCA、正则回归、多数距离模型 | 神经网络输入、需要有界特征时 |
四、关键决策 / 如何选参数
标准化几乎没有“超参数”,但有几项必须事先说清楚的选择:
1. 用样本标准差还是总体标准差
建模与统计推断中更常见 ;若只是做尺度统一且与某软件默认一致,可沿用该软件约定,但要在报告中写明。
2. 是否改用稳健版本
当异常值较多或分布严重偏态时,可用:
其中 为中位数绝对偏差。稳健标准化更抗极端值,但与经典 PCA / 正态假设下的理论叙述不再严格对应。
3. 是否先做非线性变换
收入、污染物浓度等右偏变量,有时先取对数或 Box-Cox,再标准化,后续线性模型残差更合理。顺序应是:处理异常与缺失 →(可选)非线性变换 → 标准化。
4. 训练集规模过小时
很小则 估计不稳,标准化可能放大噪声。可报告 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); % 等价于按列减均值除样本标准差
六、如何解释结果
标准化之后,单个 的含义是:
样本 在变量 上比训练集平均水平高(或低)了 个标准差。
经验上(仅当分布近似正态时):
- :处于常见波动范围内;
- :较明显偏离平均;
- :可与 3σ 法则衔接,作为异常候选。
在报告中建议写明:
- 参与标准化的变量列表与原始单位;
- 均值、标准差的估计样本(仅训练集 / 哪一折);
- 标准差定义( 还是 );
- 标准化前后各变量的均值、标准差或箱线图对比;
- 是否对异常值做了事先处理;
- 下游模型(如 PCA、回归)在标准化前后的表现差异。
解释回归系数时,标准化后的系数表示“该自变量增加一个标准差时,因变量的变化量”,便于比较不同自变量的相对重要性;但若赛题需要政策含义(如“房价每贵 1000 元”),仍应同时给出原始量纲下的模型或把系数换算回去。
七、常见误区
1. 用全数据(含测试集)估计均值和标准差
这是最常见的泄漏。正确做法是:参数只来自训练折,测试折只做变换。
2. 以为标准化能“去掉异常值”
极端值仍在,只是被表示成很大的 。对异常敏感的算法,标准化后问题可能依旧存在。
3. 对类别变量或独热编码后的稀疏列盲目标准化
0-1 特征标准化后失去清晰的类别含义,且稀疏性被破坏。树模型通常也不需要标准化。
4. 零方差或近零方差变量未处理
会导致数值爆炸。应先做方差阈值过滤。
5. 把“标准化”和“归一化”混为一谈
中文建模报告里二者经常被互换使用。写作时应明确公式是 Z-score 还是 min-max,避免评委误解。
八、小结
标准化通过减去均值、除以标准差,把不同单位、不同数量级的变量拉到同一相对刻度上,是距离模型、正则化方法和 PCA 最常用的前置步骤。
它的核心思想可以概括为:
不比较“原始读数有多大”,而比较“相对自身平均水平偏离了几个典型波动”。
使用时务必在训练集上估计参数、警惕异常值与零方差列,并在论文中清楚区分标准化与归一化。标准化解决的是尺度公平问题,不能替代缺失处理、异常核查和模型验证。