机器学习中的归一化是什么?数据重缩放的全面指南

在机器学习中,成功模型的基础建立在它们所训练的数据质量上。虽然复杂、精密的算法和模型经常受到关注,但往往被忽视的英雄是数据预处理。数据预处理是一个重要的步骤,它将原始数据转化为用于有效机器学习的特征。

机器学习算法通常在训练时假设所有特征对最终预测的贡献相等。然而,当特征在范围和单位上有所不同时,这个假设就会失效,从而影响它们的重要性。

输入归一化 – 数据预处理中的一个重要步骤,确保特征的数值大小的一致性。这种一致性避免了具有较大值的特征或变量对其他特征或变量的主导。

在本文中,我们将深入探讨归一化,一种特征缩放技术,它提供了一种平衡特征尺度的方法。

什么是归一化?

归一化是一种特定的特征缩放形式,它将特征的范围转换为标准尺度。归一化和其他数据缩放技术只在数据集具有不同范围的特征时才需要。归一化涵盖了针对不同数据分布和模型要求的多种技术。

标准化不仅限于数值数据。然而,在本文中,我们将重点关注数值示例。如果您计划对文本数据进行机器学习的预处理,请务必查看Datacamp的Textacy:Python中文本数据清洗和标准化的入门教程。

为什么要对数据进行归一化?

归一化数据可以提高模型性能,提高模型的准确性。它可以帮助依赖于距离度量的算法,如k最近邻支持向量机,防止具有较大尺度的特征在学习过程中占主导地位。

归一化在优化过程中促进稳定性,促进基于梯度的训练过程中更快的收敛。它减轻了与梯度消失或梯度爆炸相关的问题,使模型能够更高效地达到最优解。

标准化的数据也更容易解释,因此更容易理解。当数据集的所有特征都在相同的尺度上时,也更容易识别和可视化不同特征之间的关系,并进行有意义的比较。

让我们举一个简单的例子来突出数据归一化的重要性。我们正在尝试根据各种特征(如平方英尺、卧室数量和距离超市的距离等)来预测房屋价格。数据集包含具有不同尺度的多样特征,例如:

  • 面积:从500到5000平方英尺不等
  • 卧室数量:从1到5间不等
  • 距离超市:从0.1到10英里不等

当您将这些数据直接输入机器学习模型进行训练时,算法可能会更加重视具有较大规模的特征,例如面积。在训练过程中,算法假设总面积的变化将对房价产生重大影响。算法可能会忽视相对较小的特征细节,例如卧室数量和距离超市的距离。这种偏重可能导致模型性能不佳和预测结果带有偏见。

通过对特征进行归一化,我们可以确保每个特征在模型的学习过程中贡献的比例相等。模型现在可以更有效地学习所有特征之间的模式,从而更准确地表示数据中的潜在关系。

归一化技术一览

最小-最大缩放和Z-score标准化是归一化的两种基本技术。除此之外,我们还将讨论十进制缩放归一化、对数缩放归一化和鲁棒缩放,这些技术解决了数据预处理中的独特挑战。

最小-最大缩放

最小-最大缩放通常被简称为“归一化”。它将特征转换到指定的范围,通常在0和1之间。最小-最大缩放的公式如下:

Xnormalized = X – Xmin / Xmax – Xmin

的中文翻译如下:

X归一化 = X – X最小值 / X最大值– X最小值

其中X是要进行归一化的随机特征值。Xmin是数据集中的最小特征值,而Xmax是最大特征值。

  • 当X的值最小时,分子为零(Xmin – Xmin),因此,归一化值为0
  • 当X的值最大时,分子等于分母(Xmax – Xmin),因此,归一化值为1
  • 当X既不是最小值也不是最大值时,归一化值介于0和1之间。这被称为最小-最大缩放技术

最小-最大缩放是一个不错的选择,当:

  • 已知数据集的上下界,且数据集中几乎没有异常值
  • 当数据分布未知或非高斯分布,并且数据在整个范围内近似均匀分布
  • 当保持分布的原始形状至关重要时

