[机器学习] 数据特征 标准化和归一化

1、标准化/归一化定义

归一化和标准化常常被搞混,程度还比较严重,很是干扰你们的理解。为了方便后续的讨论,必须先明确两者的定义。面试

  • 归一化
    就是将训练集中某一列数值特征(假设是第i列)的值缩放到0和1之间。方法以下所示:算法

     

  • 标准化
    就是将训练集中某一列数值特征(假设是第i列)的值缩放成均值为0,方差为1的状态。以下所示:网络

     

  • 进一步明确两者含义
    归一化和标准化的相同点都是对某个特征(column)进行缩放(scaling)而不是对某个样本的特征向量(row)进行缩放。对特征向量进行缩放是毫无心义的(暗坑1)  好比三列特征:身高、体重、血压。每一条样本(row)就是三个这样的值,对这个row不管是进行标准化仍是归一化都是可笑的,由于你不能将身高、体重和血压混到一块儿去!机器学习

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

2、标准化/归一化的好处

2.1 提高模型精度

在机器学习算法的目标函数(例如SVM的RBF内核或线性模型的l1和l2正则化),许多学习算法中目标函数的基础都是假设全部的特征都是零均值而且具备同一阶数上的方差。若是某个特征的方差比其余特征大几个数量级,那么它就会在学习算法中占据主导位置,致使学习器并不能像咱们说指望的那样,从其余特征中学习。学习

举一个简单的例子,在KNN中,咱们须要计算待分类点与全部实例点的距离。假设每一个实例点(instance)由n个features构成。若是咱们选用的距离度量为欧式距离,若是数据预先没有通过归一化,那么那些绝对值大的features在欧式距离计算的时候起了决定性做用。3d

从经验上说,归一化是让不一样维度之间的特征在数值上有必定比较性,能够大大提升分类器的准确性。blog

2.2 提高收敛速度

对于线性model来讲,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。ci


      

比较这两个图,前者是没有通过归一化的,在梯度降低的过程当中,走的路径更加的曲折,而第二个图明显路径更加平缓,收敛速度更快。 对于神经网络模型,避免饱和是一个须要考虑的因素,一般参数的选择决定于input数据的大小范围。get

 

3、标准化/归一化的对比分析

首先明确,在机器学习中,标准化是更经常使用的手段,归一化的应用场景是有限的。我总结缘由有两点:

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

因此,下面的讨论咱们先集中分析标准化在机器学习中运用的状况,在文章末尾,简单探讨一下归一化的使用场景。这样更能凸显重点,又能保持内容的完整性,暂时忘记归一化,让咱们focus到标准化上吧。

4、逻辑回归必需要进行标准化吗?

我以为,回答完上面的问题,就能够很好地掌握标准化在机器学习中的运用。

首先,请尝试本身来回答一下(暂停5秒)

不管你回答必须或者没必要须,你都是错的!

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

若是你不用正则,那么,标准化并非必须的,若是你用正则,那么标准化是必须的。(暗坑3)
为何呢?
由于不用正则时,咱们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,咱们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小。而参数值的大小程度或者说大小的级别是与特征的数值范围相关的。举例来讲,咱们用体重预测身高,体重用kg衡量时,训练出的模型是: 身高 = 体重*x          x就是咱们训练出来的参数。
当咱们的体重用吨来衡量时,x的值就会扩大为原来的1000倍。
在上面两种状况下,都用L1正则的话,显然对模型的训练影响是不一样的。

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

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

答案是有好处,进行标准化后,咱们得出的参数值的大小能够反应出不一样特征对样本label的贡献度,方便咱们进行特征筛选。若是不作标准化,是不能这样来筛选特征的。

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

最大的注意事项就是先拆分出test集,不要在整个数据集上作标准化,由于那样会将test集的信息引入到训练集中,这是一个很是容易犯的错误!

 

5、经过例子来讲明

咱们先从简单的预测房价的线性回归模型开始:
有一组关于房价和房子变量的数据集,经过房子的面积,房间数量,房子的层数来预测房价。

占地面积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个城市分红两类,变量有面积和教育程度占比;三个城市分别是这样的:

  1. 城市A,面积挺大,可是成天发生偷盗抢劫,教育程度低;
  2. 城市B,面积也挺大,治安不错,教育程度高;
  3. 城市C,面积中等,治安也挺好,教育程度也挺高;

 

咱们若是不作标准化,直接作聚类模型的话,A城市和B城市分在一起了,你想一想,一个治安挺好的城市和一个总体偷盗抢劫城市分在一块儿,实在是有点违反常理。

6、总结

 

Tree-based models doesn’t depend on scaling

Non-tree-based models hugely depend on scaling

有时候,咱们必需要特征在0到1之间,此时就只能用归一化。有种svm可用来作单分类,里面就须要用到归一化,因为没有深刻研究,因此我把连接放上,感兴趣的能够本身看。

固然,也不是全部的模型都须要作归一的,好比模型算法里面有没关于对距离的衡量,没有关于对变量间标准差的衡量。好比decision tree 决策树,他采用算法里面没有涉及到任何和距离等有关的,因此在作决策树模型时,一般是不须要将变量作标准化的。


连接:

https://www.jianshu.com/p/4c3081d40ca6

https://www.jianshu.com/p/1e63cd2afedc