news 2026/8/19 17:08:32

归一化与标准化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
归一化与标准化

数据的归一化和标准化是特征缩放(feature scaling)的方法,是数据预处理的关键步骤。不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据归一化/标准化处理,以解决数据指标之间的可比性。

举个例子,我们判断一个人的幸福程度,判断的依据有年龄,房子数量,收入等。这几个指标中年龄是十位数,房子数量是个位数,而收入一般是千到万的量级。如果不进行归一化,则收入对于结果的影响和其他指标影响的程度会有明显的区别。

同时数据的归一化也有利于提高梯度下降的速度

归一化(Normalization)

归一化一般是将数据映射到指定的范围,用于去除不同维度数据的量纲以及量纲单位。

最常见的归一化方法就是将数据映射到[0, 1],具体转换函数为:
x n e w = x − x m i n x m a x − x m i n x_{new}=\frac{x-x_{min}}{x_{max}-x_{min}}xnew=xmaxxminxxmin
其中x m a x x_{max}xmax为样本数据的最大值,x m i n x_{min}xmin为样本数据的最小值。将所有样本数据代入x xx即可得到转换后的新值

这种归一化方法比较适用在数值比较集中的数据集中,如果有比较极端的离群值出现,则会造成数据转换结果失效。例如数据中有一个值为3千万,其他值都在0-100内,则转换后的数据3千万会被转换为1,其他数据都为0,

同时也可以将数据映射到 [-1, 1] 的区间,具体公式为:
X n e w = 2 ∗ ( X − X m i n ) X m a x − X m i n − 1 X_{new} = \frac{2*(X - X_{min})}{X_{max} - X_{min}} - 1Xnew=XmaxXmin2(XXmin)1

标准化(Normalization)

归一化和标准化的英文翻译是一致的,但是根据其用途(或公式)的不同去理解(或翻译)
标准化中最常用的是Z-Score 标准化。

Z-Score 标准化的转换函数一般为:
x n e w = x − μ σ x_{new}=\frac{x-\mu }{\sigma }xnew=σxμ
其中μ \muμ是数据的均值,σ \sigmaσ为数据的标准差

Z-Score 标准化将数据变换为均值为0,标准差为1的分布。如果原始数据是正态的,这个转化函数其实就是统计中的标准正态转换函数,可以将数据转化为标准正态分布

需要做标准化/归一化的模型有:

  • SVM
  • 逻辑回归
  • 线性回归
  • KNN
  • 神经网络
  • 聚类(K-Means)

一般不需要标准化/归一化的模型:

  • 决策树
  • 随机森林
  • XGBoost
  • LightGBM

因为它们是基于规则分裂,不关心数值大小,只关心排序和分割点。

Python实践

在Python中实现归一化与标准化可以根据定义公式计算,也可以直接使用sklearn中封装好的函数,这里主要介绍sklearn.preprocessing中的MinMaxScaler(归一化)、StandardScaler(标准化)函数。

MinMaxScaler官方文档为https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html,函数语法为:

sklearn.preprocessing.MinMaxScaler(feature_range=(0,1),*,copy=True,clip=False)

参数含义为:

  • feature_range:输出数据缩放到的区间。为元组类型,范围某认为:[0,1],也可以取其他范围值。
  • copy:默认为True,表示对原数据组拷贝操作,这样变换后元数组不变,False表示变换操作后,原数组也跟随变化。
  • clip: 默认为False,表示如果测试数据超出训练集的 min/max,输出会超过设定的feature_range,如果为True,则强制把超出范围的值裁剪到feature_range的上下限。例如训练集范围 [0,100],测试集出现 120;clip=False 时输出 > 1;clip=True 强制截断为 1。

StandardScaler的官方文档为:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html,基本语法为:

sklearn.preprocessing.StandardScaler(*,copy=True,with_mean=True,with_std=True)

参数含义为:

  • copy:默认为True,表示对原数据组拷贝操作,这样变换后元数组不变,False表示变换操作后,原数组也跟随变化。
  • with_mean:默认为True,中心化,减去每列均值,输出每列均值变为 0。如果为则False不做中心化,只除以标准差;适合稀疏矩阵,中心化会破坏稀疏性
  • with_std:默认为True,除以标准差 ,使每列方差 = 1。如果为False则只做中心化,不缩放方差

通常这两个函数与fit_transform()函数一起使用。

  • fit(X):只学习数据统计信息(均值、方差、最大最小值),不改变原始数据
    • StandardScaler:计算每列均值 μ,标准差 σ
    • MinMaxScaler:计算每列 min、max
  • transform(X):使用已经学到的统计量,对数据做缩放转换
  • fit_transform(X):fit + transform,一边学习参数,一边转换数据

注意使用中的易错坑:

  1. 测试集和训练集要分开进行标准化,同时不要对测试集调用 fit_transform
    训练集需要独立未知,如果训练集和测试集一起训练标准化的参数则会导致训练集的数据信息包括了测试集的信息(例如均值,标准差等信息),从而导致模型效果在训练集上表现较好,但这种表现较好是虚假的,实际测试集的部分信息已经泄露给训练集了。这种情况称为数据泄露。
    对测试集直接调用transform也是为了保证训练集的标准化参数与测试集一致,防止参数不一致导致模型效果虚高
  2. fit_transform不能直接处理 NaN,缩放前必须先处理缺失值(dropna /fillna)
  3. fit_transform返回 ndarray,不再是 DataFrame,如果需要保留列名:
X_train_scaled=pd.DataFrame(scaler.fit_transform(X_train),columns=X_train.columns,index=X_train.index)

最后是实际代码的示例:

importpandasaspdfromsklearn.preprocessingimportStandardScaler,MinMaxScalerfromsklearn.model_selectionimporttrain_test_split# 模拟数据df=pd.DataFrame({'horsepower':[100,150,220,80,95],'weight':[2500,3200,3800,2100,2400]})X=df[['horsepower','weight']]# 划分训练、测试X_train,X_test=train_test_split(X,test_size=0.2,random_state=42)# 1. 标准化 StandardScaler:均值0,方差1scaler=StandardScaler()# 训练集:fit_transform,学习参数+转换X_train_scaled=scaler.fit_transform(X_train)# 2. MinMaxScaler归一化:缩放到 [0,1]# scaler = MinMaxScaler()# X_train_scaled = scaler.fit_transform(X_train)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 17:02:32

基于Spring Boot的教学资源共享网站的设计与实现源码+文档

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/8/19 16:55:35

基于SpringBoot的教学管理信息系统(源码+lw+部署文档+讲解等)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

作者头像 李华