1. 写在前面

最近做一个时空序列预测的一个问题,用到了数据归一化和标准化,之前一直想花点时间看一下这俩的区别究竟是啥? 现在参考了几篇博文,加上自己的一些理解,来具体的总结总结。

数据的归一化是无量纲化,也就是忽略掉特征之间值大小对最后结果带来的影响,而标准化是统一特征的数据分布,忽略掉不同分布的特征对最后结果带来的影响

首先给出sklearn中归一化和标准化的实现方法:

from sklearn.preprocessing import MinMaxScaler, StandardScaler# 归一化
minmax = MinMaxScaler()
x_new = minmax.fit_transform(x)#标准化
stand = StandardScaler()
x_new = stand.fit_transform(x)

有时候归一化也叫做normalization,千万不要让这个英语导致和标准化混了。

2. 概念剖析

2.1 归一化

  • 把数据变成0-1或者-1-1之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速

  • 把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。

    """归一化"""x' = (x - X_min) / (X_max - X_min)"""平均归一化"""x' = (x - μ) / (MaxValue - MinValue)# PS:上面两个公式的缺陷:当有新数据加入时,可能导致max和min的变化,需要重新定义。"""非线性归一化"""
    (1)对数函数转换:y = log10(x)
    (2)反余切函数转换:y = atan(x) * 2 / π# PS: 非线性归一化经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。
    #该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。
    

2.2 标准化

在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。

(1)Z-score规范化(标准差标准化 / 零均值标准化)
x' = (x - μ)/σ

中心化:平均值为0,对标准差无要求

x' = x - μ

归一化和标准化的区别:归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。

标准化和中心化的区别:标准化是原始分数减去平均数然后除以标准差,中心化是原始分数减去平均数。 所以一般流程为先中心化再标准化。

无量纲:我的理解就是通过某种方法能去掉实际过程中的单位,从而简化计算。

3. 理解

  1. 归一化特点:
    对不同特征维度的伸缩变换的目的是使各个特征维度对目标函数的影响权重是一致的,即使得那些扁平分布的数据伸缩变换成类圆形。这也就改变了原始数据的一个分布。
    好处:

    • 提高迭代求解的收敛速度
    • 提高迭代求解的精度
  2. 标准化特点:
    对不同特征维度的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。
    好处:

    • 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上
    • 不改变原始数据的分布
  3. 举个例子看一下:
    根据人的身高和体重预测人的健康指数
    假设有如下原始样本数据是四维的

    • 标准化

      从上面两个坐标图可以看出,样本在数据值上的分布差距是不一样的,但是其几何距离是一致的。而标准化就是一种对样本数据在不同维度上进行一个伸缩变化(而不改变数据的几何距离),也就是不改变原始数据的信息(分布)。这样的好处就是在进行特征提取时,忽略掉不同特征之间的一个度量,而保留样本在各个维度上的信息(分布)。

      标准化做的是,让每一个特征都服从标准正态分布,消除了每个特征分布不同从而导致结果不同的这个因素。

    • 归一化

      从采用大单位的身高和体重这两个特征来看,如果采用标准化,不改变样本在这两个维度上的分布,则左图还是会保持二维分布的一个扁平性;而采用归一化则会在不同维度上对数据进行不同的伸缩变化(归一区间,会改变数据的原始距离,分布,信息),使得其呈类圆形。虽然这样样本会失去原始的信息,但这防止了归一化前直接对原始数据进行梯度下降类似的优化算法时最终解被数值大的特征所主导。归一化之后,各个特征对目标函数的影响权重是一致的。这样的好处是在提高迭代求解的精度。

      归一化做的是,消除了不同特征之间的数值相差很大从而导致结果不同的因素(比如某一个特征的数都是很大的一些数,另一个特征的数都是很小的数,那么如果不归一化的话,可能那个特征大的那些,稍微发生改变,就会导致结果有很大的不同,所以为了消除数相差很大的影响,对数据进行归一化,让它们都变成0-1之间的数),但是这时候,数据会失去原始的一些信息。

但是要明确: 归一化和标准化的相同点都是对某个特征进行缩放而不是对某个样本的特征向量进行缩放。 对特征向量缩放是毫无意义的。 比如三列特征:身高、体重、血压。每一条样本(row)就是三个这样的值,对这个row无论是进行标准化还是归一化都是好笑的,因为你不能将身高、体重和血压混到一起去!

