如何为机器学习移除异常值?

2025年2月28日 | 阅读 16 分钟
How to Remove Outliers for Machine Learning?

极端值很少出现,并且通常代表不适合数据分布一般模式的未被表征的案例。在机器学习中,异常值可能导致结果的剧烈波动,并对模型的准确性产生不利影响。识别和移除异常值是机器学习数据准备中的关键步骤。

异常值是远离其他观测值的数据点,这是统计学和机器学习中的一个熟悉概念。它们可能是数据中的差异或不正确的读数的结果,并扭曲统计分析。因此,异常值的存在会导致见解产生不准确。异常值通常会导致机器学习模型拟合过多或过少,因此无法很好地泛化到未见过的数据。因此,在构建稳健模型时需要处理异常值。一旦识别出来,是否移除已识别的异常值将取决于具体情况。有时,异常值只是罕见但有效的数据点,不应被拒绝。在其他情况下,异常值可能源于错误或噪声,需要将其移除以显著提高模型性能。

异常值类型

我们可以在数据中找到各种类型的异常值,这里列出其中一些:

  • 单变量异常值:单变量异常值是指在单独考虑单个特征或变量时遇到的异常值。在这里,您只考虑数据集中某个特定特征的值的分布。当一个数据点远离该特征的通常范围时,就认为它是一个单变量异常值。例如,如果您正在处理身高数据,并且大多数值在 5 到 6 英尺之间,那么 8 英尺就是一个单变量异常值,因为该值显著偏离了数据主体。
  • 多变量异常值:与单变量异常值分析一次一个变量不同,多变量异常值是在同时处理多个特征或变量时出现的。异常值或异常存在于 n 维空间中,其中 n 是数据集中存在的特征数。由于人类思维无法轻松可视化三个维度以上的信息,因此多变量异常值尤其难以确定。因此,机器学习模型通常在这些高维空间中发现的异常值模型上进行训练。当单独评估时,多变量异常值可能看起来并不异常,但当与其他变量结合时,这种情况与其他数据的关联就很奇怪了。
  • 点异常值:点异常值是指明显偏离其余数据普遍模式或分布的单个数据点。这是最明显的异常值类型,通常很容易通过肉眼发现,尤其是在单变量分析中。例如,如果数据集中在 50 到 100 之间,但有一个值为 500,那么这将被归类为点异常值。点异常值可能是数据收集过程中错误的产物,或者是数据中非常有效的变异。
  • 上下文异常值:上下文异常值更复杂,并且取决于它们发生的特定上下文。这些点在全局分布中可能不是异常值,但在其局部上下文中却是不正常的。例如,在文本分析中,上下文异常值可能是一个不寻常的标点符号或符号,这是整个数据中的噪声。同样,在语音识别中,背景噪声或意外的爆发可能构成上下文异常值。同样,这里,上下文很重要,因为在一个情况下是异常值的东西在另一种情况下很容易就是正常的。

数据集中异常值的常见原因

现在,这里有一些最常见的原因,它们会产生数据集中异常值的机会:

  • 抽样错误:当数据来自错误、混合或无代表性的来源收集时,就会出现异常值,这会导致出现与数据集中其他数据不同的异常值。
  • 自然异常值(数据中的新颖性):这些是实际出现在数据集中的异常情况,并且很少作为不频繁但高度相关的事件或案例出现,例如市场崩盘、罕见疾病等。
  • 数据录入错误或人为错误:手动输入数据时发生的错误,例如,拼写错误、额外的数字等,导致异常值异常地高或低。
  • 实验错误:实验设计中的准备错误、数据提取过程中的错误或实验执行过程中的错误可能会引入不符合某些预期范式异常数据。
  • 测量错误或仪器错误:由于仪器故障或校准不当,会输入错误的数据,从而在数据集中产生异常值。
  • 故意异常值(虚拟异常值):有时会人为地注入异常值来测试模型的鲁棒性或异常值检测方法的鲁棒性,并充当合成异常值。
  • 数据处理错误:在处理数据时,由于错误合并和不正确的转换而导致的进程错误,可能会由于数据损坏或变异而引入无意的异常值。

正态分布

How to Remove Outliers for Machine Learning?

检测数据中异常值的方法在很大程度上取决于数据的分布方式。在本节中,我们将只关注单变量数据集,并假设它们大致呈正态分布。当然,如果正态性假设不成立,那么关于一个观测值是“异常值”的说法实际上可能反映了数据的非正态性,而不是异常值本身。因此,在进行任何正式的异常值检测技术之前,对正态概率图进行检查是合适的。这样的图可以用来检查给定的数据集是否与正态分布相对。在存在异常值的情况下,它们必然会产生扭曲的正态性检验结果,即使正态性假设仍然成立,也可能导致错误地拒绝正态性。

除了检查正态性假设之外,正态概率图的尾部是识别潜在异常值的非常有用的图形工具。此图可以帮助您决定是有一个异常值还是多个异常值偏离了预期的模式。

