孤立森林的预测概率

5

我尝试使用孤立森林进行异常值检测(欺诈检测)。如果我运行以下代码(使用训练和测试集):

from sklearn.ensemble import IsolationForest
iso = IsolationForest(random_state=0).fit(X_train)
isopred = iso.predict(X_test)

我得到一个数组:array([1, 1, -1, ..., 1, 1, 1]),其中包含1或-1。我该如何使用predict_proba函数,这个函数可以用于DecisionTrees。在文档中有没有可用于IsolationTree的函数,因为它没有被提及?
当我运行iso.predict_proba(X_test)时,我会收到以下错误:

AttributeError: 'IsolationForest'对象没有属性'predict_proba'

我正在寻找一个数组,它可以给出预测属于哪个类别(是否是异常点)的概率。
我的X_test看起来像:
A  B  C
11 1  0
11 3  0
11 0  1

y_test.values.ravel()一起使用: array([0,0,1])


你能提供一些样本数据吗? - Márcio Coelho
我已经添加了它,但这将有所帮助,在文档中也有示例数据... - PV8
我只是想了解一下你的数据,看看它是否有任何特殊性。谢谢你提供这些例子,我会编辑我的答案以使用它们。 - Márcio Coelho
1个回答

7

这个模块中没有 predict_proba,因为它不使用概率来评估每个样本是否为异常值,而是通过得分进行评估。

根据您提供的文档,每个样本使用以下公式的决策函数进行分类:

decision_function = score_samples - offset_. offset_

所需的可能是score_samples。使用示例数据:

X = [[-1.1], [0.3], [0.5], [100]]
iso = IsolationForest(random_state=0).fit(X)
iso_pred = iso.predict([[0.1], [0], [90]])
iso_scores = abs(iso.score_samples([[0.1], [0], [90]]))

结果为:

[ 1  1 -1] 
[0.33644293 0.35190077 0.62865009]

在对每个样本进行偏移量(默认值为-0.5)处理后,如果返回结果为正数,则为内点;否则为外点。

希望对你有所帮助。


score_samples是一个不错的函数,但我认为我需要添加abs,因为我的所有值都是负数。 - PV8
唯一的问题是,现在的值范围在0.3-0.7之间,在决策树中,我通常得到0-1之间的值。这是否是孤立森林的行为? - PV8
我不会使用 _abs_,因为根据文档,值越低表示异常程度越高,未来可能会遇到与其他离群值/内群值混合的正值。 - Márcio Coelho
1
您现在得到的分数并不是最终的分类,而是达到该分类的中间步骤。在这种方法中,0或1的值没有特殊的含义,据我所知。 - Márcio Coelho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接