在线性代数中,将一个向量除以向量的长度,也被称为标准化,不过这里的标准化是将向量变为长度为1的单位向量,它和我们这里的标准化不是一回事儿,不能搞混(暗坑2)。

4. 为什么需要归一化/标准化

如前文所说,归一化/标准化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化/标准化的前提。比如有一个很重要的性质:线性变换不会改变原始数据的数值排序。

  1. 某些模型求解需要

    • 在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加 快梯度下降的求解速度,即提升模型的收敛速度。如左图所示,未归一化/标准化时形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。而如右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。
    1. 在机器学习算法的目标函数(例如 SVM 的 RBF 内核或线性模型的 L1 和 L2 正则化),许多学习算法中目标函数的基础都是假设所有的特征都是零均值并且具有同一阶数上的方差。如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器并不能像我们说期望的那样,从其他特征中学习。
    2. 一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

    经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

  2. 无量纲化
    例如房子数量和收入,因为从业务层知道,这两者的重要性一样,所以把它们全部归一化。 这是从业务层面上作的处理。

  3. 避免数值问题
    太大的数会引发数值问题。

5. 使用场景

首先明确,在机器学习中,标准化是更常用的手段,归一化的应用场景是有限的。原因有两点:

  1. 标准化更好保持了样本间距
    当样本中有异常点时,归一化有可能将正常的样本“挤”到一起去。比如三个样本,某个特征的值为1,2,10000,假设10000这个值是异常值,用归一化的方法后,正常的1,2就会被“挤”到一起去。如果不幸的是1和2的分类标签还是相反的,那么,当我们用梯度下降来做分类模型训练时,模型会需要更长的时间收敛,因为将样本分开需要更大的努力!而标准化在这方面就做得很好,至少它不会将样本“挤到一起”。
  2. 标准化更符合统计学假设
    对一个数值特征来说,很大可能它是服从正态分布的。标准化其实是基于这个隐含假设,只不过是略施小技,将这个正态分布调整为均值为0,方差为1的标准正态分布而已。

下面看下具体的使用场景:

  1. 如果对输出结果范围有要求,用归一化。
  2. 如果数据较为稳定,不存在极端的最大最小值,用归一化。
  3. 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免
    异常值和极端值的影响。

某知乎答主的回答提到了他个人经验:一般来说,我个人建议优先使用标准哈。对于输出有要求时再尝试别的方法,如归一化或者更加复杂的方法。很多方法都可以将输出范围调整到[0, 1],如果我们对于数据的分布有假设的话,更加有效的方法是使用相对应的概率密度函数来转换。让我们以高斯分布为例,我们可以首先计算高斯误差函数(Gaussian Error Function),此处定为er fc(·),那么可以用下式进行转化:

这篇博客提到他的经验:1) 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。2) 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。

6. 逻辑回归必须要进行标准化吗?

面试的时候,无论回答必须活着不必须,都是错的!!!

6.1 是否正则化

真正的答案是,这取决于我们的逻辑回归是不是用正则

  • 如果不用正则, 那么标准化不是必须的
  • 如果用正则,那么标准化是必须的

为什么呢?

因为不用正则时,我们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,我们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小。而参数值的大小程度或者说大小的级别是与特征的数值范围相关的。

举例来说,我们用体重预测身高,体重用kg衡量时,训练出的模型是:
身高=w∗体重身高=w*体重身高=w∗体重
www就是我们训练出来的参数。

在我们的体重用吨来衡量时,www的值就会扩大为原来的1000倍。在上面两种情况,都用L1正则的话,显然对模型的训练影响不同。

假如不同的特征数值范围不一样,有的是0到0.1,有的是100到10000,那么,每个特征对应的参数大小级别也会不一样,在 L1 正则时,我们是简单将参数的绝对值相加,因为它们的大小级别不一样,就会导致 L1 最后只会对那些级别比较大的参数有作用,那些小的参数都被忽略了。

6.2 标准化对LR的好处

如果你回答到这里,面试官应该基本满意了,但是他可能会进一步考察你,如果不用正则,那么标准化对逻辑回归有什么好处吗?

答案是有好处,进行标准化后,我们得出的参数值的大小可以反应出不同特征对样本label的贡献度,方便我们进行特征筛选。如果不做标准化,是不能这样来筛选特征的。

6.3 标准化的注意事项

答到这里,有些厉害的面试官可能会继续问,做标准化有什么注意事项吗?

