如何为机器学习移除异常值?2025年2月28日 | 阅读 16 分钟 ![]() 极端值很少出现,并且通常代表不适合数据分布一般模式的未被表征的案例。在机器学习中,异常值可能导致结果的剧烈波动,并对模型的准确性产生不利影响。识别和移除异常值是机器学习数据准备中的关键步骤。 异常值是远离其他观测值的数据点,这是统计学和机器学习中的一个熟悉概念。它们可能是数据中的差异或不正确的读数的结果,并扭曲统计分析。因此,异常值的存在会导致见解产生不准确。异常值通常会导致机器学习模型拟合过多或过少,因此无法很好地泛化到未见过的数据。因此,在构建稳健模型时需要处理异常值。一旦识别出来,是否移除已识别的异常值将取决于具体情况。有时,异常值只是罕见但有效的数据点,不应被拒绝。在其他情况下,异常值可能源于错误或噪声,需要将其移除以显著提高模型性能。 异常值类型我们可以在数据中找到各种类型的异常值,这里列出其中一些:
数据集中异常值的常见原因现在,这里有一些最常见的原因,它们会产生数据集中异常值的机会:
正态分布![]() 检测数据中异常值的方法在很大程度上取决于数据的分布方式。在本节中,我们将只关注单变量数据集,并假设它们大致呈正态分布。当然,如果正态性假设不成立,那么关于一个观测值是“异常值”的说法实际上可能反映了数据的非正态性,而不是异常值本身。因此,在进行任何正式的异常值检测技术之前,对正态概率图进行检查是合适的。这样的图可以用来检查给定的数据集是否与正态分布相对。在存在异常值的情况下,它们必然会产生扭曲的正态性检验结果,即使正态性假设仍然成立,也可能导致错误地拒绝正态性。 除了检查正态性假设之外,正态概率图的尾部是识别潜在异常值的非常有用的图形工具。此图可以帮助您决定是有一个异常值还是多个异常值偏离了预期的模式。 其他图形方法,如箱线图和直方图,可以帮助检查正态性和检测异常值。这些工具提供了超出预期范围的极端值的图示。另一种识别正态分布中异常值的方法是使用经验法则。根据此规则,低于均值(均值 - 3σ)或高于均值(均值 + 3σ)三个或更多标准差的数据点被视为异常值。在这种情况下,“均值”仅指数据的平均值,“σ”是标准差,它衡量数据的散布。 输出 ![]() 输出 ![]() 输出 ![]() 输出 ![]() 输出 ![]() 输出 ![]() Winsorizing(温莎化)封顶(Capping)或温莎化(Winsorizing)是一种通过替换为特定阈值来限制数据集中被视为极端值的方法。它将确保异常值的影响减弱,而不会完全删除这些数据点,这在异常值的存在可能会扭曲统计分析或机器学习模型的结果时特别有用。 让我们看看封顶后的数据。 输出 ![]() ![]() Trimming code(截尾代码)截尾(Trimming)是另一种异常值处理方法,它不是像温莎化那样封顶数据,而是消除落在指定范围之外的数据。这包括删除低于或高于特定百分位数阈值的值。在此过程中,仅保留更中心的值。 输出 ![]() ![]() Missing Value Code(缺失值代码)处理异常值的另一种方法是将它们视为缺失值,这需要将异常值替换为 NaN(非数字),以便像处理缺失数据一样处理它们,然后确定如何处理这些缺失值,例如,插补、删除等。 输出 ![]() Discretization(离散化)本质上,离散化是将连续数据转换为离散的桶或区间的过程。它经常用于机器学习以及数据预处理中,用于将连续特征转换为分类特征,这在使模型更容易、降低噪声和提高模型可解释性方面非常有用。当处理那些性能对于离散数据更佳的算法,或者处理那些自然是分类的但以数值形式表示的特征时,这非常有用。 输出 ![]() ![]() 处理异常值的技术现在,我们将研究有助于处理和操作异常值的各种技术。 Extreme Value Analysis(极值分析)该属性使 z 分数成为参数化方法,其计算方法是样本均值与特定数据点之间的标准差数量,假设它遵循正态分布或高斯分布。然而,在大多数情况下,数据并不遵循高斯分布。然后,解决此问题的方法包括应用到数据的变换,例如缩放。最基本的方法是使用 Python 库,如 SciPy 和 scikit-learn,它们提供现成的函数和类来进行此类变换,所有数据操作都由 Pandas 和 NumPy 完成。 识别并标记或消除数据点,当它们落在定义阈值之下或之上时,将能够将观测值归类为异常值或非异常值。z 分数是一种直接但有效的机制,用于消除参数化分布中的异常值,特别是在低维特征空间中进行操作时。DBSCAN 和 Isolation Forests 等技术是对于像为非参数数据设计的算法那样识别强异常值的合理指标。 输出 ![]() 输出 ![]() 输出 ![]() Isolation forest(隔离森林)该方法的一个关键概念是隔离数的概念。隔离森林代表了一种有效的异常值/新颖性检测方法。它是一种基于树的二元决策方法。Sci-Kit Learn 的实现相对基础,因此更容易理解。隔离森林的基本原理是,异常值很少,并且与其他观测值相距甚远。训练算法从特征空间中选择一个随机特征,并在最大值和最小值之间选择一个随机分割值来构建一棵树。这是对训练集中的每个观测值进行的。在构建森林时,通过对森林中的所有树取平均值来创建树的集成。然后,在预测时,它将一个观测值与“节点”中的分割值进行比较,该节点将有两个子节点,其他随机比较将在其上进行。算法为实例进行的“分割”次数称为:“路径长度”。我们知道异常值的路径长度会比其他观测值短。 隔离数表示将给定数据点分离所需的分割次数。计算
与非异常值相比,异常值在隔离过程中通常需要较少的分割,因此它们的隔离数较低。也就是说,如果一个点的隔离数小于某个阈值,它就是一个异常值。此异常值检测算法的起点基于阈值的定义,该阈值根据数据中估计的异常值百分比确定。 输出 ![]() 输出 ![]() 输出 ![]() DBScan它是一种非常强大的聚类算法,已被广泛使用,并且像大多数此类异常检测算法一样,它与传统的基于质心的聚类方法(如 K-means)不同,因为它围绕数据点的密度进行操作,因此特别适用于从包含噪声的数据中提取异常值或异常。 现在,此方法分步解释:
现在,这里是术语解释:
输出 ![]() 输出 ![]() 输出 ![]() 输出 ![]() Elliptic Envelope(椭圆包络)直观地说,椭圆包络基于数据来自某种已知分布的假设。我们在高斯分布的数据周围绘制一个椭圆,使得椭圆之外的任何东西都是异常值。椭圆包络的假设是正常数据点是高斯分布的。 输出 ![]() 输出 ![]() One Class SVM(单类 SVM)OneClassSVM 对异常值非常敏感,因此在异常值检测方面表现不佳。其中一种估计器特别适合新颖性检测,在训练数据集中不包含异常值的情况下会非常有效。新颖性检测实际上是一种异常检测,它试图识别与已建立的数据分布显著不同的实例或罕见情况。如果用于训练的值没有被异常值污染,它可以从此方法中产生稳健可靠的结果。然而,需要注意的是,高维数据集中的异常值非常特殊。维度越多,数据在这种情况下往往变得越复杂,常常导致稀疏性和维度灾难问题,并且正常数据点和异常值之间的区分将变得更加困难。除此之外,当没有对既定范围内数据的分布做出特定假设时,情况会更加复杂。 输出 ![]() 输出 ![]() Local Outlier Factors(局部异常因子)LOF 代表局部异常因子。它是一种基于密度的异常值检测方法,它与其局部邻域内的异常值进行信号,而不是相对于整个数据分布。事实上,LOF 的一个非常关键的特性是它能够将一个点标记为局部异常值,即使其密度远低于其邻近点,尽管该点在全局上可能不是异常值。观测值的 LOF 值越高,其异常程度越大。这非常有用,因为许多方法未能捕捉到局部簇中的异常点,因为它们的方法只关注全局模式。例如,在下面的特征空间中,LOF 将能够将点 P1 和 P2 标记为相对于簇 2 的局部异常值,以及更明显的 P3。 LOF 解释
为了找出第 K 个最近的点,在步骤 2 中,如果有两个点到 P 的距离相同,则一个被选为下一个最近的点,另一个被选为紧随其后的点。 局部可达密度(LRD)是 P 从其邻居处可达距离的倒数,通过使用 K 距离来平滑,如果邻居比第 K 个最近点更近。 可达距离定义为 reachdistk(n1 <=P) = max(distk((n1), dist(n1,P))。 理解 LOF 值
选择 K
因此,这个逐步的过程有助于 LOF 清楚地识别数据集中的局部异常,而不会像使用全局方法检测这些细微变化那样将它们平滑掉。 输出 ![]() 输出 ![]() 输出 ![]() 输出 ![]() 输出 ![]() 下一主题机器学习技术 |
我们请求您订阅我们的新闻通讯以获取最新更新。