Z-score标准化

Z-score标准化假设数据服从高斯(钟形曲线)分布,并将特征转换为均值(μ)为0,标准差(σ)为1。标准化的公式如下:

Xstandardized = X−μ / σ

的中文翻译如下:

标准化后的X = X−μ / σ

这种技术在处理假设数据服从正态分布的算法时特别有用,比如许多线性模型。与最小-最大缩放技术不同,标准化技术中特征值不受特定范围的限制。这种归一化技术基本上是以标准差的数量来表示特征与均值之间的差异。

在我们深入探讨其他数据转换技术之前,让我们先进行归一化(最小-最大缩放)和标准化的比较。

归一化

标准化

目标是将特征的值限制在特定范围内,通常在0和1之间。

目标是将特征的值转换为均值为0,标准差为1

敏感于异常值和数据范围。

由于使用了均值和标准差,对异常值不太敏感

在保持原始范围的重要性时非常有用

当算法假设为标准正态分布时有效

不对数据的分布做任何假设

假设服从正态分布或近似正态分布

适用于绝对值及其关系重要的算法(例如,k最近邻算法,神经网络)。

对于假设数据服从正态分布的算法特别有用,例如线性回归和支持向量机

保持原始值在指定范围内的可解释性。

改变了原始值,使解释更具挑战性,因为尺度和单位发生了变化

可以加快收敛速度,尤其是对于依赖于梯度下降的算法来说

还有助于更快地收敛,特别是对于对输入特征的规模敏感的算法

使用场景:图像处理、神经网络、对特征尺度敏感的算法

使用情况:线性回归,支持向量机,假设正态分布的算法

十进制缩放归一化

十进制缩放归一化的目标是通过10的幂次对特征值进行缩放,确保每个特征中的最大绝对值小于1。当数据集中的值范围已知但在特征之间变化时,这种方法非常有用。十进制缩放归一化的公式如下:

X十进制 = X / 10d

其中X是原始特征值,d是最小的整数,使得特征中的最大绝对值小于1。

例如,如果一个特征中的最大绝对值为3500,则d将为3,并且该特征将按103进行缩放。

十进制缩放归一化在处理数据集时具有优势,其中数值的绝对大小比它们的具体比例更重要。

对数缩放归一化

对数缩放归一化将数据转换为对数尺度,通过对每个数据点取对数来实现。当处理跨越多个数量级的数据时,它特别有用。对数缩放归一化的公式如下:

Xlog = log(X)

这种归一化在数据遵循指数增长或衰减模式时非常有用。它压缩了数据集的尺度,使模型更容易捕捉数据中的模式和关系。人口数量随年份变化是一个好的例子,其中一些特征呈指数增长。对数缩放归一化可以使这些特征更易于建模。

鲁棒缩放归一化

在处理具有异常值的数据集时,鲁棒缩放归一化非常有用。它使用中位数和四分位距(IQR)而不是均值和标准差来处理异常值。鲁棒缩放的公式如下:

Xrobust = X – 中位数 / 四分位距

由于鲁棒缩放对异常值的影响具有弹性,因此它适用于具有偏斜或异常值的数据集。

常见的归一化陷阱和最佳实践
我们已经讨论了归一化以及它在机器学习中的用途。尽管强大,但归一化也面临一些挑战。从处理异常值到根据数据集选择最合适的技术,解决这些问题对于发挥机器学习模型的全部潜力至关重要。

处理异常值

异常值是数据集中与常态显著偏离并扭曲归一化技术有效性的数据点。如果您不处理数据中的异常值,这些异常值可能会导致扭曲的转换。您可以使用之前讨论过的鲁棒缩放归一化技术来处理异常值。

另一种策略是应用修剪或温索化,其中我们识别并将所有特征值上限(或下限)到一个固定值。

选择归一化技术

