ddx*_*ddx 1 python algorithm machine-learning sampling scikit-learn
我一直在使用sklearn.ensemble.IsolationForest隔离林的 scikit learn 实现来检测数据集中的异常情况,数据范围从数百行到数百万行数据。它似乎运行良好,我已将其覆盖max_samples为一个非常大的整数来处理一些较大的数据集(本质上不使用子采样)。我注意到原始论文指出,较大的样本量会产生淹没和掩盖的风险。
如果隔离森林看起来工作正常,是否可以在大样本量上使用它?我尝试使用较小的训练max_samples,但测试产生了太多异常情况。我的数据确实开始增长,我想知道对于如此大的样本量,不同的异常检测算法是否会更好。
引用原文:
iTree 的隔离特性使它们能够构建部分模型并利用子采样,其程度在现有方法中是不可行的。由于异常检测不需要 iTree 中隔离正常点的很大一部分;它不需要被建造。小样本量会产生更好的 iTree,因为淹没和遮蔽效应会减少。
从你的问题来看,我有一种感觉,你混淆了数据集的大小和从中构建 iTree 的样本的大小。隔离森林可以处理非常大的数据集。当对它们进行采样时效果会更好。
原论文在第 3 章对此进行了讨论:
该数据集有两个异常簇,靠近中心的一大簇正常点。异常簇周围存在干扰正常点,并且在该 4096 个实例的样本中,异常簇比正常点更密集。图 4(b) 显示了原始数据的 128 个实例的子样本。子样本中的异常簇清晰可辨。两个异常簇周围的正常实例已被清除,异常簇的大小变得更小,更容易识别。使用整个样本时,iForest 报告的 AUC 为 0.67。当使用 128 的子采样大小时,iForest 的 AUC 为 0.91。
隔离森林并不是一个完美的算法,需要针对您的特定数据进行参数调整。它甚至可能在某些数据集上表现不佳。如果您想考虑其他方法,局部离群因子也包含在 中sklearn。您还可以组合多种方法(集成)。
在这里您可以找到不同方法的很好的比较。