始终为机器学习缩放/规范化数据是一种好习惯吗?

机器算法验证 机器学习 数据转换 正常化
2022-02-11 07:24:02

我的理解是,当某些特征的值范围不同时(例如,假设一个特征是一个人的年龄,另一个是他们的美元工资)会对算法产生负面影响,因为具有更大值的特征会受到更大的影响,简单地总是缩放/标准化数据是一个好习惯吗?

在我看来,如果当时的值已经相似,那么对它们进行归一化将没有什么效果,但如果值非常不同,归一化会有所帮助,但是感觉太简单了:)

我错过了什么吗?是否存在让某些功能故意超过其他功能的情况/算法?

4个回答

首先,我不认为有很多“在机器学习中总是 X 是一种好习惯”形式的问题,答案将是确定的。总是?总是总是?跨越参数、非参数、贝叶斯、蒙特卡罗、社会科学、纯数学和百万特征模型?那会很好,不是吗!

但具体来说,这里有几种方法:这取决于。

规范化有时很好:

1) 有几种算法,特别是 SVM,有时可以在标准化数据上收敛得更快(尽管确切地说,我不记得为什么)。

2)当您的模型对幅度敏感,并且两个不同特征的单位不同且任意时。这就像您建议的情况一样,其中某些事情的影响力超出了应有的程度。

但是,当然 - 并非所有算法对您建议的幅度敏感。如果您缩放数据或不缩放数据,线性回归系数将是相同的,因为它正在查看它们之间的比例关系。

有时规范化不好:

1)当你想解释你的系数时,它们不能很好地归一化。像美元这样的东西的回归会给你一个有意义的结果。样本中最大美元比例的回归可能不会。

2)事实上,你的特征上的单位是有意义的,而距离确实会产生影响!回到支持向量机——如果你想找到一个最大边距分类器,那么进入那个“最大”的单元很重要。聚类算法的缩放特征可以大大改变结果。想象一下原点周围的四个集群,每个集群位于不同的象限,都很好地缩放。现在,想象一下 y 轴被拉伸到 x 轴长度的十倍。而不是四个小象限集群,您将获得沿其长度切成四块的长压扁数据面包!(而且,重要的是,您可能更喜欢其中任何一个!)

在我确信不令人满意的总结中,最普遍的答案是你需要认真地问自己,你正在使用的数据和模型有什么意义。

好吧,我相信更几何的观点将有助于更好地确定归一化是否有帮助。想象一下,您感兴趣的问题只有两个特征,而且它们的范围不同。然后在几何上,数据点四处散布并形成一个椭圆体。但是,如果对特征进行归一化,它们将更加集中,并有望形成单位圆并使协方差对角线或至少接近对角线。这就是诸如批量归一化神经网络中数据的中间表示等方法背后的想法。使用 BN,收敛速度惊人地提高(可能是 5-10 倍),因为梯度可以很容易地帮助梯度做他们应该做的事情,以减少错误。

在未归一化的情况下,基于梯度的优化算法将很难将权重向量移向一个好的解决方案。然而,归一化情况下的成本面不那么拉长,基于梯度的优化方法会做得更好,发散也更少。

线性模型当然是这种情况,尤其是那些成本函数是模型输出和目标差异的度量的模型(例如,使用 MSE 成本函数的线性回归),但在非线性模型中可能不一定如此. 归一化不会对非线性模型造成伤害;不对线性模型这样做会受到伤害。

下面的图片可以[粗略地]被视为一个拉长的误差表面的例子,其中基于梯度的方法可能很难帮助权重向量向局部最优移动。

在此处输入图像描述

让我告诉你我是如何了解标准化重要性的故事。

我试图使用神经网络对手写数字数据进行分类(这是对从手写数字图像中提取的特征进行分类的简单任务)作为机器学习课程的作业。
就像其他人一样,我从一个神经网络库/工具开始,向它输入数据并开始使用参数。我尝试改变层数、神经元数量和各种激活函数。它们都没有产生预期的结果(准确度在 0.9 左右)。

罪魁祸首?激活函数中的比例因子 (s) =s1+es.x-1。如果未设置参数s,则激活函数将激活每个输入或在每次迭代中使每个输入无效。这显然导致了模型参数的意外值。我的观点是,当输入 x 在较大值上变化时,设置s并不容易。

正如其他一些答案已经指出的那样,是否对数据进行规范化的“良好实践”取决于数据、模型和应用程序。通过规范化,您实际上丢弃了一些关于数据的信息,例如绝对最大值和最小值。所以,没有经验法则。

正如其他人所说,标准化并不总是适用的。例如,从实际的角度来看。

为了能够将特征缩放或规范化到一个常见的范围,例如[0,1],您需要知道min/max(或mean/stdev取决于您应用的缩放方法)每个特征。IOW:在开始训练之前,您需要拥有所有特征的所有数据

许多实际的学习问题并没有为您提供所有先验数据,因此您根本无法规范化。此类问题需要在线学习方法。

但是,请注意,一些一次从一个示例中学习的在线(与批量学习相反)算法支持缩放/归一化的近似。他们反复学习音阶并对其进行补偿。例如,默认情况下, vowpal wabbit迭代地标准化缩放(除非您通过强制某种优化算法(如 naive )显式禁用自动缩放--sgd