行业资讯

归一化与标准化

发布时间:2026/8/19 17:08:36
归一化与标准化 数据的归一化和标准化是特征缩放(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​xmax​−xmin​x−xmin​​其中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​Xmax​−Xmin​2∗(X−Xmin​)​−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一般不需要标准化/归一化的模型决策树随机森林XGBoostLightGBM因为它们是基于规则分裂不关心数值大小只关心排序和分割点。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),*,copyTrue,clipFalse)参数含义为feature_range输出数据缩放到的区间。为元组类型范围某认为:[01]也可以取其他范围值。copy默认为True,表示对原数据组拷贝操作这样变换后元数组不变False表示变换操作后原数组也跟随变化。clip 默认为False表示如果测试数据超出训练集的 min/max输出会超过设定的feature_range如果为True,则强制把超出范围的值裁剪到feature_range的上下限。例如训练集范围 [0,100]测试集出现 120clipFalse 时输出 1clipTrue 强制截断为 1。StandardScaler的官方文档为https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html基本语法为sklearn.preprocessing.StandardScaler(*,copyTrue,with_meanTrue,with_stdTrue)参数含义为copy默认为True,表示对原数据组拷贝操作这样变换后元数组不变False表示变换操作后原数组也跟随变化。with_mean默认为True中心化减去每列均值输出每列均值变为 0。如果为则False不做中心化只除以标准差适合稀疏矩阵中心化会破坏稀疏性with_std默认为True,除以标准差 使每列方差 1。如果为False则只做中心化不缩放方差通常这两个函数与fit_transform()函数一起使用。fit(X)只学习数据统计信息均值、方差、最大最小值不改变原始数据StandardScaler计算每列均值 μ标准差 σMinMaxScaler计算每列 min、maxtransform(X)使用已经学到的统计量对数据做缩放转换fit_transform(X)fit transform一边学习参数一边转换数据注意使用中的易错坑测试集和训练集要分开进行标准化同时不要对测试集调用 fit_transform训练集需要独立未知如果训练集和测试集一起训练标准化的参数则会导致训练集的数据信息包括了测试集的信息例如均值标准差等信息从而导致模型效果在训练集上表现较好但这种表现较好是虚假的实际测试集的部分信息已经泄露给训练集了。这种情况称为数据泄露。对测试集直接调用transform也是为了保证训练集的标准化参数与测试集一致防止参数不一致导致模型效果虚高fit_transform不能直接处理 NaN缩放前必须先处理缺失值dropna /fillnafit_transform返回 ndarray不再是 DataFrame如果需要保留列名X_train_scaledpd.DataFrame(scaler.fit_transform(X_train),columnsX_train.columns,indexX_train.index)最后是实际代码的示例importpandasaspdfromsklearn.preprocessingimportStandardScaler,MinMaxScalerfromsklearn.model_selectionimporttrain_test_split# 模拟数据dfpd.DataFrame({horsepower:[100,150,220,80,95],weight:[2500,3200,3800,2100,2400]})Xdf[[horsepower,weight]]# 划分训练、测试X_train,X_testtrain_test_split(X,test_size0.2,random_state42)# 1. 标准化 StandardScaler均值0方差1scalerStandardScaler()# 训练集fit_transform学习参数转换X_train_scaledscaler.fit_transform(X_train)# 2. MinMaxScaler归一化缩放到 [0,1]# scaler MinMaxScaler()# X_train_scaled scaler.fit_transform(X_train)