最大的注意事项就是先拆分出test集,只在训练集上标准化,即均值和标准差是从训练集中计算出来的,不要在整个数据集上做标准化,因为那样会将test集的信息引入到训练集中,造成了数据信息泄露,这是一个非常容易犯的错误

7. 哪些模型需要标准化,哪些不需要?

7.1 需要标准化的模型

  1. 线性回归, LR, KMeans, KNN,SVM等一些涉及到距离相关的算法

    1. SVM
      不同的模型对特征的分布假设是不一样的。比如SVM 用高斯核的时候,所有维度共用一个方差,这不就假设特征分布是圆的么,输入椭圆的就坑了人家,所以简单的归一化都还不够好,来杯白化才有劲。比如用树的时候就是各个维度各算各的切分点,没所谓。
    2. KNN
      需要度量距离的模型,一般在特征值差距较大时,都会进行归一化/标准化。不然会出现“大数吃小数”。
  2. 神经网络

    1. 数值问题

      归一化/标准化可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题吧,但其实要引起也并不是那么困难。因为tansig(tanh)的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig( w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。
        假如你的输入是421,你也许认为,这并不是一个太大的数,但因为有效权值大概会在1/421左右,例如0.00243,那么,在matlab里输入 421·0.00243 == 0.421·2.43,会发现不相等,这就是一个数值问题。

    2. 求解需要

      a. 初始化:在初始化时我们希望每个神经元初始化成有效的状态,tansig函数在[-1.7, 1.7]范围内有较好的非线性,所以我们希望函数的输入和神经元的初始化都能在合理的范围内使得每个神经元在初始时是有效的。(如果权值初始化在[-1,1]且输入没有归一化且过大,会使得神经元饱和)
      b.梯度:以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2ew(1−a2)∗x2ew(1-a^2)*x2ew(1−a2)∗x的形式(eee是誤差,www是隐层到输出层的权重,aaa是隐层神经元的值,xxx是输入),若果输出层的数量级很大,会引起e的数量级很大,同理,www为了将隐层(数量级为1)映身到输出层,www也会很大,再加上xxx也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了。这时会给梯度的更新带来数值问题。
      c. 学习率:由(2)中,知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。 隐层到输出层的权值梯度可以写成 2ea2ea2ea,而输入层到隐层的权值梯度为 2ew(1−a2)x2ew(1-a^2)x2ew(1−a2)x ,受xxx 和 www 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1w1w1适合的学习率,可能相对于w2w2w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2w2w2的学习率,对w1w1w1来说又太大,搜索不到适合w1w1w1的解。如果使用固定学习率,而数据没归一化,则后果可想而知。
      d. 搜索轨迹已解释

  3. PCA等

  4. GBDT,Adaboost
    因为GBDT的树是在上一颗树的基础上通过梯度下降求解最优解,归一化能收敛的更快,GBDT通过减少bias来提高性能

一般算法如果本身受量纲影响较大,或者相关优化函数受量纲影响大,则需要进行特征归一化。树模型特征归一化可能会降低模型的准确率,但是能够使模型更加平稳

7.2 不需要标准化的模型

当然,也不是所有的模型都需要做归一的,比如模型算法里面没有关于对距离的衡量,没有关于对变量间标准差的衡量。比如 decision tree 决策树,他采用算法里面没有涉及到任何和距离等有关的,所以在做决策树模型时,通常是不需要将变量做标准化的。

概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。

对于树形结构为什么不需要归一化?

因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。
按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。

而且,树模型是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化。所以树模型(回归树)寻找最优点是通过寻找最优分裂点完成的

7.3 特殊说明

强调: 能不归一化最好不归一化,之所以进行数据归一化是因为各个维度的量纲不相同,而且需要看情况进行归一化。

有些模型在各维度进行了不均匀的伸缩之后,最优解与原来不等价(SVM)需要归一化。

有些模型伸缩与原来等价,如:LR则不用归一化,但是实际中往往通过迭代求解模型参数,如果目标函数太扁(想象一下很扁的高斯模型)迭代算法会发生不收敛的情况,所以最坏进行数据归一化。

补充:其实本质是由于loss函数不同造成的,SVM用了欧拉距离,如果一个特征很大就会把其他的维度dominated。而LR可以通过权重调整使得损失函数不变。

六、参考

  • 标准化和归一化什么区别? - 知乎:
  • R–数据标准化、归一化、中心化处理:
  • 特征工程中的[归一化]有什么作用? - 知乎:
  • 神经网络为什么要归一化:
  • 归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)
  • 数据标准化和归一化的异同
  • 标准化和归一化 超全详解