我们已经讨论了最常用的归一化技术,但还有许多其他选择。选择合适的技术需要对数据集有细致的理解。在数据预处理时,您需要尝试多种归一化技术,并评估它们对模型性能的影响。通过实验,您可以观察每种方法对学习过程的影响。

你需要对数据的特征有深入的了解。考虑特定归一化技术的假设是否与数据集中的分布和模式相符。

稀疏数据上的归一化

当处理许多特征值为零的稀疏数据时,归一化可能会带来挑战。直接应用标准的归一化技术可能会导致意想不到的后果。我们上面讨论的归一化技术中有一些是专门为稀疏数据设计的,例如“稀疏最小-最大缩放”。

在进行归一化之前,考虑对数据集中的缺失值进行填充或处理。这通常是在探索数据集并清理数据以供机器学习模型使用时的第一步之一。

请务必查看DataCamp的Python机器学习特征工程课程,该课程将为您提供实践经验,教您如何为自己的机器学习模型准备数据。在课程中,您将使用Stack Overflow开发者调查和历史上的美国总统就职演讲,了解如何最佳地预处理和工程化分类、连续和非结构化数据的特征。

归一化和过拟合的风险

在机器学习中,过拟合发生在模型不仅学习了训练数据中的基本模式,还捕捉到了噪声和随机波动。这可能导致模型在训练数据上表现出色,但无法推广到新的、未见过的数据。

仅仅进行归一化可能不会导致过拟合。然而,当归一化与其他因素结合,如模型的复杂性或不足的正则化时,它可能会导致过拟合。当使用整个数据集(包括验证集或测试集)计算归一化参数时,可能会导致数据泄漏。模型可能会无意中从验证集或测试集中学习信息,从而损害其泛化能力。

因此,为了减轻过拟合的风险,对训练集进行归一化,并将相同的归一化参数应用于验证集和测试集。这样可以确保模型在学习训练数据时不受验证集或测试集中的信息的影响,从而实现泛化。

您需要实施适当的正则化技术来惩罚过于复杂的模型。正则化有助于防止模型在训练数据中拟合噪声。使用适当的验证技术,如交叉验证,来评估模型在未见数据上的性能。如果在验证过程中检测到过拟合,可以进行调整,例如减少模型复杂度或增加正则化。

使用Scikit-learn在Python中实现归一化
Scikit-learn是一个多功能的Python库,旨在简化机器学习的复杂性。它提供了丰富的工具和功能,用于数据预处理、特征选择、降维、模型构建和训练、模型评估、超参数调整、模型序列化、流水线构建等。其模块化设计鼓励实验和探索,使用户能够从基本概念无缝过渡到高级方法。我们将使用scikit-learn将我们学到的知识付诸实践。我们将使用经典且广泛使用的`鸢尾花数据集`。这个数据集是由英国生物学家和统计学家罗纳德·A·费舍尔于1936年引入的。鸢尾花数据集包括来自三种不同鸢尾花品种(山鸢尾、变色鸢尾和维吉尼亚鸢尾)的四个特征的测量数据。

每朵花都有四个特征进行测量,它们分别是萼片长度、萼片宽度、花瓣长度和花瓣宽度,单位都是厘米。数据集中有150个实例(样本),每个物种有50个样本。鸢尾花数据集通常用于分类任务,目标是在三个类别中预测正确的物种。然而,今天我们将使用这个数据集来展示在应用归一化(最小-最大缩放)和标准化时数据的转换。

您可以在Datacamp的工作区中执行下面讨论的Python代码,以便自己探索数据集。

让我们从导入我们需要的库开始…

import numpy as np
import pandas as pd
# 导入数据集
from sklearn.datasets import load_iris
# 用于将数据集分割为训练集和测试集
from sklearn.model_selection import train_test_split
# 用于最小-最大归一化
from sklearn.preprocessing import MinMaxScaler
# 用于Z标准化
from sklearn.preprocessing import StandardScaler

