5个必须掌握的机器学习数据预处理技术
在几乎所有的组织中,信息质量的水平都处于相同的低水平。数据无处不在!此外,它是许多现实世界问题的核心。作为数据科学家和机器学习工程师,我们大部分时间都在与数据打交道。掌握它是非常重要的!标题图片由作者创建。
5个必须掌握的机器学习数据预处理技术
从缺失数据到不平衡数据集:成功的全面数据科学指南
在几乎所有的组织中,信息质量的水平都处于相同的低水平。
- Olson, Data Quality
数据无处不在!此外,它是许多现实世界问题的核心。作为数据科学家和机器学习工程师,我们大部分时间都在与数据打交道。掌握它是非常重要的!标题图片由作者创建。
概览
通过有效的预处理技术解锁数据的力量
在机器学习中,从原始数据到经过良好调整的模型的路径是由预处理技术铺就的,这些技术为成功铺平了道路。数据科学家和机器学习工程师花费大量时间准备数据,因为干净、结构良好和经过工程处理的数据可以带来更好的模型性能和洞察力。
我们都听说过:
垃圾进,垃圾出!
这篇博客探讨了每个数据科学家必须掌握的五种关键预处理技术:处理缺失数据、缩放和归一化、编码分类数据、特征工程和处理不平衡数据。每个主题对于将混乱的现实世界数据集转化为机器学习算法真正能够学习的内容至关重要。
这份全面的指南将涵盖您需要了解的有关数据预处理的所有内容,无论是清理数据集、缩放特征、编码分类变量还是对抗类别分布中的不平衡。我们将提供理论基础、实际的Python示例、最佳实践和高级策略,确保您能够像专业人士一样处理您的数据预处理。
目录
· 1. 处理缺失数据
· 2. 缩放和归一化
· 3. 编码分类数据
· 4. 特征工程
· 5. 处理不平衡数据
· 结论
· 行动号召
1. 处理缺失数据
为什么缺失数据很重要
缺失数据是现实世界机器学习项目中不可避免的挑战。数据集通常由于传感器故障、人为错误或其他原因而有缺失值。如果处理不当,缺失数据可能导致模型预测有偏见、洞察力误导或甚至训练失败。在训练任何模型之前,以保留数据集完整性的方式处理缺失值至关重要。
这一部分将介绍使用Python、pandas和sklearn处理缺失数据的最常见技术。我们将探索策略,如列表删除、均值/众数插补和高级技术,如多变量插补。
缺失数据类型
- 完全随机缺失(MCAR):
缺失数据点的概率与任何其他观察到的或未观察到的样本无关。在这种情况下,删除数据可能不会引入偏见,因为它是随机的。 - 随机缺失(MAR):
数据点的缺失性取决于其他观察到的变量,但与缺失值本身无关。这在调查或人口统计数据集中很常见,例如,缺失的收入数据可能与教育水平有关。 - 非随机缺失(MNAR):
缺失性与未观察到的数据本身有关。例如,高收入人群可能不太可能透露他们的收入,如果不谨慎处理,这可能会对数据集产生偏见。
策略1:列表删除(删除缺失数据)
处理缺失数据的最简单方法是删除包含缺失值的行。虽然这对于少数缺失条目的小数据集有效,但对于频繁出现缺失数据的大型数据集来说,这不太实用,因为它会导致宝贵信息的丢失。
首先,我们来模拟一个包含缺失值的小数据集:
现在,我们将通过删除包含任何缺失值的行来实现列表删除:
注意到包含一个或多个缺失值的样本(即行)已从数据集中删除。
最佳实践。 谨慎使用列表删除。它只适用于缺失数据为MCAR或删除行不会显著影响数据集完整性的情况。
策略2:插补方法(填充缺失数据)
如果删除数据不是一个选项,使用统计量(例如,均值、中位数或众数)插补缺失值。插补允许模型使用所有可用信息,确保没有数据被丢弃。
均值/中位数插补
我们通常使用列中观察到的值的均值(或中位数)来插补数值数据。这种方法在数据对称分布时效果很好,但在偏斜分布中可能会引入偏见。
这里,Price和SquareFeet中的缺失值被可用数据的均值替换。
最佳实践。 对于数值数据,均值插补对最小偏斜的数据有效;对于偏斜数据,请考虑使用中位数。
策略3:分类数据的众数插补
我们不能使用均值来插补分类数据(例如,性别或国家)。相反,我们使用众数。因此,我们用最常出现的类别填充缺失值。
在上面,Name和Country列中的缺失值已经用每个列中最频繁的值填充。
最佳实践。 对于分类数据,众数插补效果很好,特别是对于性别或国家等特征,其中最常见的值是有意义的。
策略4:高级技术 - 链式方程的多变量插补(MICE)
像均值或众数这样的简单插补方法可能会引入偏见,特别是在复杂的数据集中。在这种情况下,我们可以使用链式方程的多变量插补(MICE)。这种技术基于多个特征之间的关系预测缺失值。
MICE迭代地将每个带有缺失值的特征建模为其他特征的函数,使用回归或其他预测模型。这种方法更准确,更好地考虑了数据的结构。
最佳实践:对于特征之间存在复杂相互依赖的数据集,主要当简单插补可能引入偏见时,使用MICE。
结论:选择正确的插补策略
处理缺失数据是预处理流程中的关键步骤。
虽然列表删除在某些情况下可能有帮助,但通常需要插补缺失值以保留数据集中的宝贵信息。根据您数据的性质,您可以选择简单的技术,如均值/众数插补,或更高级的方法,如MICE,以获得更好的准确性。
关键要点:
- 对于小型数据集和最小缺失值,使用列表删除。
- 对于数值数据,均值/中位数插补有效;众数插补最适合分类数据。
- 对于更复杂的数据集,请考虑高级技术(例如,MICE)。
正确的插补策略保留了您数据集的完整性,并为构建健壮的机器学习模型奠定了坚实的基础。
2. 缩放和归一化
为什么缩放和归一化至关重要
许多机器学习算法,特别是涉及基于距离的度量(例如,k最近邻或支持向量机)或基于梯度的优化器(例如,逻辑回归和神经网络),都假设特征在相似的尺度上。
当特征在它们的范围内变化时(例如,一个特征在[0, 1]范围内,另一个在[1,000, 100,000]范围内),它可能会误导这些算法,因为它们对特征进行不成比例的加权。
我们可以通过应用缩放和归一化来解决这个问题。这些方法根据数据分布和机器学习模型以不同的方式调整特征值。
接下来,我们将讨论最常见的缩放和归一化方法的理论基础和实际实现,包括最小-最大归一化和Z分数标准化,以及每种技术的应用时机和数学基础。
理论:缩放和归一化之间的区别是什么?
归一化通常指的是将数据重新缩放到特定范围内,通常是[0, 1]。它通常用于数据不遵循高斯分布的情况。
缩放(也称为标准化)指的是调整值的分布,使其均值为0,标准差为1。它通常应用于遵循高斯(即正态)分布的数据;它通常用于依赖于梯度下降的算法(例如,逻辑回归或神经网络)。
缩放的重要性:实际影响
一些算法对输入特征的相对尺度敏感:
- 基于距离的算法,如k最近邻和k均值聚类,假设特征具有相似的尺度,因为它们依赖于欧几里得距离。如果一个特征的范围比其他特征大得多,它将主导距离度量。
- 基于梯度的算法,如神经网络和逻辑回归,从标准化数据中受益,以防止梯度下降振荡和缓慢收敛。
其他算法(例如,决策树)不受缩放影响,因为它们基于不依赖于距离度量的分割标准。
最小-最大归一化
最小-最大归一化是最简单和最广泛使用的归一化,它将特征值重新缩放到固定范围,通常是[0, 1],如下所示:

