我正在使用隔离森林算法对时间序列数据进行无监督异常检测任务。我正在用 Python 开发它,更详细地使用scikit-learn
.
我找到了很多这方面的例子,但不是很清楚,在 IsolationForest 的实例化过程中如何设置污染参数。
查看文档,污染是
数据集的污染量,即数据集中异常值的比例。
我应该使用一些统计技术来确定这个百分比吗?
我正在使用隔离森林算法对时间序列数据进行无监督异常检测任务。我正在用 Python 开发它,更详细地使用scikit-learn
.
我找到了很多这方面的例子,但不是很清楚,在 IsolationForest 的实例化过程中如何设置污染参数。
查看文档,污染是
数据集的污染量,即数据集中异常值的比例。
我应该使用一些统计技术来确定这个百分比吗?
我认为答案是“视情况而定”。contamination
当评分数据点应被视为异常值时,该参数仅控制决策函数的阈值。它对模型本身没有影响。
根据您的应用,使用一些统计分析来粗略估计污染可能是有意义的。(如果您可以更具体地缩小范围,那么您将不需要隔离林......)
通常,我会说,这是由一些商业预期决定的。诸如“我们希望看到与报告 x 率的竞争对手相似的比率”。
或者您希望数据集中有一定数量的异常值。然后,您可以使用原始分数找到一个阈值,为您提供该数字,并contamination
在将模型应用于新数据时回顾性设置参数。
该参数contamination
是数据集中异常值的(疑似)“份额”。考虑这个例子:
from sklearn.ensemble import IsolationForest
x = [[-1], [2], [3], [5], [7], [10], [12], [20], [30], [100]]
IsolationForest
with将contamination=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
)。
然后,我用预测结果掩盖了我的数据,将错误恢复归为零;通过计算零点,我可以估计污染。