机器学习算法在什么情况下需要归一化?

本文阐述了特征归一化在机器学习中的重要性,包括加速梯度下降求解速度和可能提高模型精度。讨论了线性归一化、标准差标准化和非线性归一化的应用场景及优缺点。

转载:http://www.cnblogs.com/LBSer/p/4440590.html

机器学习模型被互联网行业广泛应用,一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?维基百科给出的解释:1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度。下面我简单扩展解释下这两点。

1 归一化为什么能提高梯度下降法求解最优解的速度? 
斯坦福机器学习视频做了很好的解释:https://class.coursera.org/ml-003/lecture/21

如下图所示,蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;

而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。

因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

这里写图片描述

2 归一化有可能提高精度 
一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

3 归一化的类型 
1)线性归一化

这里写图片描述 
这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。

2)标准差标准化(standardScale) 
  经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:

这里写图片描述

  其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

3)非线性归一化 
经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

此外:需要弄清楚哪些算法模型在训练之前需要进行归一化,例如SVM需要归一化,而DT不需要归一化等,这也是提升算法应用能力的必备能力之一。

### 归一化机器学习建模中的原因和作用 归一化(Normalization)是一种常见的数据预处理技术,其主要目的是将不同量纲或不同数量级的特征统一到一个相似的尺度范围内。这种操作对于许多机器学习算法来说至关重要,因为它能够显著提升模型的表现和收敛速度。 #### 提升优化算法效率 在使用梯度下降等优化算法进行模型训练时,归一化可以加快求解过程。未经过归一化的数据可能导致代价函数的等高线呈现椭圆形,这会导致梯度下降沿着“之”字形路径缓慢收敛。而归一化后的数据使等高线更接近圆形,从而允许梯度下降更快地找到最优解[^3]。 #### 防止某些特征主导模型 当输入特征具有非常不同的范围时,那些数值较大的特征可能会不正当地影响模型的学习过程。通过归一化,所有特征都被调整到相同的尺度,这样每个特征对模型的影响权重变得一致,避免了单一特征对结果的过度影响[^4]。 #### 改善模型性能 一些依赖于距离度量的机器学习算法,如K近邻(KNN)、支持向量机(SVM)以及基于欧氏距离的聚类方法(例如K均值),如果特征没有被适当归一化,则可能产生偏差。因为这些算法会受到特征间尺度差异的影响,导致模型性能下降。归一化有助于保持原始数据点之间的相对关系,并确保距离计算是公平且有效的[^1]。 #### 保证特征间的可比性 归一化使得来自不同源或者具有不同物理意义的数据可以在同一基础上进行比较与分析。这对于后续的数据挖掘任务非常重要,因为它帮助消除由于测量单位或规模差异带来的干扰因素[^2]。 #### 适应特定算法的需求 有些机器学习算法假设输入数据符合某种分布或者是标准化过的。比如,在神经网络中激活函数通常期望输入位于某个小范围内;PCA降维也要求数据已经中心化并缩放。因此,为了满足这些算法的前提条件,需要事先执行归一化步骤[^3]。 综上所述,归一化不仅解决了特征之间尺度不一致的问题,而且提高了模型训练的速度和准确性,同时也增强了模型泛化能力。正确应用归一化是构建高效可靠机器学习模型的关键环节之一。 ```python from sklearn.preprocessing import MinMaxScaler # 创建一个MinMaxScaler实例,它将数据特征缩放到[0,1]区间 scaler = MinMaxScaler() # 假设我们有如下二维数据集X X = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] # 拟合并转换数据 X_scaled = scaler.fit_transform(X) print("Original data:\n", X) print("Normalized data:\n", X_scaled) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值