一、机器学习中,为什么经常要对数据做归一化处理?
维基百科的回答:(1)归一化后加快了梯度下降求最优解的速度;(2)归一化有可能提高精度。
- 归一化为什么能提高梯度下降法求解最优解的速度?
如下图所示,蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,区间是[0,2000],
区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;而右边的图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。
因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。
2、归一化有可能提高精度
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。
二、归一化的方法:
1、线性归一化
这种归一化方法比较适用在数值比较集中的情况,数据点没有因为特征的基本性质而产生较大差异,即确保数据处于同一数量级(同一量纲),提高不同特征数据的可比性。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。
把每个特征向量(特别是奇异样本数据)的值都缩放到相同数值范围。如[0,1]或[-1,1]。最常用的归一化形式就是将特征向量调整为L1范数(就是绝对值相加),使特征向量的数值之和为1。L2范数就是欧几里得之和。
2、标准差归一化
经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
3、非线性归一化
经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。
三、需要归一化的模型
概率模型(树形模型)不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、RF。而像Adaboost、SVM、LR、Knn、KMeans之类的最优化问题就需要归一化。
四、防止过拟合的方法
1、增加训练数据:导致过拟合的原因可能是由于我们的训练数据太少,不足以拟合出问题,因此可以考虑增加训练样本的数量。对于数据获取比较容易的任务,可增加训练样本的数量。也可以使用数据集估计数据分布参数,使用估计分布参数生成训练样本,但是数据分布参数本身可能会存在一定的误差,这种方法很少使用。我们还可以使用数据增强(Data Augmentation)的方法扩充训练数据,例如一张图片中的目标的位置、姿态、尺度,整体图片明暗度等都不会影响最终的结果,因此我们可以通过将图像平移、翻转、缩放、切割等手段将训练数据样本成倍扩充,达到增加训练样本的目的
2、减小模型的复杂度:减小模型的复杂度也就是降低训练的结果风险,产生过拟合通常是由于训练本少或者模型太复杂。在方法(1)中我们已经分析了增加训练数据的方法,这里主要采用较小模型的复杂度。使用合适复杂度的模型来拟合问题,让其足够拟合真正的规则,同时又不至于拟合太多抽样误差,这是理想状态的方法,难度主要在于如何确定模型拟合能力需要多大。传统的机器学习方法是通过物理、数学建模,确定模型复杂度,这样确定的模型基本可以满足拟合需求。而对于神经网络尤其是深度网络并不容易。方法主要有:
- 减少网络的层数或者神经元数量。这个很好理解,介绍网络的层数或者神经元的数量会使模型的拟合能力降低
- 参数范数惩罚参数范数惩罚通常采用L1和L2参数正则化
- 提前终止
- 添加噪声,添加噪声可以在输入、权值,网络相应中添加。
- 结合多种模型,如Bagging,Boosting,dropout等。
ps:dropout:这是一种相当激进的技术,和之前的规范化技术不同,他不改变网络本身,而是会随机地删除网络中的一般隐藏的神经元,并且让输入层和输出层的神经元保持不变。
这种技术的直观理解为:当我们Dropout不同的神经元集合时,有点像我们在训练不同的神经网络。而不同的神经网络会以不同的方式过拟合,所以Dropout就类似于不同的神经网络以投票的方式降低过拟合。