Python 实战:数据归一化 4 种核心方法对比 + 代码实现(机器学习必看)
在机器学习、深度学习的数据预处理中,数据归一化是绕不开的关键步骤。不同特征往往量纲不同(比如年龄 18-60、收入 1000-100000),直接训练模型会导致:
- 梯度下降收敛慢、难以最优解
- 距离类算法(KNN、K-Means、SVM)精度暴跌
- 神经网络权重更新失衡
本文整理Python 中最常用的 4 种数据归一化 / 标准化方法,从原理、适用场景、代码实现、优缺点全方位对比,新手也能直接套用!
一、核心概念区分:归一化 vs 标准化
先理清两个易混淆的概念,避免用错方法:
- 归一化(Normalization):将数据压缩到 **[0,1]或[-1,1]** 区间,消除量纲影响;
- 标准化(Standardization):将数据转换为均值为 0,方差为 1的标准正态分布,不严格限制区间。
两者核心区别:
- 归一化:依赖数据最大 / 最小值,对异常值敏感;
- 标准化:依赖数据均值 / 标准差,对异常值鲁棒性更强。
二、4 种常用归一化 / 标准化方法详解
本文使用numpy手动实现 + sklearn封装调用两种方式,兼顾原理理解和工程落地。
测试数据准备
先创建一组包含异常值的测试数据,方便对比效果:
python
运行
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler, MaxAbsScaler, RobustScaler
# 生成测试数据(包含异常值:1000)
data = np.array([[10, 200, 30],
[20, 300, 40],
[30, 400, 50],
[40, 500, 60],
[50, 1000, 70]]) # 第二列最后一个值为异常值
df = pd.DataFrame(data, columns=['特征1', '特征2', '特征3'])
print("原始数据:")
print(df)
方法 1:最小 - 最大归一化(Min-Max Scaling)→ [0,1]
原理
最基础的线性归一化方法,公式:Xnorm=Xmax−XminX−Xmin
代码实现
python
运行
# 1. 手动实现
def min_max_scaler(x):
return (x - np.min(x)) / (np.max(x) - np.min(x))
data_minmax = min_max_scaler(data)
# 2. sklearn封装(推荐工程使用)
scaler_minmax = MinMaxScaler()
data_minmax_sk = scaler_minmax.fit_transform(data)
print("\nMin-Max归一化([0,1]):")
print(pd.DataFrame(data_minmax_sk, columns=df.columns))
核心特点
✅ 优点:简单直观,适合数据分布均匀、无明显异常值的场景;❌ 缺点:对异常值极其敏感(最大值会被异常值拉高,导致大部分数据被压缩);📌 适用场景:图像处理、固定范围的数值特征、神经网络输入层。
方法 2:绝对值最大归一化(Max-Abs Scaling)→ [-1,1]
原理
基于数据绝对值的最大值缩放,适合数据包含正负值的场景,公式:Xnorm=∣Xmax∣X
代码实现
python
运行
# sklearn实现
scaler_maxabs = MaxAbsScaler()
data_maxabs = scaler_maxabs.fit_transform(data)
print("\nMax-Abs归一化([-1,1]):")
print(pd.DataFrame(data_maxabs, columns=df.columns))
核心特点
✅ 优点:不破坏稀疏数据结构,计算高效;❌ 缺点:同样对异常值敏感;📌 适用场景:稀疏矩阵、文本分类、数据已中心化的场景。
方法 3:Z-Score 标准化(Standard Scaling)→ 均值 0 方差 1
原理
最常用的标准化方法,将数据转换为标准正态分布,公式:Xstd=σX−μμ:均值,σ:标准差
代码实现
python
运行
# 1. 手动实现
def standard_scaler(x):
return (x - np.mean(x)) / np.std(x)
data_standard = standard_scaler(data)
# 2. sklearn实现(机器学习首选)
scaler_std = StandardScaler()
data_std_sk = scaler_std.fit_transform(data)
print("\nZ-Score标准化(均值0,方差1):")
print(pd.DataFrame(data_std_sk, columns=df.columns))
核心特点
✅ 优点:对异常值鲁棒性强,不依赖极值,适合大部分机器学习算法;✅ 适用算法:逻辑回归、SVM、线性回归、PCA、神经网络;❌ 缺点:数据会偏离原始区间,不适合需要固定范围的场景;📌 适用场景:绝大多数机器学习模型(默认首选)。
方法 4:鲁棒归一化(Robust Scaling)→ 抗异常值神器
原理
针对包含大量异常值的数据设计,使用中位数(Q2)和四分位数(Q1/Q3) 替代均值和极值,公式:Xrobust=Q3−Q1X−Q2
代码实现
python
运行
# sklearn实现
scaler_robust = RobustScaler()
data_robust = scaler_robust.fit_transform(data)
print("\nRobust鲁棒归一化(抗异常值):")
print(pd.DataFrame(data_robust, columns=df.columns))
核心特点
✅ 优点:完全不受异常值影响,是异常值数据的最优解;✅ 优点:保留数据的离散程度,鲁棒性拉满;❌ 缺点:计算稍复杂,依赖四分位数;📌 适用场景:数据包含异常值、数据分布倾斜(非正态)、实际业务数据。
三、4 种方法全方位对比表
表格
| 方法 | 公式核心 | 输出区间 | 对异常值敏感性 | 适用场景 | 推荐算法 |
|---|---|---|---|---|---|
| Min-Max | 最值缩放 | [0,1] | 极高 | 无异常值、均匀分布 | 神经网络、图像处理 |
| Max-Abs | 绝对值缩放 | [-1,1] | 高 | 稀疏矩阵、正负数据 | 文本分类、稀疏特征 |
| Z-Score | 均值标准差 | 无固定区间 | 低 | 正态分布、通用场景 | 90% 机器学习模型 |
| Robust | 四分位数缩放 | 无固定区间 | 极低 | 含异常值、倾斜分布 | 实际业务数据、KNN、K-Means |
四、关键结论:怎么选?(新手直接抄作业)
- 数据无异常值、需要固定范围 → 选 Min-Max 归一化;
- 数据是稀疏矩阵、包含正负值 → 选 Max-Abs 归一化;
- 通用机器学习、数据正态分布 → 选 Z-Score 标准化(默认首选);
- 数据有异常值、实际业务数据 → 选 Robust 鲁棒归一化。
五、避坑指南(工程必备)
-
先拆分训练集 / 测试集,再归一化绝对不能用测试集的极值 / 均值做归一化,会导致数据泄露,模型上线必崩!
python
运行
# 正确写法 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(data, [0,1,0,1,0], test_size=0.2) scaler = StandardScaler() X_train_std = scaler.fit_transform(X_train) # 仅用训练集拟合 X_test_std = scaler.transform(X_test) # 测试集直接用训练集的参数 -
树模型不需要归一化决策树、随机森林、XGBoost 等基于规则的模型,对量纲不敏感,无需归一化。
-
归一化不改变数据分布只是缩放数据,不会把非正态分布转为正态分布。
总结
数据归一化没有绝对的「最优解」,只有最适合数据场景的方法:
- 新手入门优先用Z-Score 标准化,适配绝大多数模型;
- 实际业务数据必选Robust 归一化,解决异常值痛点;
- 固定范围需求用Min-Max,稀疏数据用Max-Abs。
本文从原理到代码、从场景到避坑全覆盖,建议收藏备用!下次做数据预处理,直接对照选择即可。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)