其他图形方法,如箱线图和直方图,可以帮助检查正态性和检测异常值。这些工具提供了超出预期范围的极端值的图示。另一种识别正态分布中异常值的方法是使用经验法则。根据此规则,低于均值(均值 - 3σ)或高于均值(均值 + 3σ)三个或更多标准差的数据点被视为异常值。在这种情况下,“均值”仅指数据的平均值,“σ”是标准差,它衡量数据的散布。

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

Winsorizing(温莎化)

封顶(Capping)或温莎化(Winsorizing)是一种通过替换为特定阈值来限制数据集中被视为极端值的方法。它将确保异常值的影响减弱,而不会完全删除这些数据点,这在异常值的存在可能会扭曲统计分析或机器学习模型的结果时特别有用。

让我们看看封顶后的数据。

输出

How to Remove Outliers for Machine Learning?
How to Remove Outliers for Machine Learning?

Trimming code(截尾代码)

截尾(Trimming)是另一种异常值处理方法,它不是像温莎化那样封顶数据,而是消除落在指定范围之外的数据。这包括删除低于或高于特定百分位数阈值的值。在此过程中,仅保留更中心的值。

输出

How to Remove Outliers for Machine Learning?
How to Remove Outliers for Machine Learning?

Missing Value Code(缺失值代码)

处理异常值的另一种方法是将它们视为缺失值,这需要将异常值替换为 NaN(非数字),以便像处理缺失数据一样处理它们,然后确定如何处理这些缺失值,例如,插补、删除等。

输出

How to Remove Outliers for Machine Learning?

Discretization(离散化)

本质上,离散化是将连续数据转换为离散的桶或区间的过程。它经常用于机器学习以及数据预处理中,用于将连续特征转换为分类特征,这在使模型更容易、降低噪声和提高模型可解释性方面非常有用。当处理那些性能对于离散数据更佳的算法,或者处理那些自然是分类的但以数值形式表示的特征时,这非常有用。

输出

How to Remove Outliers for Machine Learning?
How to Remove Outliers for Machine Learning?

处理异常值的技术

现在,我们将研究有助于处理和操作异常值的各种技术。

Extreme Value Analysis(极值分析)

该属性使 z 分数成为参数化方法,其计算方法是样本均值与特定数据点之间的标准差数量,假设它遵循正态分布或高斯分布。然而,在大多数情况下,数据并不遵循高斯分布。然后,解决此问题的方法包括应用到数据的变换,例如缩放。最基本的方法是使用 Python 库,如 SciPy 和 scikit-learn,它们提供现成的函数和类来进行此类变换,所有数据操作都由 Pandas 和 NumPy 完成。

识别并标记或消除数据点,当它们落在定义阈值之下或之上时,将能够将观测值归类为异常值或非异常值。z 分数是一种直接但有效的机制,用于消除参数化分布中的异常值,特别是在低维特征空间中进行操作时。DBSCAN 和 Isolation Forests 等技术是对于像为非参数数据设计的算法那样识别强异常值的合理指标。

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

Isolation forest(隔离森林)

该方法的一个关键概念是隔离数的概念。隔离森林代表了一种有效的异常值/新颖性检测方法。它是一种基于树的二元决策方法。Sci-Kit Learn 的实现相对基础,因此更容易理解。隔离森林的基本原理是,异常值很少,并且与其他观测值相距甚远。训练算法从特征空间中选择一个随机特征,并在最大值和最小值之间选择一个随机分割值来构建一棵树。这是对训练集中的每个观测值进行的。在构建森林时,通过对森林中的所有树取平均值来创建树的集成。然后,在预测时,它将一个观测值与“节点”中的分割值进行比较,该节点将有两个子节点,其他随机比较将在其上进行。算法为实例进行的“分割”次数称为:“路径长度”。我们知道异常值的路径长度会比其他观测值短。

隔离数表示将给定数据点分离所需的分割次数。计算

  • 令随机选择的点“a”为要隔离的点。
  • 选择另一个随机点,但令“b”落在最小值和最大值范围之内,且不等于“a”。
  • 如果“b”小于“a”,则它固定了一个新的下限。
  • 如果“b”大于“a”,则它固定了一个新的上限。
  • 此过程一直持续到所有数据点(“a”除外)都落在已建立的上限和下限之间。

与非异常值相比,异常值在隔离过程中通常需要较少的分割,因此它们的隔离数较低。也就是说,如果一个点的隔离数小于某个阈值,它就是一个异常值。此异常值检测算法的起点基于阈值的定义,该阈值根据数据中估计的异常值百分比确定。

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

DBScan

它是一种非常强大的聚类算法,已被广泛使用,并且像大多数此类异常检测算法一样,它与传统的基于质心的聚类方法(如 K-means)不同,因为它围绕数据点的密度进行操作,因此特别适用于从包含噪声的数据中提取异常值或异常。

现在,此方法分步解释:

  • 选择任何随机点,该点不位于任何簇中或被归类为异常值。
  • 检查该点是否为核心点,如下所示:查找至少 `min_samples` 个邻居点,这些点位于 `epsilon` 距离内。
  • 如果该点满足核心点的定义,则形成一个由该点及其周围 `epsilon` 距离内的所有点(可直接访问)组成的簇。
  • 选择簇中所有点 `epsilon` 距离内的点并将其包含在簇中。通过检查新选择的点是否还有其他邻居来继续操作;重复此过程,直到没有更多点可以被包含(在某种意义上执行“邻域跳转”以发现所有密度可达的点)。

