使用隔离森林进行多变量异常值检测。如何检测最有效的特征?

数据挖掘 Python scikit-学习 异常检测 离群值
2021-10-08 17:07:49

我正在尝试使用 5000 个观察值和 800 个特征来检测我的数据集中的异常值。我已按照http://scikit-learn.org/stable/auto_examples/ensemble/plot_isolation_forest.html中的简单步骤进行操作

stackoverflow 和其他来源中也有一些示例,但是,我找不到关于隔离森林返回的异常值的解释的体面解释。首先,我所做的是:

from sklearn.ensemble import IsolationForest

X_train = trbb[check_cols]

clf = IsolationForest(n_jobs=6,n_estimators=500, max_samples=256, random_state=23)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_train

这将返回 array([1, 1, 1, ..., 1, 1, 1]) 其中 -1 是异常值。

y_pred_train 的形状为 5000,与 X_train[0] 相同。所以-1的索引对应X_train的索引。对于经验。IF 返回的异常值索引之一是 532。因此这意味着该索引中的点(在 800 维空间中)被检测为异常值。检测到这一点后,我该如何接近并使用结果进行更多挖掘?例如,我能否找到导致异常值的最重要特征?

为此,我应用了 PCA 并将新创建的 (50) 个组件用作新变量。然后,通过绘制带有 IF 返回的 -1 和 1 的组件对,我试图了解可能的异常值。确实,我观察到如下几点:

在此处输入图像描述

在这里,黑点是-1s(异常值),黄色点是1s(inliers)。我的解释是,如果两个组件的值都非常高,则可能会导致异常值。但是,我如何确定哪些原始值对这些异常值最有效?例如,我可以在相关组件中使用权重最高的原始变量(让我们选择前 10 个)吗?或者你能建议任何其他方法吗?

提前致谢!

1个回答

隔离森林与其他类型的决策树的一个重要区别是它随机选择特征并随机分割数据,因此它不会产生一个很好的特征重要性列表;异常值是那些以更少的分裂而被隔离或最终在终端节点中几乎没有观察到的那些。

我想如果您深入研究代码,您可能能够根据使用它们的拆分级别和节点中的观察数量对特征进行排名,但是 AFAIK scikit-learn 实现和 Zelazny 的 R 实现都没有这样的一个内置的东西(尽管 R 有一些针对单个节点的功能:https ://github.com/Zelazny7/isofor/blob/master/R/interpret.R )。

然而,在您从样本中识别出异常值后,您可以将其用作分类问题的标记数据,并从那里拟合一个模型,例如 xgboost 或随机森林,可以为您提供特征重要性。