当您事先知道最小/最大值,或者特征具有预定义范围时(例如,年龄范围、温度),这种技术有效。
让我们重新审视我们模拟的房价数据集以实现最小-最大归一化。
让我们应用最小-最大归一化,它将值重新缩放到0和1之间。
如您所见,Price、Bedrooms和SquareFeet特征已经被重新缩放到[0, 1]范围内。
Z分数标准化(标准缩放)
当数据遵循高斯分布或其期望值接近零时,首选Z分数标准化。
为什么使用Z分数标准化?
- 确保每个特征对模型的贡献相等。
- 它对于假设数据正态分布的算法很有帮助。
Mathematical Example
给定相同的数据集,我们现在应用Z分数标准化:

其中μ是特征的均值,σ是标准差。
每个列现在具有零均值和1的标准差,确保方差较大的特征不会不成比例地影响模型的性能。
最小-最大归一化与Z分数标准化
最小-最大归一化最适合:
- 您的数据不遵循正态分布。
- 您的模型对数据范围有假设(例如,具有sigmoid或tanh激活函数的神经网络,它们期望输入在特定范围内)。
- 您希望保留最小值和最大值之间的关系。
另一方面,Z分数标准化最适合使用时:
- 您的数据遵循高斯(即正态)分布。
- 您使用的模型,如逻辑回归、支持向量机或神经网络,假设输入标准化以获得最佳性能。
- 您需要特征围绕零中心,这可以防止梯度下降中的慢收敛问题。
潜在陷阱和最佳实践
异常值。
如果您的数据包含显著的异常值,Z分数标准化可能会过度放大它们的影响,因为它依赖于均值和标准差。考虑在标准化之前删除异常值或应用稳健的缩放技术。
数据泄露。
始终在训练数据上拟合您的缩放器之前将其应用于测试集。这可以防止数据泄露,即测试集中的信息影响训练过程。
结论:缩放和归一化至关重要
缩放和归一化是许多机器学习算法的关键预处理步骤。
最小-最大归一化非常适合保留数据中的关系(例如,在图像数据或神经网络中);Z分数标准化适用于基于距离或基于梯度的模型,这些模型要求特征具有相似的统计属性。
关键要点:
- 最小-最大归一化将数据重新缩放到固定范围,通常是[0, 1],对于对输入的相对大小敏感的模型很有帮助。
- Z分数标准化将数据围绕零中心,并调整方差,这对于基于梯度下降的算法至关重要。
- 始终根据您的数据分布和特定的机器学习算法选择缩放技术。
通过正确应用这些技术,您可以确保您的模型具有最佳的学习基础,从而提高性能和更好的泛化能力。
3. 编码分类数据
编码分类数据的重要性
大多数机器学习算法,特别是那些基于数值计算的算法,都期望输入是数值型的。然而,现实世界的数据集通常包含分类数据,如性别、国家或产品类型,这些数据在训练机器学习模型之前必须转换为数值形式:编码。
挑战在于确保编码正确捕获分类变量之间的关系,而不引入偏见。例如,给类别分配任意数字可能会无意中暗示它们之间的排名,无论是否存在。
接下来,我们将探索几种编码技术,如标签编码和独热编码,并讨论每种方法最合适的情况。我们还将触及更高级的技术,如目标编码。
标签编码
标签编码为每个类别分配一个唯一的整数。虽然这种方法简单,但它主要适用于序数变量(类别具有固有顺序)。它可能会为名义变量(类别无序)引入意外的序数关系。
示例:
颜色:[红色,绿色,蓝色] -> [1, 2, 3]
然而,这可能意味着红色<绿色<蓝色是不正确的。
何时使用:
- 标签编码通常用于具有序数关系的分类变量(即类别具有固有排名,如[低,中,高])。在这种情况下,数值编码保留了顺序。
- 对于名义(无序)变量,请谨慎使用标签编码,因为它可能引入错误的顺序感。
在这种情况下,标签编码有效,因为教育水平可以排名。然而,如果变量代表名义(例如,国家),那么这种编码将是不适当的,因为它会暗示国家之间的序数关系。
独热编码
这种方法将每个类别转换为一个新的二进制列(或特征)。每个列对应一个单一类别,如果类别存在则标记为一,否则为0,适合名义变量。
示例:
颜色:[红色,绿色,蓝色]
独热编码:
红色 -> [1, 0, 0]
绿色 -> [0, 1, 0]
蓝色 -> [0, 0, 1]
何时使用:
- 独热编码适用于名义(无序)变量(例如,性别,国家或颜色)。这种方法避免了引入虚假的序数关系。
- 缺点是独热编码可能会显著增加数据集的维度,特别是当您有很多唯一类别时。
在这里,Animal列中的每个唯一类别都被表示为一个新的二进制列,原始值被替换为1或0。这确保了没有引入人为的排序。
潜在陷阱:维度的诅咒
独热编码适用于具有少量唯一类别的数据集。然而,当应用于具有许多唯一值的列时,它可以大幅增加数据的维度,使模型更倾向于过拟合或计算成本更高。
示例:对于具有10,000个唯一类别的数据集(例如,邮政编码列表),独热编码将增加10,000个额外的列。在这种情况下,可能更适合使用更高级的技术,如目标编码。
高级编码技术:目标编码
这种方法根据每个类别的目标变量均值对类别进行编码。这在分类特征有许多水平时很有用,但如果不小心执行,可能会引入过拟合。
何时使用:
- 目标编码可以在分类变量有许多唯一类别时使用(例如,邮政编码,产品ID或用户名)。
- 这种方法用每个类别的目标变量均值替换分类值,允许模型在不大幅增加特征数量的情况下捕获模式。
注意:目标编码可能会导致过拟合,特别是如果模型可以记忆类别和目标之间的关系。为了减轻这一点,应应用交叉验证或正则化等技术。
Mathematical Formula
对于类别_Cᵢ,目标编码是:

