一、特征缩放的定义,原因
特征缩放(feature scaling)是在机器学习中常用的数据预处理步骤,是数据预处理步骤中及其容易被忽略的一步。
为什么要特征缩放?考虑一下 kNN 算法,如果我们有两个特征,特征 A 的取值范围在 [1,10],特征 B 的取值范围在 [1, 100000]。那么在计算欧式距离时,特征 A 的贡献几乎被特征 B 给覆盖了。
特征缩放的目的就是使不同特征的数值范围相似,以确保模型的性能和收敛性能良好。绝大多数机器学习算法及优化算法(比如梯度下降)都期望特征取值在同样的范围。
二、常见的特征缩放方法
两种常见的特征缩放方法是标准化(Standardization)和归一化(Normalization)。
-
标准化(Standardization):
- 公式:
- 在标准化中,通过减去特征的均值并除以标准差,将数据转化为均值为0,标准差为1的分布。这样的变换使得数据呈现出标准正态分布的形状,适用于特征的分布近似正态分布的情况。
- 公式:
-
归一化(Normalization):
- 公式:
- 在归一化中,通过将数据缩放到 [0,1] 的范围内,确保所有特征都在相似的数值范围内。这对于涉及距离度量的模型(如K近邻算法)或使用梯度下降的模型(如神经网络)往往是有益的。
- 公式:
在实践中,还有一种称为MinMax缩放的归一化方法,它可以将数据缩放到任意区间[a,b],归一化是其特殊的形式。选择特定的缩放方法需要根据具体情况进行实验和比较,以找到对模型性能有益的方法。
三、选择特征缩放方法
尽管通过最小最大缩放实现的归一化在我们需要特征列中取值在一个限定范围时很常用。但是对于许多机器学习算法而言,标准化更具有实际意义,尤其是像梯度下降这样的优化算法。标准化使得我们将特征列的取值缩放成均值为 0 和标准差为 1,这样就和正态分布具有同样的参数了(0 均值、单位方差)。通过标准化,模型学习参数就更加简单,因为像逻辑回归和 SVM 算法都是将模型参数初始化成 0 或者其他很小的随机值。但是标准化不会改变数据分布的形状,也不会将非正态分布的数据转成正态分布。相对于最小最大缩放来说,标准化之后,算法对异常值不那么不敏感。
#选择标准化还是归一化通常取决于数据的分布和具体的模型。以下是一些建议:
-
标准化:
- 当特征的分布近似正态分布时,使用标准化通常是一个不错的选择。
- 对于涉及到正态分布假设的模型(如线性回归、线性支持向量机等),标准化可能更合适。
-
归一化:
- 当特征的分布不一致、存在异常值或者涉及到距离度量的模型时,归一化可能更适用。
- 对于神经网络等深度学习模型,由于它们对输入特征的尺度敏感,通常采用归一化。
四、特征缩放的具体流程
特征缩放的具体操作流程通常分为以下步骤:
-
选择缩放方法: 根据数据的分布和机器学习模型的需求,选择合适的缩放方法,例如标准化(Standardization)或归一化(Normalization)。
-
拟合缩放器: 使用训练数据拟合缩放器,计算特征的均值、标准差(或最小值、最大值等),以便后续将其应用于训练数据和新数据。
-
对训练数据进行缩放: 使用拟合好的缩放器对训练数据进行缩放,将数据转换为经过标准化或归一化的形式。
-
应用缩放器到测试/验证集: 对测试集和验证集应用相同的缩放器,确保在模型评估和调整阶段使用相同的缩放规则。
-
训练模型: 使用经过缩放的训练数据训练机器学习模型。
-
在预测新数据时进行缩放: 如果你的模型将用于对新数据进行预测,需要对新数据进行与训练数据相同的缩放操作。在这里,你需要使用之前拟合好的缩放器来对新数据进行缩放,以保持相同的缩放规则。
在Python中,使用scikit-learn库可以方便地进行特征缩放。以下是一个简单的例子:
from sklearn.preprocessing import StandardScaler
# 创建一个标准化的缩放器
scaler = StandardScaler()
# 对训练数据进行拟合和缩放
X_train_scaled = scaler.fit_transform(X_train)
# 对测试数据进行相同的缩放
X_test_scaled = scaler.transform(X_test)
# 使用缩放后的数据训练模型
model.fit(X_train_scaled, y_train)
# 在预测新数据时进行相同的缩放
new_data_scaled = scaler.transform(new_data)
# 使用缩放后的新数据进行预测
predicted_values = model.predict(new_data_scaled)
注意,在预测新数据时,一定要使用相同的缩放器对象来进行缩放,以确保应用相同的缩放规则。这可以通过保存和加载缩放器对象的方式来实现。在scikit-learn中,你可以使用joblib
库保存和加载缩放器对象。
本文来自博客园,作者:计算之道,转载请注明原文链接:https://www.cnblogs.com/jszd/p/17942707