隔离森林

17 Mar 2025 | 5 分钟阅读

Isolation Forest 是一种新颖的异常检测方法,旨在定位数据集中的异常值或异常情况。与之前分析正常数据点的方法不同,Isolation Forest 提供了一种新方法,直接识别异常。Isolation Forest 的核心前提是,异常通常不常见且与常规情况不同,这使得它们更容易分离。

Isolation Forest 工作流程包括创建一组隔离树,每棵树通过随机选择特征并分割数据点来构建,直到每个点都隔离在其自己的叶节点中。异常旨在比典型实例需要更少的划分才能隔离,这使得它们更容易根据所有树上较低的平均路径长度进行识别。

代码

现在,我们将借助 Isolation Forest 优雅地查找和消除异常值(异常)。

导入库

读取数据集

输出

Isolation Forest

在运行 IsolationForest 之前,下一步是进行一些小的预处理。我们删除 NaN 数量较多(>1000)的列,并填充所有特征的缺失值。最后,我们验证没有缺失数据。

输出

Isolation Forest

隔离算法

当树从数据集的子集而不是完整数据集生成时,Isolation Forest (IF) 方法表现最佳。这与几乎所有其他策略都大相径庭,后者依赖于数据,并且需要更多数据才能提高准确性。子采样在这种方法中效果奇好,因为常规实例可能通过更接近异常值来扰乱隔离过程。在此示例中,我们将 max_samples=100,导致 Isolation Forest 为每个特征生成 100 个样本来训练基础估计器。

  • fit:使用特定特征的 max_samples 计数拟合基础估计器。
  • predict:如果观测值为异常值,则返回 -1,否则返回 1。
  • decision_function:使用拟合模型计算测量的异常分数。

stats 数据框仅包含原始样本值、其分数、IF 是否将其视为异常值,以及一些基本特征统计信息,例如最小值、最大值和中值。

Isolation Forest

输出

Isolation Forest
Isolation Forest

让我们看看结果。

  • LotArea 有四个主要异常值 (-1),异常分数约为 -0.33,值超过 100,000。这些值与该属性的平均值 10168 相距甚远。我们可以看到 LotArea 的范围从 1300 到 215245,因此降低这四个观测值(总数)对该特征方差的影响可能有助于我们后续的建模方法。
  • YearBuilt 的变化小于 LotArea,最大异常分数约为 -0.25。这表明值与平均值相差不大。使用 IF 将未来的最低值(约 1880 年)识别为异常值。
  • BsmtUnfSF 类似于 YearBuilt,但方差明显更大。
  • 根据 IF,GarageYrBlt 显然在 0 值处包含异常值,但鉴于这些观测值是在没有任何车库的情况下进行的,这是可以理解的。大多数住宅都有 GarageYrBlt,并且它们与平均值明显不同。

接下来,我们利用 pandas 的剪裁功能在输入级别去除异常值。它通过为该特定特征设置最小值和最大值来操作。所有值小于最小值的观测值将被分配为最小值,而所有值大于最大值的观测值将被分配为最大值。这些只是示例;您可以根据需要更改设置。

现在我们重新训练 IsolationForest 分类器,以测试剪裁值是否改善了异常值评分。请注意,在我们剪裁示例特征后,IsolationForest 生成的异常值分数有所降低。

输出

Isolation Forest
Isolation Forest

我们演示了如何使用 Isolation Forest 检测数据集中的异常值。我们以房价数据集为例。Isolation Forest 在子采样数据上表现出色,并且不需要从完整数据集构建树。它在子采样数据上表现良好。该技术运行速度非常快,因为它不依赖于计算量大的操作,例如距离或密度计算。训练步骤具有线性时间复杂度和低常数,使其适用于任何大规模数据处理应用程序。


下一个主题McNemar 检验