隔离林 sklearn 污染参数

数据挖掘 Python scikit-学习 无监督学习 异常检测 离群值
2021-09-27 12:10:04

我正在使用隔离森林算法对时间序列数据进行无监督异常检测任务。我正在用 Python 开发它,更详细地使用scikit-learn.

我找到了很多这方面的例子,但不是很清楚,在 IsolationForest 的实例化过程中如何设置污染参数。

查看文档污染

数据集的污染量,即数据集中异常值的比例。

我应该使用一些统计技术来确定这个百分比吗?

3个回答

我认为答案是“视情况而定”。contamination当评分数据点应被视为异常值时,该参数仅控制决策函数的阈值。它对模型本身没有影响。

根据您的应用,使用一些统计分析来粗略估计污染可能是有意义的。(如果您可以更具体地缩小范围,那么您将不需要隔离林......)

通常,我会说,这是由一些商业预期决定的。诸如“我们希望看到与报告 x 率的竞争对手相似的比率”。

或者您希望数据集中有一定数量的异常值。然后,您可以使用原始分数找到一个阈值,为您提供该数字,并contamination在将模型应用于新数据时回顾性设置参数。

该参数contamination是数据集中异常值的(疑似)“份额”。考虑这个例子:

from sklearn.ensemble import IsolationForest
x = [[-1], [2], [3], [5], [7], [10], [12], [20], [30], [100]]

IsolationForestwithcontamination=0.1识别“前 10”% 的异常值。

clf = IsolationForest(contamination=0.1).fit(x)
clf.predict(x)
> [ 1  1  1  1  1  1  1  1  1 -1]

-1此处表示“异常值”

设置contamination=0.2会产生被识别为异常值的“十分之二”的值。

clf = IsolationForest(contamination=0.2).fit(x)
clf.predict(x)
> [1  1  1  1  1  1  1  1 -1 -1]

该参数contamination通常需要调整(或者需要做出假设)。调整后,它通常会设置为优化顶级估计器的某些目标的值(在使用 删除异常值之后IsolationForest)。

然后,我用预测结果掩盖了我的数据,将错误恢复归为零;通过计算零点,我可以估计污染。