问题标签 [isolation-forest]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何在python中使用隔离森林
我正在检测未标记数据集中的异常值(数据未标记为内点/异常值),并且我正在 Python 中使用隔离森林(scikit-learn 库)。
我想获得数据集中数据的异常分数,因此我使用以下代码:
但是我有一些问题:
- 前面的过程是否正确,或者我应该将我的数据集分成两部分,以在一组上执行拟合并在另一组上获得异常分数?
- 该方法的用途是什么
predict
?我应该如何使用它?
scikit-learn - 单变量 IsolationForest 的 Shap TreeExplainer 的 IndexError
帮助!尝试解释 IsolationForest 时出现 IndexError。
我正在使用Scikit-learn
'sIsolationForest
进行异常检测。通常,我使用的数据集有多个变量——但有时它们只有一个。这适用于拟合和预测模型。但是,为了使用shap
's解释模型的输出TreeExplainer
,我得到一个IndexError
.
请参阅下面的最小可重现示例:
问题的根本原因似乎如下(见下面的代码):每个IsolationForest
都有多个隔离树。在 中TreeExplainer
,多个IsoTree
对象被初始化。在初始化期间,该行崩溃,因为self.features
,一个列表,包含 -2,这是超出范围的,因为tree_features
它只是一个数组 ( [0]
)。所以也许问题是在拟合 时IsolationForest
,给出了错误的值self.features
。
知道如何解决这个问题吗?
当然,对于单变量模型,使用 Shapley 值是没有意义的,因为您可以只使用score_samples
. 我打算将其用作解决方法,但肯定有一种更优雅的方式不需要这样做?
谢谢和最良好的祝愿,
亚历山大
python - 在隔离林中应该根据什么标准选择引导参数?
如您所知,scikit-learn 中的隔离森林模型有一个参数bootstrap。描述如下。
如果为 True,则单个树适合替换采样的训练数据的随机子集。如果为 False,则执行无放回抽样。
我做了一个简单的数据,训练了一个隔离森林模型。但无论 bootstrap = True 还是 False,评估结果都大不相同。请参考以下代码。
我的问题是,
- bootstrap参数在隔离林中的作用是什么?
- 在隔离林中应该根据什么标准选择引导参数?
请让我知道何时选择 True 以及何时选择 False。
python - 具有多个特征的隔离森林将所有内容都检测为异常
我有一个隔离林实现,我在其中获取功能(都是数字的);将它们缩放到 0 到 1 之间
然后调用预测:
在这种情况下,我有 23 个数字特征。
当我运行脚本时,它绝对为每个结果返回 1。
当我将功能集限制为 2 列时,它会返回 1 和 -1 的混合值。
我怎样才能解决这个问题?
谢谢
python - Sklearn隔离森林中污染设置与异常值预测数量之间的不一致
我受到这个notebook的启发,我正在试验用于KDDCUP99 数据集的SF版本的异常检测上下文的IsolationForest
算法,包括 4 个属性。数据直接从预处理(分类特征编码的标签)中获取,并在使用默认设置传递给 IF 算法之后。scikit-learn==0.22.2.post1
sklearn
完整代码如下:
根据二进制情况下的文档,我们可以提取真阳性等,如下所示:
问题:
- 问题 1:我想知道为什么 IF 通过标记异常值/异常来预测已经在测试集上设置的 10% 以上的污染?23248 而不是 23201 !!
- 问题 2:通常
TN
+FP
应该是内部/正常 230899 并且FN
+TP
应该等于 1114,因为我们在数据拆分后计算。我认为在我的实现中反之亦然,但我无法弄清楚并调试它。 - 问题 3:基于 KDDCUP99 数据集文档及其用户指南和我在以下实现中的计算,异常率为0.5%,这意味着如果我设置
contamination=0.005
,它应该给我
可能我在这里遗漏了一些东西,任何帮助将不胜感激。
python - 如何在隔离森林的 sklearn 实现中设置 max_depth?
我正在使用sklearn
's Isolation Forest 并使用它来预测其他样本(来自同一人群)。由于样本量大,我无法在整个数据上拟合 Forest(因为我无法将该数据转换为 pandas 数据框),因此采用了这种方法。
由于需要时间,我正在考虑减少树木的最大深度。根据sklearn
的 文件, "
每棵树的最大深度设置为 ceil(log_2(n)),其中是用于构建树的样本数(有关更多详细信息,请参见 (Liu et al., 2008))
"
但由于我只想要最顶层的异常,我想我可以将树的深度限制在甚至小于 ceil(log_2(n)) 的范围内。而且我认为这可能会减少使用该模型进行拟合和进行预测的时间。但sklearn
不支持参数max_depth
。有没有办法指定max_depth
insklearn
python - 使用 Python 中的隔离森林异常检测包显示样本的任何特征值是否为异常值
据我了解,此包的异常值预测输出返回样本数据(可以包含多个特征的值)是否为异常值(-1 或 1)。但是,在我的特殊应用中,我需要知道对样本的每个特征的隔离森林异常值检测方法的个体评估。即显示样本的任何特征值是否为异常值。例如,如果我们有一个如表 1 所示的样本数据集,我将有兴趣查看表 2 中显示的异常值评估输出(表 3 是它当前显示的输出)。
如果可能的话,我想知道是否有人可以帮助我提取这些输出。
python - IsolationForest 总是预测 1
我正在使用一个项目来检测out-of-domain
文本输入,在功能的帮助IsolationForest
下tf-idf
。以下是我总结的作品:
训练
在 tfidf 上:
- 使用 . 拟合和转换域内数据集
CountVectorizer()
。 - 用我的这个安装一个 tfidftransformer()
CountVectorizer()
并保存变压器(在测试期间使用它)。 - 因此,使用
tfidftransformer()
- 保存
CountVectorizer()
'svocabulary_
和TfidfTransformer()
objectpickle
用于测试时间使用。
- 使用 . 拟合和转换域内数据集
关于隔离森林:
- 收集转换后的域内数据集并训练
IsolationForest()
新颖性检测器。 - 使用 保存模型
joblib
。
- 收集转换后的域内数据集并训练
测试:
- 加载所有保存的模型。
- 在复制所有类似于训练步骤的步骤(仅限转换)后,获取当前域外输入文本的 tfidf 转换特征。
IsolationForest
使用保存的模型预测它是否在域外。
但是我发现即使 tf-idf 功能对于我的每个测试输入都完全不同,IsolationForest
总是预测为 1。
可能出了什么问题?
注意:我还尝试IsolationForest
通过模仿tf-idf
变压器的输出来输入虚拟向量来建模,以确保tf-idf
模块是否对此负责,但无论我提供哪个随机向量,我总是得到 1 作为输出IsolationForest
。另请注意,tf-idf
有很多功能(令牌),在我的情况下,计数是 48015。
scikit-learn - SKLearn中isolation_forest中的decision function和score_samples有什么区别
我在这里阅读了决策函数和 score_samples 的文档,但无法弄清楚这两种方法之间有什么区别,以及我应该将哪一种用于异常值检测算法。
任何帮助,将不胜感激。