我在尝试检测数据集中的异常值时,发现了sklearn的隔离森林。我无法理解如何使用它。我将训练数据拟合进去,它返回了一个包含-1和1值的向量。
有谁能向我解释它是如何工作的,并提供一个例子吗?
我如何知道这些异常值是“真正的”异常值?
如何调整参数?
这是我的代码:
clf = IsolationForest(max_samples=10000, random_state=10)clf.fit(x_train)y_pred_train = clf.predict(x_train)y_pred_test = clf.predict(x_test)[1 1 1 ..., -1 1 1]
回答:
看起来你有很多问题,让我尽我所知,一一回答它们。
它是如何工作的?
它之所以有效,是因为任何数据集中异常值的本质是“少而不同”,这与典型的基于聚类或基于距离的算法大不相同。从最高层面来看,它的工作逻辑是,异常值与数据集中的“正常”点相比,需要更少的步骤来“隔离”。为此,IF所做的是:假设你有一个包含n个数据点的训练数据集X,每个数据点有m个特征。在训练过程中,IF为不同特征创建隔离树(二叉搜索树)。
在训练阶段,你有三个参数可以在训练阶段进行调整:
- 隔离树的数量(在sklearn_IsolationForest中为
n_estimators
) - 样本数量(在sklearn_IsolationForest中为
max_samples
) - 从X中抽取的用于训练每个基础估计器的特征数量(在sklearn_IF中为
max_features
)。
max_samples
是从原始数据集中随机挑选的样本数量,用于创建隔离树。
在测试阶段:
-
sklearn_IF 查找测试数据点在所有训练过的隔离树中的路径长度,并计算平均路径长度。路径长度越长,点越正常,反之亦然。
-
基于平均路径长度,它计算异常分数,sklearn_IF的decision_function可用于获取此分数。对于sklearn_IF,分数越低,样本越异常。
-
根据异常分数,你可以通过在sklearn_IF对象中设置适当的
contamination
值来决定给定样本是否异常。contamination
的默认值为0.1,你可以调整此值来决定阈值。数据集的污染程度,即数据集中异常值的比例。
调整参数
训练 -> n_estimators
, max_samples
, max_features
。
测试 -> contamination