数据缩放 101:标准化和最小-最大缩放解释

原文:towardsdatascience.com/data-scaling-101-standardization-and-min-max-scaling-explained-60789833e160

数据缩放 101:标准化和最小-最大缩放解释

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/17505602731b2fa378713c36e7b963e1.png

Sven MiekeUnsplash 拍摄的照片

什么是缩放?

当你首次将数据集加载到你的 Python 脚本或笔记本中,并查看你的数值特征时,你可能会注意到它们都在不同的尺度上。

这意味着每一列或特征将具有不同的范围。例如,一个特征可能具有从 0 到 1 的值范围,而另一个可以具有从 1000 到 10000 的值范围。

以 UCI 机器学习仓库中的 Wine Quality 数据集 为例 (CC by 4.0 许可证)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a8de05cf7b81808341f5f71689c78c0a.png

来自 UCI Wine Quality 数据集的一些特征。图片由作者提供

缩放本质上是一个将所有特征拉近相似或相同范围或尺度的过程,例如将它们转换,使所有值都在 0 到 1 之间。

当(以及为什么)你需要缩放

在拟合/训练机器学习模型之前缩放特征的重要性有几个原因:

  1. 确保所有特征对模型贡献均等。 当一个特征具有很大和广泛的数值范围时,它可能会对预测产生过高的影响,而其他较小的特征则被忽视。

  2. 性能提升。 当特征缩放时,某些算法收敛更快

特征缩放应在数据清理(移除空值、移除/插补异常值等)之后、通过工程创建新特征以及执行训练/测试分割之后进行。它应该是模型拟合缩放数据之前的最后一步数据预处理步骤。

然而,在决定缩放特征时,需要记住以下几点:

  • 仅对特征进行缩放,而不是目标变量。 缩放目标变量是不必要的。

  • 仅对数值特征进行缩放。 不要对分类特征进行缩放——相反,使用独热编码或其他分类编码方法将这些特征输入到模型中。

  • 特征缩放对于某些算法是必要的。 使用梯度下降法最小化损失函数的算法,如线性回归、逻辑回归和神经网络,对特征尺度差异敏感,因此需要进行缩放。距离算法,如 KNN,也对缩放敏感。然而,基于树的算法,如决策树和随机森林,则不敏感,因此对这些算法进行特征缩放不是必要的。

标准化或最小-最大缩放?

有两种流行的特征缩放方法:标准缩放和最小-最大缩放。

标准缩放(也称为 标准化 将数据转换,使其均值为 0,标准差为 1。在 Python 中,使用 StandardScaler 执行标准化。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4b825ee7e35a5ff62415ede136d117fd.png

给定数据点 Xi 的标准化方程。图由作者提供

最小-最大缩放(有时称为归一化,尽管 scikit-learn 文档中没有这样称呼它) 将数据转换,使每个值介于 0 和 1 之间。在 Python 中,使用 MinMaxScaler 对象执行最小-最大缩放。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9821bd95398f5806e38f7706edfb844d.png

给定数据点 Xi 的归一化方程。图由作者提供

在训练机器学习模型之前缩放数据时,标准化和最小-最大缩放通常都能完成任务。我建议尝试使用你的数据集进行这两种方法,看看哪种(如果有的话)能带来更好的性能。

然而,在选择一种方法而不是另一种方法时,有一些考虑因素。

标准化:

  • 结果得到一个均值为 0,标准差为 1 的分布

  • 许多机器学习算法(尤其是深度学习算法)假设数据具有 标准正态分布,均值为 0,方差为 1。

  • 对异常值敏感

  • 更适合已经正态分布的数据

最小-最大缩放:

  • 将值范围限制在 [0,1] 内

  • 对异常值敏感

  • 因为它将值范围限制在 0,1,所以在稀疏数据的情况下保留了 0 的值

  • 保持数据的原始分布/形状

实现

这两个缩放器都可通过 sklearn.preprocessing 模块获得,并可以按如下方式导入:

from sklearn.preprocessing import MinMaxScaler, StandardScaler

重要提示:在缩放您的数据之前,请务必先将其分为训练集和测试集。您不希望将缩放器拟合到整个数据集上,因为这会导致数据泄露

您的缩放器应该仅适用于训练集。要将缩放器拟合到数据并且同时转换数据,请在训练集上调用.fit_transform。对于测试集,您应该只调用.transform,因为您不希望使用测试集来拟合或“训练”缩放器。

# First split up X and y into train and test 
X_train, X_test,y_train,y_test=train_test_split(X,y)

# Define scaler object - can be MinMaxScaler, StandardScaler, or another 
# scaling object 
scaler = MinMaxScaler()

# Fit the scaler onto the train set and transform at the same time
X_train = scaler.fit_transform(X_train)
# Only transform on the test set
X_test = scaler.transform(X_test)

现在,您有了可以用于训练模型的缩放后的测试集和训练集。

其他缩放方法

由于 StandardScaler 和 MinMaxScaler 都对异常值敏感,scikit learn 提供了一个有用的替代方案:RobustScaler。RobustScaler 移除中位数并使用四分位距(IQR)作为缩放的参考点。IQR 是已知的一种稳健的异常值检测方法,这意味着它不受异常值的影响。

要深入了解 IQR 的工作原理,您可以查看我关于简单统计方法和它们如何在 Python 中实现的文章:

3 种简单的异常值检测统计方法

另一个选择是在拟合缩放器到您的数据之前简单地删除或插补异常值。但是,如果某些方法没有检测到您数据集中的所有或大多数异常值,RobustScaler 可能是一个安全的选择。

结论

最终,StandardScaler 和 MinMaxScaler 都是对范围、标准差和方差差异很大的特征进行缩放的好选择。测试两者并查看每个如何影响您模型的性能是有益的。

以 StandardScaler 作为默认选项可能是一个好的开始,因为许多深度学习算法假设数据具有正态分布,均值为 0,标准差为 1——只要您的数据集不是高度偏斜或异常。

这就是为什么在开始预处理之前探索您的数据、仔细检查分布和检查异常值很重要的原因。


感谢阅读

每当 Haden Pelletier 发布文章时,都会收到电子邮件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值