现在,这里是术语解释:

  • 核心点:一个在其 `epsilon` 邻域中至少有 `min_samples` 个点的点。该点包含在簇中并构成 `min_samples`。
  • 边界点:一个点位于核心点 `epsilon` 距离内,但缺乏足够的邻居而无法被视为其自身的核心点。它不构成自己的簇;尽管如此,它还是被添加到附近核心点的簇中。
  • 噪声点(异常值):一个既不是核心点也不是边界点的点。它不满足被聚类的资格,并且由于在 `epsilon` 距离内邻居太少而被标记为异常值。
  • Epsilon-邻域:从给定点开始 `epsilon` 距离内的所有点的集合,这些点被认为可以直接从该点到达。
  • 密度可达:如果一个点可以通过从核心点穿越邻域来访问,那么它就是密度可达的。

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

Elliptic Envelope(椭圆包络)

直观地说,椭圆包络基于数据来自某种已知分布的假设。我们在高斯分布的数据周围绘制一个椭圆,使得椭圆之外的任何东西都是异常值。椭圆包络的假设是正常数据点是高斯分布的。

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

One Class SVM(单类 SVM)

OneClassSVM 对异常值非常敏感,因此在异常值检测方面表现不佳。其中一种估计器特别适合新颖性检测,在训练数据集中不包含异常值的情况下会非常有效。新颖性检测实际上是一种异常检测,它试图识别与已建立的数据分布显著不同的实例或罕见情况。如果用于训练的值没有被异常值污染,它可以从此方法中产生稳健可靠的结果。然而,需要注意的是,高维数据集中的异常值非常特殊。维度越多,数据在这种情况下往往变得越复杂,常常导致稀疏性和维度灾难问题,并且正常数据点和异常值之间的区分将变得更加困难。除此之外,当没有对既定范围内数据的分布做出特定假设时,情况会更加复杂。

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

Local Outlier Factors(局部异常因子)

LOF 代表局部异常因子。它是一种基于密度的异常值检测方法,它与其局部邻域内的异常值进行信号,而不是相对于整个数据分布。事实上,LOF 的一个非常关键的特性是它能够将一个点标记为局部异常值,即使其密度远低于其邻近点,尽管该点在全局上可能不是异常值。观测值的 LOF 值越高,其异常程度越大。这非常有用,因为许多方法未能捕捉到局部簇中的异常点,因为它们的方法只关注全局模式。例如,在下面的特征空间中,LOF 将能够将点 P1 和 P2 标记为相对于簇 2 的局部异常值,以及更明显的 P3。

LOF 解释

  • 距离计算:对于每个点 P,使用曼哈顿距离等距离度量,计算到数据集中所有其他点的距离:(曼哈顿 = |x1-x2| + |y1-y2| = dist(p1, p2)
  • 识别第 K 个最近邻:到第 K 个最近点的距离即为 P 的 K 距离,称为 K-Dist(P)
  • 查找 K 距离邻域:查找 Nk(P),即位于上述步骤中估计的距离内的 K 个最近点的集合。
  • 计算局部可达密度(LRD):P 及其邻居之间可达距离的倒数。当邻居远离 P 时,LRD 较小,这意味着 P 位于稀疏区域。
  • 计算 LOF:LOF 是 P 的邻居的可达距离的加权总和,由它们的密度加权。也就是说,它是 P 相对于其局部邻域的异常程度的度量。

为了找出第 K 个最近的点,在步骤 2 中,如果有两个点到 P 的距离相同,则一个被选为下一个最近的点,另一个被选为紧随其后的点。

局部可达密度(LRD)是 P 从其邻居处可达距离的倒数,通过使用 K 距离来平滑,如果邻居比第 K 个最近点更近。

可达距离定义为 reachdistk(n1 <=P) = max(distk((n1), dist(n1,P))。

理解 LOF 值

  • 高 LOF 值:点 P 离其邻居很远,而 P 的邻居彼此非常靠近(密集),因此 P 本身在该邻域中是异常值。
  • 中等的 LOF 值出现在 P 离其邻居很远但这些邻居稀疏分布时。
  • 低 LOF 值意味着 P 与其邻居相似,并且邻居分布稀疏,因此 P 不是异常值。

选择 K

  • 如果 K 很大,则该方法开始相对于整个数据空间标记异常值,因此一些实际属于一个簇的数据点也会被错误地标记为异常值。
  • 如果 K 太小,LOF 会重视非常小的局部区域。这再次可能错误地将异常值分类,因为它没有考虑到更大的模式。

因此,这个逐步的过程有助于 LOF 清楚地识别数据集中的局部异常,而不会像使用全局方法检测这些细微变化那样将它们平滑掉。

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?

输出

How to Remove Outliers for Machine Learning?
下一主题机器学习技术