# 从Scikit-learn包中加载鸢尾花数据集
iris = load_iris()

# 打印数据集的特征和统计信息
print(iris.DESCR)

# 将数据分为特征(X)和目标(Y)
# 将数据转换为pandas的数据框
X = pd.DataFrame(iris.data)

# 将目标属性与其他数据列分开
Y = iris.target

# 查看数据框
X.head()

# 打印数据框的形状(150行4列)
X.shape()

这段文字翻译成中文如下:在应用归一化之前,将数据集分为训练集和测试集是一个好的做法。我们将使用sklearn.model_selection中的train_test_split功能来实现。在这个练习中,我们不会划分出验证集,因为我们不会进行实际的机器学习建模。我们将以80-20的比例划分数据集,这意味着训练集将有120行,测试集将有剩下的30个数据点。

# 将数据集分为训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, Y ,test_size=0.2)

在加载数据并将数据分为训练集和测试集之后,通常的步骤是进行数据清洗、数据填充以处理缺失值和处理数据异常值。然而,由于本文的重点是归一化,我们将跳过这些预处理步骤,直接看归一化的实际操作。

我们现在将使用最小-最大归一化技术将这些数据转化为0-1厘米的范围内。为了归一化数据,我们将使用sklearn库中的MinMaxScaler功能,并将其应用于我们的数据集;我们已经在之前导入了所需的库。

# 保持原始数据框不变以便重复使用是一个好习惯
X_train_n = X_train.copy()
X_test_n = X_test.copy()
 
# 在训练数据上拟合最小-最大缩放器
norm = MinMaxScaler().fit(X_train_n)
 
# 转换训练数据
X_train_norm = norm.transform(X_train_n)
 
# 使用相同的缩放器转换测试集
X_test_norm = norm.transform(X_test_n)

我们可以打印训练数据来查看发生的转换。然而,让我们将数据集转换为pandas数据框,然后使用describe()功能来查看其统计描述。

X_train_norm_df = pd.DataFrame(X_train_norm)
 
     	# 为了方便阅读,将原始特征名称赋值给X_train_norm_df的列名
X_train_norm_df.columns = iris.feature_names
 
X_train_norm_df.describe()

这将给出归一化的以下结果:

翻译成中文为:

在这里,最小值和最大值的统计数据表明,所有特征的范围都已经转换为0-1厘米的范围。这就是我们的目标转换!现在我们将执行标准化(Z-score标准化),按照与归一化相同的步骤进行:

X_train_s = X_train.copy()
X_test_s = X_test.copy()

# 将标准化缩放器拟合到训练数据上
stan = StandardScaler().fit(X_train_s)

# 转换训练数据
X_train_stan = stan.transform(X_train_s)

# 使用相同的缩放器转换测试集
X_test_stan = stan.transform(X_test_s)

# 将转换后的数据转换为pandas数据框
X_train_stan_df = pd.DataFrame(X_train_stan)

# 为了方便阅读,分配原始特征名称
X_train_stan_df.columns = iris.feature_names

# 查看统计描述
X_train_stan_df.describe()

这将给出标准化的以下结果:

Z标准化的目标是将特征的值转换为具有均值为0和标准差为1的值。从生成的数据框的描述中可以看出,所有四个特征的均值都接近零,标准差为1。

我们现在可以将这些转换后的数据输入到机器学习算法中进行训练。

最后的思考

在本文中,我们通过最小-最大缩放、Z-标准化、十进制缩放和对数缩放归一化的方法进行了探索。每种技术都展示了其独特的优势和用处。您还了解了在执行归一化时的一些常见陷阱和最佳实践。最后,我们通过使用scikit learn应用了一些新获得的知识。

要了解更多我们所涵盖的概念和过程,请查看我们关于Python中的机器学习特征工程Python中文本数据清洗和规范化的介绍的课程。

抱歉,我无法翻译视频和图片标签,也无法保留代码块。以下是我对文本的翻译:

“你是一个翻译员。”