在面试时经常会问到特征归一化相关问题,这里就归一化相关的问题进行整理回答。主要是三个问题:
- 归一化的方法有哪些?
- 归一化方法中的线性归一化和Z-score标准化的异同点?
- 为什么要做归一化?
- 哪些算法需要做归一化,为什么?
1、归一化方法有哪些
归一化主要针对数值型特征,是一种把有量纲表达式变成无量纲表达式的方式,能够简化计算。主要有最大最小标准化、Z-score标准化和非线性归一化。
1.1线性归一化/最大最小标准化(Min-Max Normalization))
线性归一化就是将训练集中某一列数值特征的值缩放到0和1之间。这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,对异常值(极值)比较敏感。如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。
广义的讲,可以是各种区间,比如映射到[0,1]一样可以继续映射到其他范围,图像中可能会映射到[0,255],其他情况可能映射到[-1,1](均值归一化)
应用场景:在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用此方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。
1.2 标准差标准化/Z-score标准化方法/Standardization
经过处理的数据符合标准正态分布,即均值为0,标准差为1,(切记,并非一定是正态的,标准化不能改变分布类型。)其转化函数为:
其中为所有样本数据的均值,
为所有样本数据的标准差。在机器学习中,标准化就是将训练集中某一列数值特征的值缩放成均值为0,方差为1的状态。标准化和整体样本分布相关,每个样本点都能对标准化产生影响。
应用场景:在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,Z-score standardization表现更好。
1.3 非线性归一化
经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V,2)还是log(V, 10)等。
还有一种常用的数据变换方法:BOX-COX。BOX-COX变换主要是降低数据的偏度,通常回归模型残差非正态或异方差的时候,会选择对y做boxcox变换,降低y的偏度,让y更接近正态。经过变换之后,可以在一定程度上减小残差和预测变量的相关性。
除了上面三种之外,还有一种处理叫做中心化,也叫零均值处理,就是将每个原始数据减去这些数据的均值。
面试题1:归一化的对象是什么?某个特征还是某个样本的特征向量?
答:是对某个特征(column)进行缩放(scaling)而不是对某个样本的特征向量(row)进行缩放。对特征向量进行缩放是毫无意义的,比如三列特征:身高、体重、血压。每一条样本(row)就是三个这样的值,对这个row无论是进行标准化还是归一化都是好笑的,因为你不能将身高、体重和血压混到一起去!面试2:线性代数中的向量标准化与机器学习中标准化的区别?
在线性代数中,将一个向量除以向量的长度,也被称为标准化,不过这里的标准化是将向量变为长度为1的单位向量。与机器学习中的标准化是不一样的。误区:标准化是改变数据分布,将其变换为服从N(0,1)的标准正态分布 这句话是有前提的,即假设数据是服从正态分布(高斯分布)的,所以说标准化处理是将数据的非标准正态分布变成标准正态分布的。会改变数据的均值、标准差都变了(当然,严格的说,均值和标准差变了,分布也是变了,但分布种类依然没变,原来是啥类型,现在就是啥类型),但本质上的分布并不一定是标准正态,完全取决于原始数据是什么分布。我个举例子,我生成了100万个服从beta(0.5,0.5)的样本点(你可以替换成任意非正态分布,比如卡方等等,beta(1,1)是一个服从U(0,1)的均匀分布,所以我选beta(0.5,0.5)),称这个原始数据为,分布如下图所示:
通过计算机计算,样本
的均值和方差分别为0.49982和0.12497(约为0.5和0.125)对这个数据做标准化,称这个标准化后的数据为
,分布如下:
可以看到数据形态完全不是正态分布,但是数学期望和方差已经变了。beta分布的数学期望为
方差为
所以
这也和我们上文所计算的样本均值和方差一致, 而
的均值和方差分别为: -1.184190523417783e-1和1,均值和方差已经不再是 0.5和0.125,分布改变,但绝不是一个正态分布,可以通过qq图和检验,得到的結果如下:
KS检验如下,拒绝正态性原假设。
当然,如果你原始数据就是正态的,那么做了标准化,生成的就是标准正态分布。之所以大家会把标准化和正态分布联系起来,是因为实际数据中大部分都是正态分布,起码近似正态。
标准化不能改变分布类型,其他分布能过渡到正态分布只有中心极限定理,别的一些标准化变换只是改变原分布的尺度和位置。标准化的意义在于将分布做一个变化(多为线性变化,如一阶矩),
使数据处于一个更好分析的状态,而不能改变数据本身的分布形式。
2、归一化和标准化的异同点?
归一化 (normalization) :
标准化 (standardization) :
其中 和
代表样木的均值和标准差,
为最大值,
2.1. 归一化和标准化本质上都是一种线性变换
先看归一化,在数据给定的前提下, 令常数 常数
那么归一化的新的形式就是
。在这种改写下, 易发现和标准化形式
类似, 为在数据给定后
和
因此可以再稍微变形一下:
就发现事实上就是对向量 X 按照比例压缩 再进行平移
总的来说归一化和标准化本质上都是对数据的线性变换,都是对向量X按照比例压缩再进行平移,并且不会改变原始数据排列顺序的线性变换;都能取消由于量纲不同引起的误差。
2.2 归一化和标准化的区别
我们已经说明了它们的本质是縮放和平移,但区别是什么呢?在不涉及线性代数的前提下,我们给出一些直觉的解释:归一化的缩放是“拍扁”统一到区间 (仅由极值决定),而标准化的缩放是更加“弹性"和“动态" 的,和整体样本的分布有很大的关系。
第一点:和数据相关程度
- 归一化:缩放仅仅与最大、最小值的差别有关。
- 标准化:缩放和每个点都有关系,通过方差(variance)体现出来。与归一化对比, 标准化中所有数据点都有贡献(通过均值和标准差造成影响)。
当数据较为集中时,于是数据在标准化后就会更加分散。如果数据本身分布很广,那么α较大, 数据就会被集中到更小的范围内。
第二点:输出范围
- 归一化:输出范围在0-1之间
- 标准化:输出范围是负无穷到正无穷
2.3 归一化和标准化的使用技巧/场景
- 归一化:对输出结果范围有要求;不涉及距离度量、协方差计算时
- 标准化:数据不为稳定,存在极端的最大最小值;在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维时;数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响
有异常值时用标准化的通俗解释:标准化更好保持了样本间距。当样本中有异常点时,归一化有可能将正常的样本“挤”到一起去。比如三个样本,某个特征的值为1,2,10000,假设10000这个值是异常值,用归一化的方法后,正常的1,2就会被“挤”到一起去。如果不幸的是1和2的分类标签还是相反的,那么,当我们用梯度下降来做分类模型训练时,模型会需要更长的时间收敛,因为将样本分开需要更大的努力!而标准化在这方面就做得很好,至少它不会将样本“挤到一起”。一般来说,我个人建议优先使用标准化。
3、为什么要做归一化
3.1 归一化后加快了梯度下降求最优解的速度,可较快收敛
如下图所示,蓝色的圈圈图代表的是损失函数的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;
而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。
因此如果机器学习模型使用梯度下降法求最优解时,如果变量间的量纲相差很多时,归一化往往非常有必要,否则很难收敛甚至不能收敛。
3.2 归一化有可能提高精度
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。不同维度量纲不同可能会导致距离的计算依赖于量纲较大的那些特征而得到不合理的结果,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
3.3 回归系数的可解释性
统计建模中,如回归模型,自变量X的量纲不一致导致了回归系数无法直接解读或者错误解读;需要将X都处理到统一量纲下,这样才可比;并且此时系数的大小可以用来比较不同因素的影响程度。
4、 哪些算法必须要做归一化
- 需要归一化:需要使用梯度下降和计算距离的模型要做归一化,因为不做归一化会使收敛的路径程z字型下降,导致收敛路径太慢,而且不容易找到最优解,归一化之后加快了梯度下降求最优解的速度,并有可能提高精度。比如说线性回归、逻辑回归、adaboost、SVM、Neural Network、KNN、KMeans等最优化问题。一般算法如果本身(计算距离)受量纲影响较大,或者相关优化函数受量纲影响大,则需要进行特征归一化。
- 不需要归一化:概率模型、树形结构模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、随机森林。注意:xgboost 和gbdt不需要归一化
概率模型:概率模型不需要归一化,因为他们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、RF。
决策树:因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。不需要考虑特征的值,只需要考虑划分界限,比如ID3 C4.5 CART 的熵和基尼系数,研究对象只是概率分布,对数值不关心。而且,树模型是不能进行梯度下降的,因为构建树模型(回归树)寻找最优点时是通过寻找最优分裂点完成的,因此树模型是阶跃的,阶跃点是不可导的,并且求导没意义,也就不需要归一化。(决策树对变量的量纲差异、离群值的存在以及有偏分布不太敏感,也就是对数据准备要求不高。)另外,树模型不需要对离散特征进行事先one-hot处理,否则会使特征维度增大且稀疏,不仅会增加模型的计算量,而且会损失数据的信息量造成模型的效果不佳,以及过拟合的风险。
xgboost :xgboost 和gbdt是基于树的算法,只对排序敏感,无需归一化。实际上xgboost确实用到了gradient decent,但不是对feature的值做梯度下降,而是对loss function做梯度下降。既然不是直接对feature数值进行梯度下降,我们自然也没有必要对其进行归一化。
聚类:在聚类过程中,标准化显得尤为重要。这是因为聚类操作依赖于对类间距离和类内聚类之间的衡量。如果一个变量的衡量标准高于其他变量,那么我们使用的任何衡量标准都将受到该变量的过度影响。
PCA:在PCA降维操作之前。在主成分PCA分析之前,对变量进行标准化至关重要。这是因为PCA给那些方差较高的变量比那些方差非常小的变量赋予更多的权重。而标准化原始数据会产生相同的方差,因此高权重不会分配给具有较高方差的变量。因此当数据各个属性的单位不同时候,使用PCA是需要去量纲的,而且去量纲的方法应该选用z-score标准化。(PCA是通过方差大小判断是不是主成分,是根据变换后的新数据集方差大小判断的)
KNN:原因类似于kmeans聚类。由于KNN需要用欧式距离去度量。标准化会让变量之间起着相同的作用。在K近邻算法中,如果不对解释变量进行标准化,那么具有小数量级的解释变量的影响就会微乎其微,会出现“大数吃小数”。
SVM:使用所有跟距离计算相关的的kernel都需要对数据进行标准化。
岭回归和Lasso:标准化是必须的。原因是正则化是有偏估计,会对权重进行惩罚。在量纲不同的情况,正则化会带来更大的偏差。
神经网络:需要标准化处理,一般变量的取值在-1到1之间,这样做是为了弱化某些变量的值较大而对模型产生影响。BP需要标准化更详细的原因,可参考:神经网络为什么要归一化
普通的线性回归:本身不受量纲影响,也是无需标准化的。因为标准化前后,不会影响线性回归预测值。但是,当特征量纲较大时建议进行标准化。因为,在更新特征的权重时使用梯度下降法,需要不断计算误差函数的梯度。当不进行特征归一化时,当某个特征的量纲较大,导致该特征的权重稍一更新,预测结果就波动较大,使得模型较难收敛。当归一化到同一个量纲上时,模型会持续向误差较小的方向收敛,会加快模型的收敛速度。
逻辑回归:本身不受量纲影响,是否标准化都是可以的。但是从算法求解效率角度而言,是需要的。因为逻辑回归使用梯度下降法求解参数受量纲影响大,如果不进行特征归一化,可能由于变量不同量纲导致参数迭代求解缓慢,影响算法速率。
面试3:那么,逻辑回归必须要进行标准化吗?
通过之前的解释可知,逻辑回归标准化与否均可。那么,什么时候一定需要标准化呢?这取决于我们的逻辑回归是不是用正则。如果你不用正则,那么,标准化并不是必须的,如果你用正则,那么标准化是必须的。为什么呢?
因为不用正则时,我们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,我们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小。而参数值的大小程度或者说大小的级别是与特征的数值范围相关的。举例来说,我们用体重预测身高,体重用kg衡量时,训练出的模型是:身高 = 体重*x。x就是我们训练出来的参数。当我们的体重用吨来衡量时,x的值就会扩大为原来的1000倍。在上面两种情况下,都用L1正则的话,显然对模型的训练影响是不同的。
假如不同的特征的数值范围不一样,有的是0到0.1,有的是100到10000,那么,每个特征对应的参数大小级别也会不一样,在L1正则时,我们是简单将参数的绝对值相加,因为它们的大小级别不一样,就会导致L1最后只会对那些级别比较大的参数有作用,那些小的参数都被忽略了。如果你回答到这里,面试官应该基本满意了,但是他可能会进一步考察你,如果不用正则,那么标准化对逻辑回归有什么好处吗?
答案是有好处,进行标准化后,我们得出的参数值的大小可以反应出不同特征对样本label的贡献度,方便我们进行特征筛选。如果不做标准化,是不能这样来筛选特征的。除此之外,还可以加快训练时模型的收敛速度。答到这里,有些厉害的面试官可能会继续问,做标准化有什么注意事项吗?
最大的注意事项就是先拆分出test集,不要在整个数据集上做标准化,因为那样会将test集的信息引入到训练集中,这是一个非常容易犯的错误!
参考:https://www.jianshu.com/p/4c3081d40ca6?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=weixin