其中:
- _yₓ_是目标变量(例如,房屋的销售价格)。
- _Cᵢ_是类别值。
- 每个类别的平均目标值用作编码。
在这里,每个社区都被替换为该社区的平均房价。这比简单地使用独热编码或标签编码提供了更有信息量的类别表示,特别是当类别计数很大时。
最佳实践。 使用目标编码时,始终应用交叉验证以避免过拟合。一个常见策略是在训练数据上计算目标编码,然后将其应用于验证/测试集,以确保没有数据泄露。
结论:选择正确的编码策略
编码分类数据是机器学习中的关键预处理步骤。正确的编码策略取决于您的分类变量的性质。我们介绍的三种传统技术如下。
- 标签编码最适合类别具有自然顺序的序数变量。
- 独热编码是名义变量(类别数量较少)的最佳选择。
- 目标编码是高基数分类变量的更高级解决方案,应谨慎使用以避免过拟合。
关键要点:
- 始终仔细选择保留分类变量属性的编码方法。
- 独热编码多功能,但可能导致大型类别集的维度问题。
- 对于大型数据集,请考虑目标编码,但使用技术以避免过拟合。
通过应用适当的编码方法,您可以确保您的机器学习模型充分利用分类数据,同时避免常见陷阱。
4. 特征工程
特征工程的重要性
特征工程通常被认为是机器学习的核心,在这里,领域知识和创造力相交,将原始数据转化为有意义的输入,提高模型性能。
原始数据在其初始形式可能不适合直接输入到机器学习算法中。特征工程使我们能够从数据中提取额外的洞察力和关系。
这一部分将探讨关键的特征工程技术,如创建多项式特征,生成交互项,使用对数变换处理偏斜数据,以及分箱连续变量。
多项式特征
多项式特征允许机器学习模型捕获特征和目标变量之间的非线性关系。通过添加高阶项,如_x²_或_x₁×x₂_,我们可以提高模型学习复杂模式的能力。
数学上,给定一个特征_x_,二度多项式特征是:
新特征 = x²
对于两个特征_x₁_和_x₂_,交互项将是:
交互项 = x₁×x₂让我们使用包含房价、卧室数量和平方英尺等特征的数据集。我们将生成多项式特征以捕获原始特征之间的交互。
生成多项式特征
我们将使用scikit-learn PolynomialFeatures生成特征的多项式和交互项。
在这个例子中,新的Bedrooms^2和SquareFeet^2列代表平方项。此外,Bedrooms SquareFeet列代表交互项,这允许模型学习这两个特征如何相互作用。
对数变换
对数变换有助于管理偏斜数据——这是现实世界数据集中的常见现象。
像收入、房价和人口规模这样的特征通常有一个长尾,应用对数变换可以使这些分布更加对称,从而带来更好的模型性能。
当一个特征高度偏斜时,对数变换可以规范化分布,使其更适合机器学习模型。例如,收入或人口数据通常有严重的右偏。应用对数变换有助于压缩大值并拉伸小值,减少偏斜:
对数变换特征 = log(x + 1)
加上常数一是为了避免对零取对数。
假设我们的数据集中的房价是偏斜的。我们希望应用对数变换来压缩大值并分散小值。
Log_Price列现在包含了Price列的对数变换值。这种变换减少了巨大值的影响,可以帮助模型更有效地从数据中学习。
分箱
分箱是将连续变量划分为区间(即箱子)。当您想要简化数据或创建有意义的组时,这个技术很有用。这个技术通过将特征转换为类别(例如,低、中、高)来限制特征的范围或使数据更易于解释。
在这里,我们已经将房价分为三个类别:Low、Medium和High。当模型可能从简化的类别值而不是连续值中受益时,这可能很有用。
处理高基数特征散列的散列
另一个常见问题是当一个特征有许多唯一类别(即高基数)时,如邮政编码、产品ID或用户ID。在这种情况下使用传统的独热编码可能会大幅增加数据集的维度,导致内存效率低下和计算时间更长。我们可以使用特征散列(即散列技巧)来降低维度并保留基本数据模式。
Mathematical Explanation
特征散列使用哈希函数将类别转换为整数,并将它们分配到固定数量的“桶”(即列)。这种方法避免了创建成千上万甚至数百万的独热编码列。
通过特征散列,每个ProductID被映射到四个桶中的一个,降低了维度,同时保持了区分类别的能力。
结论:特征工程的力量
特征工程是机器学习工程师工具包中最有力的工具之一。
通过将原始数据转换为更好地表示底层关系的特征,我们使模型能够更有效地学习并做出更准确的预测。
无论您是创建多项式特征、规范化偏斜数据还是分箱连续变量,特征工程在提高模型性能中起着关键作用。
关键要点:
- 多项式特征允许模型通过引入高阶项和交互项来捕获非线性关系。
- 对数变换有助于处理偏斜数据,使其规范化,更适合机器学习算法。
- 分箱将连续变量转换为类别箱,简化数据并使其更易于解释。
- 特征散列是处理高基数分类变量时降低维度的有价值技术。
通过掌握这些技术,您可以显著提高模型的准确性和鲁棒性,帮助您将原始数据转化为可行的洞察。
5. 处理不平衡数据
不平衡数据的挑战
现实世界机器学习应用中最常见的挑战之一是不平衡数据。
不平衡数据是指一个类别或标签在数据集中显著多于其他类别。例如,在欺诈检测中,欺诈交易的数量通常远小于非欺诈交易。如果不加以处理,这种不平衡可能导致模型在多数类上表现良好,但在少数类上表现不佳。
不平衡的数据集可能导致模型对多数类产生偏见,因为错误分类少数实例的成本远小于实例。因此,应用考虑这种不平衡的技术至关重要,以确保模型准确捕获少数类和多数类。
这一部分将介绍各种处理不平衡数据的技术,包括重采样方法,如过采样和欠采样,类别权重和高级合成少数过采样技术(SMOTE)。
这是我在2020年CVPR研讨会上发表的关于不平衡数据的过去论文。
不平衡数据的数学和理论
在处理不平衡的数据集时,有几个标准指标和定义需要记住:
不平衡比率:
不平衡比率量化了多数类和少数类之间的不平衡程度。对于二元分类问题:

