1. 标准化,归一化的区别

作者:宝珠道人
链接:https://www.zhihu.com/question/361290840/answer/939504181
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。个人有删改

归一化和标准化本质上都是一种线性变换。线性变换保持线性组合与线性关系式不变,这保证了特定模型不会失效。归一化和标准化的区别:
归一化和标准化的本质都是缩放和平移,他们的区别直观的说就是

  1. 归一化的缩放是 “拍扁” 统一到区间 [ 0 , 1 ] [0,1] [0,1]。常见的归一化方法:
    ( x i − m i n ( x i ) ) / ( m a x ( x i ) − m i n ( x i ) ) (xi-min(xi))/(max(xi)-min(xi)) (ximin(xi))/(max(xi)min(xi))
    从输出范围角度来看, 归一化的输出结果必须在 [ 0 , 1 ] [0,1] [0,1]间。
  2. 标准化的缩放是更加 “弹性” 和 “动态” 的,和整体样本的分布有很大的关系。
    常见的标准化方法:
    ( x i − m e a n ( x i ) ) / s d ( x i ) (xi-mean(xi))/sd(xi) (ximean(xi))/sd(xi)
    而标准化的输出范围不受限制,通常情况下比归一化更广

标准化与归一化的应用场景:
一般情况下:

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

在机器学习中,标准化是更常用的手段,归一化的应用场景是有限的。其原因就在于二者的区别:

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

数据预处理的归一化手段应该如何应用到训练集,测试集和验证集中?

问题:

  1. 假如先把数据划分成训练集和测试集,我在训练集上对所有变量归一化后,比如用均值方差归一化,那我在测试集上归一化的时候用的均值方差都是训练集中的还是在测试集上用自身的均值方差

  2. 是归一化手段有很多,均值方差归一化,最大最小归一化,那我怎么去区分这些归一化手段的不同,就是什么时候用均值方差归一化什么时候用最大最小归一化,这些不同的归一化手段会对我的结果产生影响吗?如果有影响我又该如何去针对数据选择合适的归一化手段

回答1:

  1. 第一个问题,测试集的归一化的均值和标准偏差应该来源于训练集。如果你熟悉Python的sklearn的话,你就应该知道应该先对训练集数据fit,得到包含均值和标准偏差的scaler,然后再分别对训练集和验证集transform。这个问题其实很好,很多人不注意,最容易犯的错误就是先归一化,再划分训练测试集。
  2. 第二个问题,是均值方差归一化,最大最小归一化等不同归一化的选择问题。归一化的目的无非调整各个字段之间的数量级差异。均值方差归一化可能更适合你不知道数据的边界在哪里,最大最小归一化相当于整合到01之间,这相当于你是知道这个字段的边界在哪里。所以我个人更倾向于均值方差归一化。这个问题我只是经验之谈,不一定对。

作者:StefanChou
链接:https://www.zhihu.com/question/60490799/answer/214685372
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 补充问题:为什么先归一化,再划分训练测试集是错误的呢?
    回答:谈不上绝对的错误。特别是当你手头已经有一份训练和测试数据。在真正的部署过程中,测试数据实际上就是那些源源不断刚刚出现的数据,你不知道它什么分布,也不知道它出现什么样的数值。所以你要用训练数据得到的均值和标准偏差,去转换它。这更加贴近部署的实际。
    严格来说,测试数据你是不能去看它的,不能去统计它的各项指标,这种苛刻的自我限定,就好像测试数据真的是来自未来。当然有时候你离线建模,划分测试数据,实际上叫验证数据,主要目的是为了迭代优化算法超参数,你可以严格自我要求,也可以活个稀泥。当训练和测试数据差别不大时,先归一化还是先划分,差别实际不大。

回答2

