StandardScaler将数据标准化为均值0、标准差1,适用于SVM等对量纲敏感的模型,须用同一scaler对训练集fit_transform、测试集transform;MinMaxScaler缩放到[0,1]区间,依赖训练集极值,超范围值会导致越界。

StandardScaler 会让数据服从均值为0、标准差为1的分布
它对每列特征做 z = (x - mean) / std 变换,本质是中心化 + 标准化。适用于大多数基于距离或梯度的模型(比如 SVM、LogisticRegression、KMeans),因为这些模型对量纲和数值范围敏感。
常见错误现象:StandardScaler 在训练集上拟合后,必须用同一个 fit_transform(训练集)和 transform(验证/测试集)——如果对测试集重新 fit,会导致数据泄露和评估失真。
- 训练阶段:用
scaler.fit_transform(X_train) - 推理阶段:只调用
scaler.transform(X_test),绝不能fit_transform或fit - 如果含缺失值,
StandardScaler默认不处理,会报ValueError: Input contains NaN,需提前用SimpleImputer填充
MinMaxScaler 把每列缩放到固定区间,默认是 [0, 1]
它执行的是线性变换:x_scaled = (x - min) / (max - min),再乘以区间长度并平移。适合需要明确边界(比如图像像素归一化、神经网络输入)、或对异常值相对鲁棒的场景。
注意:它的缩放结果完全依赖于训练集的 min 和 max。一旦测试数据出现超出训练集范围的值(比如新样本的某特征 > 训练集最大值),就会得到 > 1 或 的结果——这本身不是错误,但可能影响模型稳定性。
立即学习“Python免费学习笔记(深入)”;
- 默认区间是
feature_range=(0, 1),也可设为(-1, 1)等 - 对离群点敏感:若训练集中存在极端异常值,
min/max会被拉偏,导致大部分正常数据被压缩到极窄区间 - 不改变原始分布形状,只是线性拉伸/平移
选哪个?关键看模型假设和数据特性
没有绝对优劣,区别在于你是否需要“消除量纲”还是“控制数值范围”。
- 用
StandardScaler:模型假设输入近似正态(如线性判别分析LDA)、或优化器(如 SGD)在各方向梯度更新更均衡 - 用
MinMaxScaler:输入层要求 [0,1](如某些激活函数)、下游算法显式依赖边界(如DBSCAN的eps参数)、或你想保留特征相对大小关系(比如“用户停留时长”始终大于“点击次数”,缩放后也保持) - 都不行时考虑
RobustScaler:用中位数和四分位距,抗异常值
fit 和 transform 必须严格分离,且不能跨列混用
很多人在 pipeline 中误把 X_train 和 y_train 一起传给 scaler——StandardScaler 和 MinMaxScaler 都只处理 X(二维数组),对 y(标签)调用会报 ValueError: Expected 2D array, got 1D array。
- 正确做法:只对特征矩阵
X缩放,y原样保留 - 列顺序不能变:训练时第3列是“年龄”,预测时第3列也必须是“年龄”,否则缩放参数错位
- DataFrame 使用时,
scaler.fit_transform(df[['a','b']])返回 ndarray;若要保留列名和索引,得手动转回DataFrame
实际项目里最容易被忽略的,是训练集和测试集共享同一套 scaler 参数这件事——它不像模型权重那么显眼,但一旦漏掉或写错,整个实验的可复现性和线上效果都会出问题。


















