本文约2300字,建议阅读10分钟本文将解释数据转换中常见的特征缩放方法:“标准化”和“归一化”的不同之处,并举例说明何时使用,以及如何使用它们。
数据转换的前几步往往可以提升机器学习模型的准确性。本文将解释数据转换中常见的特征缩放方法:“标准化”和“归一化”的不同之处,并举例说明何时使用,以及如何使用它们。
数据转换是数据处理中十分基本的步骤之一。当我初学特征缩放的时候,经常用到“缩放” “标准化”“归一化”等术语。但是却很难找到应该在什么时候,使用哪一种方法的信息。所以,我想从以下几方面讲解一下:
- 标准化和归一化的区别
- 何时使用标准化和归一化
- 如何用Python实现特征缩放
特征缩放的意义
在实践中,同一个数据集合中经常包含不同类别的变量。一个很大的问题是这些变量的值域可能大不相同。如果使用原值域将会使得值域大的变量被赋予更多的权重。针对这个问题,我们需要在数据预处理时对自变量或特征使用缩放的方法。虽然,“归一化”和 “标准化”这两个说法有时候可以互换使用,但是二者本质上确是不同的。
“特征缩放的目的是使得所有特征都在相似的范围内,因此建模时每个特征都会变得同等重要,并且更便于机器学习的算法进行处理。”
范例
这个数据集包含一个因变量(purchased)以及三个自变量(Country, Age, Salary)。我们能很容易发现变量彼此不在同一个范围内——年龄(Age)的值域在27-50之间,工资(Salary)的区间则是48K-83K。工资的值域远远地超过了年龄的值域。这会干扰我们的训练模型,因为很多的机器学习模型诸如K均值聚类(K-means clustering)和近邻算法(Nearest neighbour classification)都依据了欧氏距离(Euclidean Distance)。
关注年龄和工资变量
当我们计算欧氏距离的时候,(x2-x1)² 的值要远大于(y2-y1)² ,这意味着在不使用特征缩放的情况下,欧氏距离会被工资变量主导。年龄间的差距对整体欧氏距离的影响则很小。因此,我们需要使用特征缩放来将全部的数值统一到一个量级上来解决此问题。为了达到这个目标,基本的解决方法有二:“标准化”和“归一化”。
欧氏距离的应用
标准化 (Standardization):中心标准化
中心标准化(Z-score normalization)的结果是使所有特征的数值被转化成为均值为0、标准差为1的正态分布。公式如下:
这种将特征的值域重新缩放到0到1之间的技巧对于优化算法是很有用的,诸如在回归和神经网问题中应用到的“梯度下降”。缩放也适用于基于距离测量的算法,比如K近邻算法(KNN)。
归一化:离差标准化 (Max-Min Normalization)
另一常用的方法就是离差标准化(Min-Max scaling)。这个方法是将每个特征数值转化到[0,1]区间。对于每个特征,最小值被转化为0,最大值被转化为1。公式如下:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(df)
scaled_features = scaler.transform(df)
#Convert to table format - MinMaxScaler
df_MinMax = pd.DataFrame(data=scaled_features, columns=["Age", "Salary","Purchased","Country_France","Country_Germany", "Country_spain"])
中心标准化 vs 离差标准化
相比于中心标准化,离差标准化后的标准差比较小。用上述数据集来展示:
特征缩放后
工资变量的常态分布和标准差
年龄变量的常态分布和标准差
通过以上图表,我们能清楚地发现离差标准化工资和年龄变量后,得到的标准差小于使用中心标准化方法。这说明在使用离差标准化后,数据的数值更加接近平均值。
但是如果特征列中含有异常值(outlier), 离差标准化只能将所有特征统一比例,并不能很好地解决异常值问题。中心标准化在异常值方面则有更好的表现,因此它比离差标准化应用更广。
特征缩放的使用场景:
一些基于距离矩阵的机器学习模型,被称为“距离分类器”,比如K近邻算法(KNN),支持向量机(SVM),神经网络(Neural Network)。特征缩放对于这些模型非常重要,特别是在特征的值域非常不同时。特征缩放减少了大值域变量对计算距离的影响。
离差标准化帮助我们转化不同比例上的数据,消除特殊特征的主导。并且它不需要对数据的分布进行假设(比如k近邻和人工神经网络)。但是,归一化(离差标准化)不能很好地处理异常值。相反,标准化(中心标准化)可以更好地处理异常值,以及加速诸如梯度下降等算法的收敛。所以我们通常选择中心标准化。
注:如果算法不是基于距离计算,特征缩放则不重要,比如朴素贝叶斯和线性判别分析,以及树模型(梯度提升、随机森林等)。
总结:现在你应懂得
- 使用特征缩放的目的
- 标准化与归一化的区别
- 需要使用标准化或归一化的算法
- 在Python中实现特征缩放
获取代码和数据集合,请使用一下连接:
https://github.com/clareyan/feasturescaling
原文链接:
https://www.kdnuggets.com/2020/04/data-transformation-standardization-normalization.html
作者:Clare Liu, 英国金融科技数据科学家
翻译:林鹤冲