精确度、召回率和F1分数:
准确率——我们所有正确预测(正面和负面)的百分比——对于不平衡数据来说,单独作为性能指标并不理想,因为它可能掩盖模型在少数类上的糟糕表现。
精确度、召回率和F1分数等指标帮助我们更好地了解模型在每个类别上的表现。
-
精确度问:我们的预测中有多少百分比是正确的?
-
**召回率(敏感性)**问:我们捕获了多少百分比的准确预测?
-
F1分数(精确度和召回率的调和平均数):一个结合上述值的单一数字。适合排名/排序和不平衡类别
ROC曲线和AUC:
ROC曲线绘制真正例率(召回率)与假正例率。AUC(曲线下面积)是用于不平衡数据集的标准指标,评估模型区分类别的能力,而不考虑它们的分布。见图示。
ROC绘制真正例率(TPR)与假正例率(FPR)。曲线下的最大面积(AUC)为1。完全随机预测的AUC为0.5。因此,AUC等于随机正例被排在随机负例之上的概率。这种指标的优点是它是连续的——由作者创建的图表。
技术1:类别权重
类别权重是与模型一起使用的标准方法,允许您为少数类分配更高的权重。通过这样做,模型将少数类中的错误视为更昂贵,鼓励模型从少数示例中学习。
许多机器学习算法,如逻辑回归、SVM和决策树,都有一个class_weight参数,可以设置为balanced。此参数根据每个类别的频率自动调整权重。
类别权重提高了少数类的召回率,确保模型更多地关注少数实例。
当然,这里是从“技术2:随机过采样”开始的后续内容翻译:
技术2:随机过采样
随机过采样涉及复制少数类的实例以平衡数据集。这是一种简单而有效的方法,但如果模型开始记忆重复的实例,它可能导致过拟合。
现在少数类与多数类平衡了。过采样可能会引入过拟合,特别是如果少数类的实例被多次重复。
技术3:随机欠采样
随机欠采样涉及移除多数类的实例以平衡数据集。这种方法可能会导致多数类中有价值的数据丢失,但它有助于减少训练时间和内存消耗,特别是对于大型数据集。
在这里,随机欠采样通过减少多数类实例的数量来平衡数据集。当多数类的数量显著超过少数类时,这种方法是合适的。
技术4:合成少数过采样技术(SMOTE)
SMOTE是一种先进的过采样技术,它通过在现有实例之间进行插值来创建少数类的合成实例。这种方法生成更多样化的少数类实例,减少了与随机过采样相比过拟合的风险。
SMOTE的数学解释:
给定一个少数类实例 ( x_i ),SMOTE通过从其k个最近邻中选择一个随机实例 ( x_{\text{neighbor}} ) 并生成一个新样本:
[ \text{新样本} = x_i + \lambda (x_{\text{neighbor}} - x_i) ]
其中 ( \lambda ) 是一个介于0和1之间的随机数。
SMOTE创建了新的少数类合成样本,平衡了数据集,同时避免了随机过采样的过拟合风险。
评估不平衡数据上的模型
如上所述,使用适当的评估指标来反映模型在两个类别上的表现至关重要,尤其是在处理不平衡数据集时。
在这个例子中,精确度和召回率指标提供了对模型识别少数类的深度理解,这对于不平衡数据集至关重要。
结论:有效处理不平衡数据
不平衡数据集是机器学习中的一个常见问题,如果处理不当,会显著影响模型的性能。通过应用适当的重采样技术,如类别权重、过采样、欠采样或SMOTE,您可以创建平衡的数据集,从而获得更好的模型性能。
关键要点:
- 类别权重通过为错误分类分配更高的成本,调整模型更多地关注少数类。
- 随机过采样和欠采样是简单但有效的方法来平衡您的数据集,尽管它们可能引入过拟合或信息丢失。
- SMOTE生成少数类的合成示例,创建更多样化的训练集,减少过拟合的可能性。
- 在处理不平衡数据时,使用适当的评估指标,如精确度、召回率和F1分数,因为准确率可能会误导。
应用这些技术和评估指标,您可以构建更健壮的模型,即使在处理不平衡数据时也能很好地泛化。
结论
预处理是机器学习的支柱
数据预处理常被忽视,但它是任何成功机器学习项目的支柱。即使是最先进的算法,如果没有正确处理数据,也会努力做出准确的预测。这篇博客涵盖了从处理缺失数据和缩放数值特征到编码分类变量、工程化有见地的特征和处理不平衡数据集的所有内容。
通过掌握这些技术,您可以确保您的机器学习模型表现最佳、公平并且能够很好地泛化到未见数据。数据预处理不仅仅是机器学习流程中的一个步骤——它是一门手艺,如果做得正确,它为健壮、可扩展和有影响力的模型奠定了基础。
现在您已经了解了这些预处理技术,是时候将它们应用到您的项目中了。尝试不同的方法,评估它们的影响,并记住数据的质量决定了模型的质量。从今天开始通过预处理提升您的机器学习水平。
行动号召
你怎么看?您是否有其他对您有效的数据预处理技巧?您觉得这篇帖子有帮助吗?如何有帮助,如何没有?在下面的评论中分享你的想法,以便其他人和我都受益。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)