重温归一化(MinMaxScaler)和标准化(StandardScaler)相关推荐

  1. 归一化MinMaxScaler()、标准化StandardScaler()(特征工程之特征预处理)

    文章目录 一.什么是特征预处理? 二.特征预处理常用方法:归一化.标准化 1.标准化MinMaxScaler() 1.1 归一化举例 1.2 归一化使用局限 2.标准化StandardScaler() ...

  2. 吴裕雄 python 机器学习——数据预处理标准化StandardScaler模型

    from sklearn.preprocessing import StandardScaler#数据预处理标准化StandardScaler模型 def test_StandardScaler(): ...

  3. Scikit-learn 数据预处理之标准化StandardScaler

    Scikit-learn 数据预处理之标准化StandardScaler 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 St ...

  4. Scikit-learn 数据预处理之归一化MinMaxScaler

    Scikit-learn 数据预处理之归一化MinMaxScaler 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 MinM ...

  5. 数据归归一化方法(标准化)

    数据归一化方法 数据标准化(normalization)数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面. 数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用 ...

  6. numpy 归一化_归一化(MinMax)和标准化(Standard)的区别

    此文参考https://blog.csdn.net/u010947534/article/details/86632819 定义上的区别 归一化:将数据的值压缩到0到1之间,公式如下 标准化:将数据所 ...

  7. python 标准化/归一化与逆标准化/逆归一化

    标准化等公式和Python代码请参考: python 数据归一化/标准化方法与代码(离差标准化,log归一化,标准化,比例归一化,反正切归一化) 我们使用sklearn来操作: 首先准备数据: imp ...

  8. 数据归一化 - MinMaxScaler()/MaxAbsScaler() - Python代码

    目录 归一化 数据归一化的背景介绍 MinMaxScaler:归一到 [ 0,1 ] MaxAbsScaler:归一到 [ -1,1 ] 标准化 去均值,方差规模化 归一化 数据归一化的背景介绍 在之 ...

  9. scale缩放中心_规范化(包含归一化)、标准化、中心化、BN、正则化的区别

    自己记录一下比较琐碎的东西,顺便为正在思考类似问题的同学提供份参考,如有错误欢迎指正. 注:有些参考链接中的叙述有我认为不太准确的地方,本文是把各参考链接中我认为正确的部分做了汇总. 标准化(stan ...

最新文章

  1. 修改模拟器的IMEI号
  2. python定义类()中写object和不写的区别
  3. 经典PID控制算法用C语言实现!
  4. [YTU]_2441( C++习题 复数类--重载运算符2+)
  5. The true love
  6. leetcode18. 四数之和(双指针)
  7. java 怎么链接ndk的库_使用ndk-build链接现有的静态库
  8. js 禁止android手机返回键,js禁止浏览器,微信,及手机物理键的返回
  9. 循环增加li id_循环老化对于锂离子电池中锂和电解液分布的影响
  10. jQuery 中的 attr
  11. 从零开始开发HybridApp
  12. 数据挖掘技术基本任务
  13. Matlab 中三角函数
  14. maven命令指定配置文件
  15. python画circos图_CIRCOS圈图绘制 – 最简单绘图和解释
  16. 第四章 sysrepo共享内存机制
  17. Matplotlib绘制3D图(面向对象)
  18. android使用webview
  19. amt是什么意思_变速箱中的at、mt和amt是什么意思啊?
  20. 如何在 React Component 之外获取 Redux Store

热门文章

  1. Fuzzy set基本介绍(1)
  2. 计算机ms高级应用科目一 科目二考什么,科目一、科目二、科目三、科目四都考什么?全都在这儿了!...
  3. TWaver HTML5 高性能拓扑
  4. 求数组内子数组最大的和(Maximum Subarray )
  5. 289.南信大知网登录
  6. 北京交通大学c语言作业,北京交通大学c语言综合程序设计(黄宇班).doc
  7. 优效时钟屏保-一款极简风格的时钟屏保
  8. 智能手机中MEMS传感器应用浅析
  9. 语音转换成文本 技术实现_职业转换者指南,帮助您实现梦想的技术工作
  10. SpringBoot+Vue下载文件Excel、PDF下载后打不开