在机器学习、深度学习的数据预处理中,数据归一化是绕不开的关键步骤。不同特征往往量纲不同(比如年龄 18-60、收入 1000-100000),直接训练模型会导致:

  • 梯度下降收敛慢、难以最优解
  • 距离类算法(KNN、K-Means、SVM)精度暴跌
  • 神经网络权重更新失衡

本文整理Python 中最常用的 4 种数据归一化 / 标准化方法,从原理、适用场景、代码实现、优缺点全方位对比,新手也能直接套用!

一、核心概念区分:归一化 vs 标准化

先理清两个易混淆的概念,避免用错方法:

  1. 归一化(Normalization):将数据压缩到 **[0,1][-1,1]** 区间,消除量纲影响;
  2. 标准化(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​−Xmin​X−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

四、关键结论:怎么选?(新手直接抄作业)

  1. 数据无异常值、需要固定范围 → 选 Min-Max 归一化
  2. 数据是稀疏矩阵、包含正负值 → 选 Max-Abs 归一化
  3. 通用机器学习、数据正态分布 → 选 Z-Score 标准化(默认首选)
  4. 数据有异常值、实际业务数据 → 选 Robust 鲁棒归一化

五、避坑指南(工程必备)

  1. 先拆分训练集 / 测试集,再归一化绝对不能用测试集的极值 / 均值做归一化,会导致数据泄露,模型上线必崩!

    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)        # 测试集直接用训练集的参数
    
  2. 树模型不需要归一化决策树、随机森林、XGBoost 等基于规则的模型,对量纲不敏感,无需归一化。

  3. 归一化不改变数据分布只是缩放数据,不会把非正态分布转为正态分布。


总结

数据归一化没有绝对的「最优解」,只有最适合数据场景的方法:

  • 新手入门优先用Z-Score 标准化,适配绝大多数模型;
  • 实际业务数据必选Robust 归一化,解决异常值痛点;
  • 固定范围需求用Min-Max,稀疏数据用Max-Abs

本文从原理到代码、从场景到避坑全覆盖,建议收藏备用!下次做数据预处理,直接对照选择即可。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