为什么要对特征做归一化/标准化
为什么要对特征进行归一化?
一句话描述:1)归一化后加快了梯度下降求最优解的速度
2)归一化有可能提高精度
1:归一化后加快了梯度下降求最优解的速度
蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;
而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。
因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。
如果不归一化,不同变量的损失梯度图可能会呈现一个椭圆,这样在梯度下降的时候迭代次数会比较多;归一化后损失的等高线图就是一个圆,任意一点的切线方向便是梯度下降的方向,这样便减少了迭代次数,加快了模型训练。
2.提升模型的精度
归一化的另一好处是提高精度,这在涉及到一些距离计算的算法时效果显著,比如算法要计算欧氏距离,上图中x2的取值范围比较小,涉及到距离计算时其对结果的影响远比x1带来的小,所以这就会造成精度的损失。所以归一化很有必要,他可以让各个特征对结果做出的贡献相同。
归一化的方法有哪些?
线性归一化,线性归一化会把输入数据都转换到[0 1]的范围,公式如下
0均值标准化,0均值归一化方法将原始数据集归一化为均值为0、方差1的数据集,该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕。
-
其中,μ和σ 分别代表均值和标准差
进一步明确二者含义
- 归一化和标准化的相同点都是对某个特征(column)进行缩放(scaling)而不是对某个样本的特征向量(row)进行缩放。对特征向量进行缩放是毫无意义的(暗坑1) 比如三列特征:身高、体重、血压。每一条样本(row)就是三个这样的值,对这个row无论是进行标准化还是归一化都是好笑的,因为你不能将身高、体重和血压混到一起去!
- 在线性代数中,将一个向量除以向量的长度,也被称为标准化,不过这里的标准化是将向量变为长度为1的单位向量,它和我们这里的标准化不是一回事儿,不要搞混哦(暗坑2)。
哪些算法需要进行归一化?
包含w x + b的模型,一般需要归一化:
- 线性回归
- 逻辑回归
- svm
- 神经网络
不需要做归一化的:
- 决策树。其节点在分裂的时候往往看的是信息增益(比)
- GBDT,XGBOOST
概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、rf。而像svm、lr、KNN、KMeans之类的最优化问题就需要归一化。(小伙伴要记清楚哦,或者用sklearn里面的库跑一下模型看看呢)、
关于归一化方法的选择
1) 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
2) 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。
总结来说,在算法、后续计算中涉及距离度量(聚类分析)或者协方差分析(PCA、LDA等)的,同时数据分布可以近似为状态分布,应当使用0均值的归一化方法。其他应用中更具需要选用合适的归一化方法。
----------------------------------------------------------------------------------------------
三、标准化/归一化的对比分析
首先明确,在机器学习中,标准化是更常用的手段,归一化的应用场景是有限的。我总结原因有两点:
- 1、标准化更好保持了样本间距。当样本中有异常点时,归一化有可能将正常的样本“挤”到一起去。比如三个样本,某个特征的值为1,2,10000,假设10000这个值是异常值,用归一化的方法后,正常的1,2就会被“挤”到一起去。如果不幸的是1和2的分类标签还是相反的,那么,当我们用梯度下降来做分类模型训练时,模型会需要更长的时间收敛,因为将样本分开需要更大的努力!而标准化在这方面就做得很好,至少它不会将样本“挤到一起”。
- 2、标准化更符合统计学假设
对一个数值特征来说,很大可能它是服从正态分布的。标准化其实是基于这个隐含假设,只不过是略施小技,将这个正态分布调整为均值为0,方差为1的标准正态分布而已。
所以,下面的讨论我们先集中分析标准化在机器学习中运用的情况,在文章末尾,简单探讨一下归一化的使用场景。这样更能凸显重点,又能保持内容的完整性,暂时忘记归一化,让我们focus到标准化上吧。
四、逻辑回归必须要进行标准化吗?
我觉得,回答完上面的问题,就可以很好地掌握标准化在机器学习中的运用。
首先,请尝试自己来回答一下(暂停5秒)
无论你回答必须或者不必须,你都是错的!
真正的答案是,这取决于我们的逻辑回归是不是用正则。
如果你不用正则,那么,标准化并不是必须的,如果你用正则,那么标准化是必须的。(暗坑3)
为什么呢?
因为不用正则时,我们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,我们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小。而参数值的大小程度或者说大小的级别是与特征的数值范围相关的。举例来说,我们用体重预测身高,体重用kg衡量时,训练出的模型是: 身高 = 体重*x x就是我们训练出来的参数。
当我们的体重用吨来衡量时,x的值就会扩大为原来的1000倍。
在上面两种情况下,都用L1正则的话,显然对模型的训练影响是不同的。
假如不同的特征的数值范围不一样,有的是0到0.1,有的是100到10000,那么,每个特征对应的参数大小级别也会不一样,在L1正则时,我们是简单将参数的绝对值相加,因为它们的大小级别不一样,就会导致L1最后只会对那些级别比较大的参数有作用,那些小的参数都被忽略了。
如果你回答到这里,面试官应该基本满意了,但是他可能会进一步考察你,如果不用正则,那么标准化对逻辑回归有什么好处吗?
答案是有好处,进行标准化后,我们得出的参数值的大小可以反应出不同特征对样本label的贡献度,方便我们进行特征筛选。如果不做标准化,是不能这样来筛选特征的。
答到这里,有些厉害的面试官可能会继续问,做标准化有什么注意事项吗?
最大的注意事项就是先拆分出test集,不要在整个数据集上做标准化,因为那样会将test集的信息引入到训练集中,这是一个非常容易犯的错误!
五、通过例子来说明
我们先从简单的预测房价的线性回归模型开始:
有一组关于房价和房子变量的数据集,通过房子的面积,房间数量,房子的层数来预测房价。
占地面积1800尺,房间数量3间,房子层数2层-> 房价?;
为了方便对比,我们分别看一下标准化前和标准化后的模型输出分布是怎么样的。
可以看出,标准化前后变量的系数不同,误差不同,但是R平方,和变量的t值是相同的。
5.1 解释有区别吗?
那标准化前后得到的公式,怎么来解释呢?
标准化前 | 标准化后 |
---|---|
如果居住面积,房间数,房间层数都是0的情况下,房子的价格为91830万 | 如果居住面积,房间数,房间层数是各自的平均数的情况下,房子的价格为539400万 |
当一个外行人在听解释的时候,一定会问,什么呀?所有东西都是0,空气造的房子还能卖9万?!
接着你会问,系数不同,那预测出来的房价会相同吗?
5.2 预测值有区别吗?
现在我们来预测一个1590尺,3个卧室,3层的房屋
标准化前房价 | 标准化后房价 |
---|---|
$406641.02 | $406641.02 |
我们发现预测出来的房价是一样的。
这时你一定会想,既然结果都一样,做不做标准化,都一样嘛。说到这里,我们再看一下,建模时寻找最优解的时间吧。
5.3 花费时间有区别吗?
标准化前处理时间 | 标准化后处理时间 |
---|---|
0.026s | 0.021s |
为什么标准化后的建模时间会短呢?这时候就要说起寻找系数最优解-梯度下降法。
标准化前,由于变量的单位相差很大,导致了椭圆型的梯度轮廓。标准化后,把变量变成统一单位,产生了圆形轮廓。由于梯度下降是按切线方向下降,所以导致了系统在椭圆轮廓不停迂回地寻找最优解,而圆形轮廓就能轻松找到了。
还有一种比较极端的情况,有时没做标准化,模型始终找不到最优解,一直不收敛。
5.4 PCA,Kmeans,KNN需要标准化数据吗?
这种情况下,可见标准化的重要性了吧。
我们再来看一下,如果将预测房价的变量,用PCA方法来降维,会不会对结果产生影响。
我们看出在标准化前,用一个成分就能解释99%的变量变化,而标准化后一个成分解释了75%的变化。 主要原因就是在没有标准化的情况下,我们给了居住面积过大权重,造成了这个结果。
那还有什么情况下,不做归一化会发生这么大的影响?
Kmeans,KNN一些涉及到距离有关的算法,或者聚类的话,都是需要先做变量标准化的。
举个例子,我们将3个城市分成两类,变量有面积和教育程度占比;三个城市分别是这样的:
- 城市A,面积挺大,但是整天发生偷盗抢劫,教育程度低;
- 城市B,面积也挺大,治安不错,教育程度高;
- 城市C,面积中等,治安也挺好,教育程度也挺高;
我们如果不做标准化,直接做聚类模型的话,A城市和B城市分在一块儿了,你想想,一个治安挺好的城市和一个整体偷盗抢劫城市分在一起,实在是有点违反常理。
六、总结
Tree-based models doesn’t depend on scaling
Non-tree-based models hugely depend on scaling
有时候,我们必须要特征在0到1之间,此时就只能用归一化。有种svm可用来做单分类,里面就需要用到归一化,由于没有深入研究,所以我把链接放上,感兴趣的可以自己看。
当然,也不是所有的模型都需要做归一的,比如模型算法里面有没关于对距离的衡量,没有关于对变量间标准差的衡量。比如decision tree 决策树,他采用算法里面没有涉及到任何和距离等有关的,所以在做决策树模型时,通常是不需要将变量做标准化的。