机器学习数据预处理:数据标准化(Z-Score)超通俗全解
数据标准化是**把所有特征统一变成“均值为0,标准差为1”**的最经典预处理方法,彻底解决量纲不一致、数值差距大的问题,所有对尺度敏感的模型都必须做。
一、什么是数据标准化?为什么一定要做?
1. 一句话理解
标准化 = 把数据变成标准正态分布,让所有特征在同一个“起跑线”上。
2. 不做标准化会怎样?
- 身高(150-200)、体重(30-100)、收入(几千-几百万)数值差距巨大
- 模型会被数值大的特征带偏,认为它更重要
- KNN、SVM、神经网络、线性回归等模型精度暴跌、收敛极慢
3. 标准化的3大作用
- 消除量纲影响:不同单位、不同范围的特征可公平比较
- 加速模型收敛:梯度下降跑得更快更稳
- 提升模型精度:避免大数值特征主导模型
二、最核心方法:Z-Score 标准化
1. 公式(必须背会)
z=x−μσz = \frac{x-\mu}{\sigma}z=σx−μ
2. 符号解释
- x:原始数据
- μ(mu):这一列特征的均值
- σ(sigma):这一列特征的标准差
- z:标准化后的值(大部分落在 [-3, 3])
3. 直观计算例子
原始分数:70、80、90
- 均值 μ = (70+80+90)/3 = 80
- 标准差 σ ≈ 8.165
- 计算:
- 70 → (70-80)/8.165 ≈ -1.225
- 80 → (80-80)/8.165 = 0
- 90 → (90-80)/8.165 ≈ +1.225
结果:数据以0为中心,表示距离平均值多少个标准差。
三、数学推导(论文/面试必备)
1. 目标
变换后满足:
- 均值 = 0
- 方差 = 1
- 标准差 = 1
2. 推导步骤
- 中心化:x’ = x - μ → 均值变为0
- 标准化:z = x’ / σ → 标准差变为1
最终得到:
zi=xi−μσz_i = \frac{x_i-\mu}{\sigma}zi=σxi−μ
四、标准化 vs 归一化(最易混淆)
| 方法 | 公式 | 输出范围 | 异常值影响 | 适用场景 |
|---|---|---|---|---|
| 标准化(Z-Score) | (x-μ)/σ | 无固定,约[-3,3] | 小 | 大多数模型、正态分布、梯度下降 |
| 归一化(Min-Max) | (x-min)/(max-min) | [0,1] | 非常大 | 图像、固定范围、KNN |
最简单选择口诀
- 有异常值、数据偏态 → 用标准化
- 需要0~1范围 → 用归一化
- 不知道用啥 → 直接用标准化
五、完整可运行代码(含4张可视化图)
包含:数据生成、标准化、直方图、散点图、Q-Q图检验正态性。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
# 生成模拟成绩数据
np.random.seed(42)
data = np.random.normal(loc=80, scale=10, size=100)
# Z-Score 标准化
mu = np.mean(data)
sigma = np.std(data)
z_data = (data - mu) / sigma
# 绘图:4张图对比
fig, axes = plt.subplots(2, 2, figsize=(16, 10))
fig.suptitle("Data Standardization (Z-Score) Analysis", fontsize=20)
# 1. 原始数据分布
sns.histplot(data, kde=True, color="coral", ax=axes[0,0])
axes[0,0].set_title("原始数据分布")
axes[0,0].set_xlabel("分数")
# 2. 标准化后分布
sns.histplot(z_data, kde=True, color="mediumseagreen", ax=axes[0,1])
axes[0,1].set_title("标准化数据分布")
axes[0,1].set_xlabel("Z-Score")
# 3. 原始 vs 标准化 散点图
axes[1,0].scatter(data, z_data, color="orchid", s=100, alpha=0.7, edgecolors='black')
m, b = np.polyfit(data, z_data, 1)
axes[1,0].plot(data, m*data + b, 'k--')
axes[1,0].set_title("原始数据 ↔ 标准化数据")
axes[1,0].set_xlabel("原始")
axes[1,0].set_ylabel("标准化")
# 4. Q-Q图检验正态性
stats.probplot(z_data, dist="norm", plot=axes[1,1])
axes[1,1].get_lines()[0].set_color('gold')
axes[1,1].get_lines()[1].set_color('red')
axes[1,1].set_title("Q-Q 正态性检验")
plt.tight_layout()
plt.show()
六、哪些模型必须做标准化?
✅ 必须做(不做效果极差)
- KNN、K-Means(基于距离)
- SVM(支持向量机)
- 线性回归、逻辑回归
- 神经网络、PCA、梯度下降类算法
❌ 不用做(树模型)
- 决策树、随机森林、XGBoost、LightGBM
七、总结(面试/笔记速背版)
- 标准化 = 均值0,标准差1,消除量纲影响
- 公式:z = (x-μ)/σ
- 对异常值更鲁棒,通用首选
- 距离/线性/神经网络模型必做,树模型不用做
- 标准化不改变分布形状,只改变尺度
&spm=1001.2101.3001.5002&articleId=160503039&d=1&t=3&u=ff1966ebd8d141ef80431903d5d7d390)
223

被折叠的 条评论
为什么被折叠?



