本节你会学到
- 说清楚「数据标准化和归一化有什么区别」解决的核心问题
- 知道它在「传统机器学习基础(21~34)」中的位置
- 把 特征工程、分类与回归、机器学习 这些关键词联系起来
标准化和归一化都在处理数值尺度问题,但一个看均值方差,一个看最大最小值。
学习路线:传统机器学习基础(21~34) · 第 26 课
补齐文本分类项目背后的数据处理、算法、评估和模型选择知识。
学完本阶段你能做到:拿到一份结构化表格数据,独立完成清洗、特征工程、建模、评估、模型选择和保存,并用规范流程比较多个算法。
推荐读法:建议系统读。做项目时遇到数据和模型选择问题,也可以按需回查。
查看完整阶段 · 14 篇先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。
合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。
它应该为下一课「线性回归:模型怎样用一条线预测连续数值」铺路:读完后要知道下一课为什么自然出现。
做机器学习时,经常会遇到这种情况:一个字段是年龄,范围大概是几十;另一个字段是收入,范围可能是几千到几十万;再一个字段是距离,可能从 0 到几千。
这些字段的数值尺度差异很大。某些模型会被大尺度特征牵着走,导致训练不稳定或效果变差。标准化和归一化,就是用来处理这类问题的。
标准化关注均值和标准差。
它通常把数据变成均值约为 0、标准差约为 1 的分布:
x_standard = (x - mean) / std
归一化关注最大值和最小值。
它通常把数据压缩到 0 到 1 的范围:
x_norm = (x - min) / (max - min)
所以两者都在缩放数值,但依据不同。
假设我们有两个特征:
年龄:18 到 60
年收入:30000 到 500000
如果模型使用距离、梯度或权重更新,大范围的收入字段可能会对结果产生更大的影响。不是因为收入一定更重要,而是因为它的数字更大。
这会影响很多模型,比如:
树模型通常对缩放不那么敏感,比如决策树、随机森林、梯度提升树。因为它们主要按阈值切分特征,而不是直接计算距离或梯度尺度。
标准化在 scikit-learn 里常用 StandardScaler:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_valid_scaled = scaler.transform(X_valid)
X_test_scaled = scaler.transform(X_test)
注意这里的顺序非常重要:
fit_transform;transform;fit。因为 fit 会计算均值和标准差。如果你在测试集上 fit,就等于让预处理过程提前看到了测试集信息。
归一化常用 MinMaxScaler:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_norm = scaler.fit_transform(X_train)
X_valid_norm = scaler.transform(X_valid)
X_test_norm = scaler.transform(X_test)
归一化会把训练集里的最小值映射到 0,最大值映射到 1。
如果新数据超出了训练集范围,转换后也可能小于 0 或大于 1。这不是一定错误,只说明新数据超出了训练时见过的范围,需要结合业务判断。
初学阶段可以先这样判断:
线性模型、逻辑回归、SVM、神经网络 -> 标准化常用
KNN、K-Means、距离相关模型 -> 很需要缩放
数据范围固定且有明确上下界 -> 可以考虑归一化
决策树、随机森林、XGBoost -> 通常不强依赖缩放
比如像像素值这种天然在 0 到 255 的数据,归一化到 0 到 1 很常见。
而像收入、年龄、消费金额这类表格数据,标准化更常见。
错误写法是:
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y)
这段代码看起来很顺,但有一个问题:它在划分训练集和测试集之前,就已经用全量数据计算了均值和标准差。
这样测试集的信息泄漏到了训练流程里。
更稳妥的写法是:
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
先划分,再用训练集学习缩放规则。
模型上线时不能只保存模型文件,还要保存预处理对象。
比如:
import joblib
joblib.dump(model, "model.pkl")
joblib.dump(scaler, "scaler.pkl")
预测新样本时:
model = joblib.load("model.pkl")
scaler = joblib.load("scaler.pkl")
new_x_scaled = scaler.transform(new_x)
pred = model.predict(new_x_scaled)
训练时怎么缩放,预测时就必须怎么缩放。
标准化和归一化都是为了处理数值尺度问题。
这一课记住四句话:
下一课我们进入第一个经典模型:线性回归,看模型怎样用一条线预测连续数值。
留言讨论