我正在尝试检测我的数据集的异常值,我找到了 sklearn 的 Isolation Forest 。我不明白如何使用它。我将我的训练数据放入其中,它返回一个具有 -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]
原文由 dapo 发布,翻译遵循 CC BY-SA 4.0 许可协议
看来你有很多问题,让我尽量一一回答。
怎么运行的?
它之所以起作用,是因为任何数据集中异常值的性质,即异常值,都是 少数且不同 的,这与典型的基于聚类或基于距离的算法有很大不同。在顶层,它的工作逻辑是,与任何数据集中的“正常”点相比,异常值“隔离”的步骤更少。为此,这就是 IF 所做的;假设您有包含 n 个 数据点的训练数据集 X ,每个数据点具有 m 个特征。在训练中,IF 为不同的特征创建隔离树(二叉搜索树)。
对于训练,您有 3 个参数用于在 训练 阶段进行调整:
n_estimators
在sklearn_IsolationForest中)max_samples
在sklearn_IsolationForest中)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