真的明白数据归一化(MinMaxScaler)和数据标准化(StandardScaler)吗?

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

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

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

from sklearn.preprocessing import MinMaxScaler, StandardScaler

# 归一化
minmax = MinMaxScaler()
x_new = minmax.fit_transform(x)

#标准化
stand = StandardScaler()
x_new = stand.fit_transform(x)

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

一、概念

  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)等。
  1. 标准化:
  • 在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。
(1)Z-score规范化(标准差标准化 / 零均值标准化)
         x' = (x - μ)/σ
  1. 中心化:平均值为0,对标准差无要求
		x' = x - μ

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

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

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

二、理解

  1. 归一化特点:
    对不同特征维度的伸缩变换的目的是使各个特征维度对目标函数的影响权重是一致的,即使得那些扁平分布的数据伸缩变换成类圆形。这也就改变了原始数据的一个分布。
    好处:
  • 提高迭代求解的收敛速度
  • 提高迭代求解的精度
  1. 标准化特点:
    对不同特征维度的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。
    好处:
  • 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上
  • 不改变原始数据的分布
  1. 举个例子看一下:
    根据人的身高和体重预测人的健康指数
    假设有如下原始样本数据是四维的
  • 标准化

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

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

  • 归一化

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

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

三、为什么需要归一化/标准化

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

  1. 某些模型求解需要
  • 在使用梯度下降的方法求解最优化问题时, 归一化/标准化后可以加 快梯度下降的求解速度,即提升模型的收敛速度。如左图所示,未归一化/标准化时形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。而如右图对两个特征进行了归一化,对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。
  • 一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
  1. 无量纲化
    例如房子数量和收入,因为从业务层知道,这两者的重要性一样,所以把它们全部归一化。 这是从业务层面上作的处理。
  2. 避免数值问题
    太大的数会引发数值问题。

四、使用场景

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

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

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

五、哪些模型必须归一化/标准化

  1. SVM
    不同的模型对特征的分布假设是不一样的。比如SVM 用高斯核的时候,所有维度共用一个方差,这不就假设特征分布是圆的么,输入椭圆的就坑了人家,所以简单的归一化都还不够好,来杯白化才有劲。比如用树的时候就是各个维度各算各的切分点,没所谓。
  2. KNN
    需要度量距离的模型,一般在特征值差距较大时,都会进行归一化/标准化。不然会出现“大数吃小数”。
  3. 神经网络
    (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-a^2)*x的形式(e是誤差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入),若果输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了。这时会给梯度的更新带来数值问题。
c. 学习率:由(2)中,知道梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。 隐层到输出层的权值梯度可以写成 2ea,而输入层到隐层的权值梯度为 2ew(1-a^2)x ,受 x 和 w 的影响,各个梯度的数量级不相同,因此,它们需要的学习率数量级也就不相同。对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,会消耗非常多的时间,而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。如果使用固定学习率,而数据没归一化,则后果可想而知。
**搜索轨迹:**已解释

  1. PCA

六、参考

发布了66 篇原创文章 · 获赞 67 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wuzhongqiang/article/details/103764412
今日推荐