一、什么是特征缩放
特征缩放是一种用于标准化自变量或数据特征范围的方法。在数据处理中,也称为数据归一化,通常在数据预处理步骤中执行。
举个例子——如果你有多个独立变量,比如年龄、薪水和身高;它们的范围分别为(18-100 年)、(25,000-75,000 欧元)和(1-2 米),特征缩放将帮助它们都处于同一范围内,例如以 0 为中心或在范围内(0,1) 取决于缩放技术。
为了将上述内容可视化,让我们以 存放在 UCI 机器学习存储库中的“葡萄酒数据集”中的葡萄酒数据集中的酒精和苹果酸含量的自变量为例 。您可以在下面看到两种最常见的缩放技术(标准化和标准化)对数据集的影响。
二、缩放方法
1、Min-Max Normalization
称为最小-最大缩放或最小-最大归一化,它是最简单的方法,这种技术重新缩放特征或观察值,分布值在 0 和 1 之间。
归一化的一般公式如下:
其中max(x) 和 min(x) 分别是特征的最大值和最小值。
我们还可以对不同的区间进行归一化,例如选择将变量放置在任何 [a, b] 区间中,a 和 b 是实数。要重新调整任意一组值 [a, b] 之间的范围,公式变为:
2、Standardization
特征标准化使数据中每个特征的值具有零均值和单位方差。一般的计算方法是确定每个特征的分布均值和标准差,并通过以下公式计算新的数据点。
σ是特征向量的标准差,x̄是特征向量的平均值。
3、Scaling to unit length
该方法的目的是缩放特征向量的分量,使得完整向量的长度为 1。这通常意味着将每个分量除以向量的欧几里得长度。
除了上述 3 种广泛使用的方法外,还有一些其他方法可以缩放特征,即。Power Transformer、Quantile Transformer、Robust Scaler 等。
三、归一化还是标准化?
这个问题并没有标准答案。但有一些通用的经验可以参考。
1、当数据的分布不遵循高斯分布时,归一化很适合。它在不假设任何数据分布(如 K-最近邻)的算法中很有用。
2、在需要 0-1 尺度数据的神经网络算法中,归一化是必不可少的预处理步骤。数据归一化的另一个流行示例是图像处理,其中必须对像素强度进行归一化以适应特定范围(即 RGB 颜色范围为 0 到 255)。
3、在数据遵循高斯分布的情况下,标准化 可能会有所帮助。虽然这不一定是真的。由于标准化没有边界范围,因此,即使数据中存在异常值,它们也不会受到标准化的影响。
4、在聚类分析中,标准化可以方便地根据某些距离度量比较特征之间的相似性。另一个突出的例子是主成分分析,我们通常更喜欢标准化而不是 Min-Max 缩放,因为我们对最大化方差的组件感兴趣。
在决定是否需要标准化或标准化时,可以考虑一些要点
- 当数据表示高斯分布时可以使用标准化,而标准化对于非高斯分布非常有用
- 异常值的影响在标准化中非常高
总而言之, 您始终可以从将模型拟合到原始、标准化和标准化数据开始,然后比较性能以获得最佳结果。
四、数据缩放的影响
1、基于梯度下降的算法
如果算法使用梯度下降,那么特征范围的差异将导致每个特征的步长不同。为了确保梯度下降平稳地向最小值移动,并且梯度下降的步骤以相同的速率更新所有特征,我们在将数据输入模型之前对其进行缩放。具有相似规模的特征将有助于梯度下降更快地收敛到最小值。
具体来说,在神经网络算法的情况下,特征缩放有利于优化:
- 它使训练更快
- 它可以防止优化陷入局部最优
- 它提供了更好的误差表面形状
- 可以更方便地进行权重衰减和贝叶斯优化
2、基于距离的算法
KNN、K-means 和 SVM 等基于距离的算法受特征范围的影响最大。这是因为他们在幕后使用数据点之间的距离来确定它们的相似性,从而执行手头的任务。因此,我们在采用基于距离的算法之前对数据进行缩放,以便所有特征对结果的贡献相同。
3、使用 PCA 进行特征工程
在 PCA 中,我们对使方差最大化的组件感兴趣。如果一个组成部分(例如年龄)由于它们各自的比例而变化小于另一个组成部分(例如薪水),如果这些特征没有按比例缩放,PCA 可能会确定最大方差的方向更接近于“薪水”轴。由于一岁的变化可以被认为比一欧元的工资变化重要得多,这显然是不正确的。
4、回归
在回归中,通常建议对特征进行缩放,使预测变量的平均值为 0。当预测变量值设置为其平均值时,这使得截距项更容易解释为 Y 的预期值。
5、基于树的算法
不需要进行特征缩放。
基于树的算法对特征的规模相当不敏感。决策树仅基于单个特征拆分节点。决策树在增加节点同质性的特征上分割节点。一个特征上的这种分割不受其他特征的影响。因此,其余特征对拆分几乎没有影响。这就是使它们不受特征规模影响的原因。
五、特征缩放示例
1、数据集
Country | Age | Salary | Purchased |
France | 44 | 72000 | No |
Spain | 27 | 48000 | Yes |
Germany | 30 | 54000 | No |
Spain | 38 | 61000 | No |
Germany | 40 | Yes | |
France | 35 | 58000 | Yes |
Spain | 52000 | No | |
France | 48 | 79000 | Yes |
Germany | 50 | 83000 | No |
France | 37 | 67000 | Yes |
2、参考代码
# Python code explaining How to
# perform Feature Scaling
""" PART 1
Importing Libraries """
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Sklearn library
from sklearn import preprocessing
""" PART 2
Importing Data """
data_set = pd.read_csv('C:\\Users\\dell\\Desktop\\Data_for_Feature_Scaling.csv')
data_set.head()
# here Features - Age and Salary columns
# are taken using slicing
# to handle values with varying magnitude
x = data_set.iloc[:, 1:3].values
print ("\nOriginal data values : \n", x)
""" PART 4
Handling the missing values """
from sklearn import preprocessing
""" MIN MAX SCALER """
min_max_scaler = preprocessing.MinMaxScaler(feature_range =(0, 1))
# Scaled feature
x_after_min_max_scaler = min_max_scaler.fit_transform(x)
print ("\nAfter min max Scaling : \n", x_after_min_max_scaler)
""" Standardisation """
Standardisation = preprocessing.StandardScaler()
# Scaled feature
x_after_Standardisation = Standardisation.fit_transform(x)
print ("\nAfter Standardisation : \n", x_after_Standardisation)
3、归一化结果
[[ 0.33333333 0.86585366]
[ 0. 0.57317073]
[ 0.05882353 0.64634146]
[ 0.21568627 0.73170732]
[ 0.25490196 0. ]
[ 0.15686275 0.69512195]
[ 1. 0.62195122]
[ 0.41176471 0.95121951]
[ 0.45098039 1. ]
[ 0.19607843 0.80487805]]
4、标准化结果
[[ 0.09536935 0.66527061]
[-1.15176827 -0.43586695]
[-0.93168516 -0.16058256]
[-0.34479687 0.16058256]
[-0.1980748 -2.59226136]
[-0.56487998 0.02294037]
[ 2.58964459 -0.25234403]
[ 0.38881349 0.98643574]
[ 0.53553557 1.16995867]
[-0.41815791 0.43586695]]