作者:代码律动
链接:https://www.zhihu.com/question/60490799/answer/388715802
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. 第一个问题,你的算法不应该知道关于任何测试集的信息,所以测试集的方差与均值都应该来自训练集的先验数据。当然,这也需要你的数据集划分足够合理,使你在训练集上训练出来的模型有足够的泛化能力(当然模型的设计更关键)。再引申一句,你提到了验证集,验证集的归一化也要和训练集一样【个人补充:就是使用训练集得到的数】,在调整参数的时候,我们面对的是验证集的结果。在验证集上得到最佳的参数设置,最终在测试集上进行实验。
  2. 第二个问题,这是要根据你的具体实验来调整,大致选择方法和思路是这样的:
  • Zero-mean normalization
    公式: x = x − x ˉ σ x=\frac{x-\bar{x}}{\sigma} x=σxxˉ
    这就是均值方差归一化,这样处理后的数据将符合标准正态分布,常用在一些通过距离得出相似度的聚类算法中,比如 K-means。
  • Min-max normalization
    公式: x = x − x m i n x m a x − x m i n x=\frac{x-x_{min}}{x_{max}-x_{min}} x=xmaxxminxxmin
    min-max 归一化的手段是一种线性的归一化方法,它的特点是不会对数据分布产生影响。不过如果你的数据的最大最小值不是稳定的话,你的结果可能因此变得不稳定。min-max 归一化在图像处理上非常常用,因为大部分的像素值范围是 [0, 255]。
  • Non-linear normaliztions
    非线性的归一化函数包含 log,exp,arctan, sigmoid等等。用非线性归一化的函数取决于你的输入数据范围以及你期望的输出范围。比如 log() 函数在 [ 0 , 1 ] [0,1] [0,1]区间上有很强的区分度,arctan() 可以接收任意实数病转化到 [ − π 2 , π 2 ] [-\frac{\pi}{2},\frac{\pi}{2}] [2π,2π]区间,sigmoid 接收任意实数并映射到 ( 0 , 1 ) (0,1) (0,1)
  • Length-one normalization
    公式: x = x ∥ x ∥ x=\frac{x}{\left\|x\right\|} x=xx
    将特征转为单位向量的形式,可以剔除特征的强度的影响。这种处理用在不考虑向量大小而需要考虑向量方向的问题中,比如在一些文本情感的分类中,我们可能并不需要知道情感表达的强弱,而只要知道情感的类型,比如开心,生气等等。

问题3

机器学习中,对于数据的预处理是否是测试集和训练集一起进行?

回答1

作者:Jon Lee
链接:https://www.zhihu.com/question/312639136/answer/601839910
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个问题有两点:1. training data和test data是否应该使用相同的预处理2. 归一化时,是否应该将training data和test data混合计算(如均值,方差,主成分,等)第一点的回答是肯定的,第二点是否定的。抛开domain adaptation不讲,一般的机器学习算法是建立在training和test data服从同一/类似分布的假设之上的。所以有一条准则:预处理对于training和test data要保持一致。如果预处理不同,那怎么还能保证training和test data分布一致?在machine learning中,test data原则上是与training data独立的数据集。它的目的是验证在training data上训练好的模型是否在完全独立的,未知的数据集上有相同的表现。做归一化时,如果将test data和training data混合一起计算了,那么归一化之后的training data就相包含了test data的信息。这样就打破了test data应该与training data独立的原则,实属作弊:哪怕得到的结果较好,也不能证明在未来某天新采集的数据上会有相同的表现。再者,你现在手里有一定数量的test data,你拿去跟training data一起计算做归一化了。但在真正的工业应用中,你的test data可能是在你模型部署之后一个个采集的:有可能今天来10个,明天来6个,后天来1个。这种情况下如果将training和test data一起用来计算做归一化,那岂不是每天采集一次数据都要计算一次,再重新训练?综合以上两点,在做归一化时,普遍的做法是只用training data计算数据如均值,方差,主成分,等,然后用保存好的计算数据对test data进行归一化。

回答2

正确的处理流程是:
1、将清洗完的数据先进行样本内外拆分,将样本内数据再次进行训练集和测试集的拆分
2、对训练集进行特征工程,特征数据预处理->特征选择->生成训练集
3、使用训练集进行训练,固化模型
4、用测试集数据按照已固化的标准,先进行特征工程处理,之后带入模型进行测试
5、用样本外数据集,按照固化模型,单独生成特征数据集,进行数据预处理,带入模型看结果。以上就是我常用的流程。

作者:疯猫子
链接:https://www.zhihu.com/question/312639136/answer/601925011
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


问题4

交叉验证法中的数据预处理如何去做?

回答1

严格来说,如果需要标准化,每一折都需要对train fit,对test transform。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