前言
我在学李宏毅的机器学习课程,助教给的回归作业代码中有数据标准化的操作。
我听过数据标准化,还有归一化、批量归一化等等,但不是很懂,不知道他们具体是什么、有什么区别。
百度上找了挺多文章,讲得都不是很系统,比如大多文章都没讲懂标准化和归一化的区别或者是不同文章讲的内容矛盾了。
用谷歌一搜,就找到了很多很有价值的相关文章,然后我也写了这篇文章做个记录。
相对来讲,中文社区要比英文社区差些,部分原因是名词滥用或中英翻译问题,比如标准化和归一化、常量指针和指针常量。emmm
概要
本文主要讲解了以下内容
- 特征缩放是什么/特征缩放的定义
- 归一化是什么/归一化的定义
- 标准化是什么/标准化的定义
- 归一化和标准化的区别
- 为什么要进行特征缩放/特征缩放有什么作用
- 有哪些常见的特征缩放方法
- 什么时候适合进行特征缩放/特征缩放方法的应用
名词定义
这几个词是有区别的,特别是标准化和归一化,不要滥用(在本文中也请区分这几个词)。
中文 | 英文 |
---|---|
特征缩放 | Feature Scaling |
标准化 | Standardization(Z-Score Normalization) |
归一化 | Normalization |
可以认为Feature Scaling包括Standardization和Normalization,其中Standardization可以叫做Z-Score Normalization。
为什么需要进行特征缩放
背景:多指标量纲和数量级不同
使用单一指标对某事物进行评价并不合理,因此需要多指标综合评价方法。多指标综合评价方法,就是把描述某事物不同方面的多个指标综合起来得到一个综合指标,并通过它评价、比较该事物。
由于性质不同,不同评价指标通常具有不同的量纲和数量级。当各指标相差很大时,如果直接使用原始指标值计算综合指标,就会突出数值较大的指标在分析中的作用、削弱数值较小的指标在分析中的作用。
为消除各评价指标间量纲和数量级的差异、保证结果的可靠性,就需要对各指标的原始数据进行特征缩放(也有数据标准化、数据归一化的说法,但这些叫法不准确,所以不推荐)。
由于量纲和数量级不同,所以需要特征缩放。特征缩放可以显著提升部分机器学习算法的性能,但它对部分算法没有帮助。
不进行特征缩放会有什么后果
假如特征$x_1$的数值是100左右,特征$x_2$的数值是1左右,方程为$y=b+w_1x_1+w_2x_2$,那$w_1$对$y$的影响就更大,对Loss的影响也更大,损失函数关于$w_1$的梯度也更大,而损失函数关于$w_2$的梯度却很小,因此两个特征就不能使用相同的学习率。
不进行特征缩放的话,Error Surface就是一个椭圆,梯度下降时不一定是朝着最优点(圆心),速度就慢。
如果进行了特征缩放,Error Surface会尽可能趋近于圆,因此梯度下降时会一直朝着最优点(圆心),所以速度快。
各类算法是否需要进行特征缩放
基于梯度下降的算法(Gradient Descent Based Algorithms)
在基于梯度下降进行优化的算法中,需要进行特征缩放,比如线性回归、逻辑回归、神经网络等。
因为计算梯度时会使用特征的值,如果各特征的的取值范围差异很大,不同特征对应梯度的值就会差异很大。
为保证平滑走到最优点、按相同速率更新各特征的权重,需要进行特征放缩。
通过特征放缩,可以使数值范围变小,进而加速梯度下降。
基于距离的算法(Distance-Based Algorithms)
在基于距离进行优化的算法中,需要进行特征缩放,比如K近邻、K-Means、SVM、PCA等。
因为这些算法是基于数据点的特征值计算它们的距离,距离越小则两者越相似。
基于树的算法(Tree-Based Algorithms)
基于树的算法(比如决策树)对特征(features)的数值范围并不敏感,不需要进行特征缩放。
决策树仅基于单个feature拆分节点,并不受其它feature的影响。
线性判别分析、朴素贝叶斯等算法
这两个算法处理了特征数量级差异大的问题,因此不需要进行特征缩放。
四种特征缩放的方法
标准化和归一化都可以实现特征缩放,但两者是有区别的。
假设我们有一份数据$x$,它有$N$行$M$列,即有$N$个对象,每个对象有$M$个特征,$x^i_j$表示对象$i$的特征$j$。
- Standardization(Z-Score Normalization)
- Mean Normalization
- Min-Max Normalization
- Unit Vector Normalization/Scaling to unit length
标准化(Standardization/Z-Score Normalization)
定义
公式为$\hat x[:,j]=\frac{x[:,j]-mean(x[:,j])}{std(x[:,j])}$,其中$mean$代表平均值,$std$代表标准差,
$mean(x[:,j])=\frac{1}{N}\cdot\sum_{i=1}^Nx[i,j]$,
$std(x[:,j])=\sqrt{\frac{1}{N-1}\cdot\sum^N_{i=1}(x[i,j]-\mu_j)^2}$。
特点
使数据的平均值变为0、标准差变为1,不改变数据的分布类型,数值范围不一定,消除了数据的量纲差异。
假设
标准化假设数据是正态分布,但这个要求并不十分严格,如果数据是正态分布则该技术会更有效。
何时使用
当我们使用的算法假设数据是正态分布时,可以使用Standardization,比如线性回归、逻辑回归、线性判别分析。
因为Standardization使数据平均值为0,也可以在一些假设数据中心为0(zero centric data)的算法中使用,比如主成分分析(PCA)。
归一化(Normalization)
特点
把数据调整到[0,1],并且消除了数据的量纲差异。
也可以把数据调到[-1,1],在使用SVM和Adaboost时就需要这样。
何时使用
当我们不知道数据分布时或者我们知道数据不是正态分布时,这是一个很好的方法。
换种说法就是,当我们使用的算法没有假设数据的分布类型时,就可以使用Normalization,比如K近邻算法和人工神经网络。
Mean Normalization
定义
$\hat x[:,j]=\frac{x[:,j]-mean(x[:,j])}{max(x[:,j])-min(x[:,j])}$
其中$mean$代表平均值,$max$代表最大值,$min$代表最小值。
特点
把数据调到[-1,1],平均值为0
何时使用
一些假设数据中心为0(zero centric data)的算法,比如主成分分析(PCA)。
Min-Max Normalization
定义
$\hat x[:,j]=\frac{x[:,j]-min(x[:,j])}{max(x[:,j])-min(x[:,j])}$
其中$max$代表最大值,$min$代表最小值。
特点
把数据调到[0,1]
何时使用
当处理具有严格数值范围要求的数据(比如图片)时,这非常有用。
Unit Vector Normalization/Scaling to unit length
定义
$\hat x[i,:]=\frac{x[i,:]}{||x[i,:]||}$
把每个对象的特征向量变成单位长度。
特点
把数据调到[0,1]
何时使用
当处理具有严格数值范围要求的数据(比如图片)时,这非常有用。
参考链接
下面几篇文章确实讲得很清晰、精准,作为机器学习新手的我都能看懂。
这篇文章的内容也都是从下面这些文章里提取总结出来的,所以如果我上面哪里讲得不清楚、不好的话,建议直接查看下面几篇文章或者直接谷歌搜索相关名词。
https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E6%A0%87%E5%87%86%E5%8C%96
-
这篇文章讲得很不错,建议参考。
https://medium.com/greyatom/why-how-and-when-to-scale-your-features-4b30ab09db5e
这篇文章讲得很不错,建议参考。
https://machinelearningmastery.com/normalize-standardize-machine-learning-data-weka/
这篇文章讲了Weka的使用,但我们并不需要看Weka怎么用,看文章里其它理论部分即可。
https://towardsdatascience.com/understand-data-normalization-in-machine-learning-8ff3062101f0
这篇文章更偏向于实践一些,也很不错。
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!