孤立森林 Isolation Forest 论文翻译(下)

目录

5 实验评估

5.1 和ORCA、LOF、RF对比

5.2 效率分析

5.3高维数据

5.4 仅用正常实例训练

6 讨论

7 总结


5 实验评估

       本节给出了用于评估iForest的四组实验的详细结果。第一个实验中本文对比iForest和ORCA[3]、LOF[6]和Random Forests(RF)[12]。LOF是一个著名的基于密度的函数,选择RF是因为该算法也使用树集成。在第二个实验中,本文使用实验中最大的两个数据集来检验子采样大小的影响。实验结果提供了应该使用的子采样大小及其对检测性能的影响。第三个实验扩展iForest来解决高维数据;在构造树之前,通过对每个子样本应用简单的单变量检验缩减属性空间。本文旨在检验这种简单的机制是否能够提高iForest在高维空间中的检测性能。在许多情况下,异常数据难以获得,第四个实验检验训练过程中只有正常实例时iForest的性能。对于所有实验,报告实际CPU时间和曲线下面积(Area Under Curve, AUC)。它们在Linux集群(www.vpac.org)中以2.3GHz的单线程任务进行处理。

       基准方法是ORCA——一个基于k近邻的且最新的异常检测方法,其中处理时间的最大需求来自k个最近邻的距离计算。使用样本随机化和一个简单的修剪规则,ORAC声称可以降低复杂度O(n2)到近似线性时间[3]。

       在ORCA中,参数k决定最近邻的数量,增加k也会增加运行时间。除非特别说明,本文实验使用ORCA的默认设置k=5。参数N决定报告多少异常点。如果N小,ORCA快速地增加了运行截止时间,并剪枝更多的搜索,使运行时间更快。然而,设置N低于异常点的数量是不合理的,因为AUC需要报告每个实例的异常分数。由于选择N对运行时间有影响且在训练阶段不能得知异常点的数量,除非特别说明,本文将使用一个合理的值N=n/8。使用ORCA的原始默认值(k=5, N=30),所有大于1000个点的数据集报告AUC接近0.5,这相当于随机选择点作为异常。在运行时间方面,本文给出总运行时间和测试时间,但忽略ORCA的预处理时间“dprep”。

       对于LOF,本文使用一个普遍使用的设置k=10。至于RF,本文使用t=100且其它参数保持默认。由于RF是一个监督学习算法,本文遵循[12]中的具体说明来生成数据作为替换类。备选类通过在所有属性的最大值和最小值之间均匀抽样随机点来生成。邻近度度量是在构建决策树之后计算的,异常是与数据中所有其他实例的邻近度普遍都很小的实例。

       本文使用11个自然数据集加上一个合成数据集来评估。选择这些数据集是因为他们包含已知的异常类作为真实值,且这些数据集在文献中用于评估相似设置下的异常检测器。它们包括:[14]中使用的KDD CUP 99网络入侵数据的两个最大的子集(Http和Smtp), Annthyroid, Arrhythmia, Wisconsin Breast Cancer (Breastw), Forest Cover Type (ForestCover), Ionosphere, Pima, Satellite, Shuttle [2], Mammography1 and Mulcross [10]。由于本文只研究连续值的属性,所有名义属性和二进制属性被删除。合成数据生成器Mulcross生成一个可选择的异常簇数量的多变量正态分布。在本文实验中,Mulcross的基本设置如下:污染率=10%(异常点数量比总点数),距离因子=2(正常簇和异常簇中心的距离),异常簇数量=2。图4展示了一个Mulcross数据的例子。表2按数据量大小降序排

<think>嗯,用户想了解孤立森林的decision_function方法及其用法。首先,我需要确认自己对这个方法的理解是否正确。根据之前的引用内容,孤立森林通过路径长度来判断异常,而decision_function应该和这个评分有关。 记得引用[4]提到,sklearn的异常分数与原始论文相反,还减去了0.5。这说明decision_function返回的可能是一个经过调整的分数,需要注意符号的问题。用户可能需要知道这个方法返回值的含义以及如何解释。 另外,用户需要使用说明、作用和示例。我应该先解释方法的作用,比如它返回的是样本的异常得分,数值越低越可能是异常点。然后说明参数,比如X是输入数据,返回值的形状。接着给出示例代码,包括导入库、生成数据、训练模型、使用decision_function获取分数,并根据分数判断异常。 还要注意引用的正确使用,比如引用[4]中的信息关于sklearn的实现差异。同时,示例部分要展示如何实际应用,可能包括数据生成、模型训练、调用方法、结果展示和解释。最后,常见问题部分需要解答用户可能遇到的疑问,比如数值范围、判断阈值等,并引用相关文献支持。</think>### 孤立森林 `decision_function` 方法详解 #### 1. **方法作用** `decision_function` 是 `IsolationForest` 模型的核心方法之一,用于计算样本的异常分数。其返回值表示样本的“异常程度”,**数值越小(甚至为负),样本越可能是异常点**[^4]。该方法的实现逻辑如下: - 根据样本在孤立森林中的平均路径长度计算原始异常分数 - 对分数进行归一化处理(基于样本量和树的数量) - 根据 sklearn 的约定,将结果减去 0.5(因此正常样本可能得正值,异常样本得负值) #### 2. **方法定义** ```python decision_function(X) ``` - **参数**: - `X`: 输入数据,形状为 `(n_samples, n_features)` 的数组或稀疏矩阵 - **返回值**: - 形状为 `(n_samples,)` 的数组,表示每个样本的异常分数 #### 3. **使用示例** ```python from sklearn.ensemble import IsolationForest import numpy as np # 生成模拟数据(95%正常数据+5%异常数据) X = 0.3 * np.random.randn(100, 2) X = np.r_[X, np.random.uniform(low=-3, high=3, size=(5, 2))] # 训练模型 clf = IsolationForest(contamination=0.05, random_state=42) clf.fit(X) # 计算异常分数 scores = clf.decision_function(X) # 判断异常(score < 0 判为异常) outliers = X[scores < 0] print(f"检测到异常点数量:{len(outliers)}") print("异常分数示例:", scores[:5]) # 展示前5个样本的分数 ``` #### 4. **结果解读** - **典型输出范围**:`[-0.5, 0.5]` - **判断阈值**: - 默认情况下 `score < 0` 判为异常(对应原始论文的异常分数 > 0.5) - 可通过调整 `contamination` 参数改变异常判定比例 - **分数对比**: ```python # 正常样本示例分数:[0.12, 0.08, 0.15, -0.02, 0.11] # 异常样本典型分数:[-0.3, -0.25, -0.4] ``` #### 5. **常见问题** 1. **为什么有的正常样本得负分?** 当实际异常比例超过预设的 `contamination` 参数时,部分正常样本可能被误判为异常。可通过交叉验证调整参数[^3]。 2. **如何确定最佳阈值?** 建议结合业务场景使用 ROC 曲线分析: ```python from sklearn.metrics import roc_curve fpr, tpr, thresholds = roc_curve(true_labels, scores) ``` 3. **与 `score_samples` 方法的区别** `score_samples` 返回原始论文定义的异常分数(未减 0.5),而 `decision_function` 更适合直接用于异常判断[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值