【问题标题】:How to use Isolation Forest如何使用隔离森林
【发布时间】:2017-08-21 03:24:26
【问题描述】:

我正在尝试检测我的数据集的异常值,我找到了 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]

【问题讨论】:

    标签: python machine-learning scikit-learn outliers


    【解决方案1】:

    看来你有很多问题,让我尽我所能一一解答。

    它是如何工作的?

    之所以有效,是因为任何数据集中的异常值(即异常值)的性质很少且不同,这与典型的基于聚类或基于距离的算法有很大不同.在顶层,它的逻辑是,与任何数据集中的“正常”点相比,异常值需要更少的步骤来“隔离”。 为此,IF 就是这样做的;假设您的训练数据集 X 包含 n 个数据点,每个数据点都有 m 个特征。在训练中,IF 为不同的特征创建隔离树(二叉搜索树)。

    对于训练,您在 train 阶段需要调整 3 个参数:

    1. 隔离树的数量(n_estimators in sklearn_IsolationForest)
    2. 样本数(sklearn_IsolationForest 中的max_samples
    3. 从 X 中提取以训练每个基本估计器的特征数(max_features in sklearn_IF)。

    max_samples 是它将从原始数据集中挑选的随机样本数,用于创建隔离树。

    测试阶段:

    • sklearn_IF 从所有经过训练的 Isolation Trees 中找到待测数据点的路径长度,并找到平均路径长度。路径长度越大,点越正常,反之亦然。

    • 基于平均路径长度。它计算异常分数,可以使用 sklearn_IF 的 decision_function 得到这个。对于sklearn_IF,分数越低,样本越异常。

    • 根据异常分数,您可以通过在 sklearn_IF 对象中设置 contamination 的正确值来确定给定样本是否异常。 contamination 的默认值为 0.1,您可以调整该值以确定阈值。数据集的污染量,即数据集中异常值的比例。

    调整参数

    培训 -> n_estimators, max_samples, max_features.

    测试 -> contamination

    【讨论】:

    • 感谢您的回答。能否请您看一下相关帖子here
    • 默认的 contaminationauto,它将默认的 offset 设置为 -0.5。您是如何到达 0.1 的?
    【解决方案2】:

    -1 表示异常值(根据拟合模型)。请参阅IsolationForest example 以获得对该过程的良好描述。如果您有一些先验知识,您可以提供更多参数以获得更准确的拟合。例如,如果您知道污染(数据集中异常值的比例),您可以将其作为输入提供。默认情况下,它假定为 0.1。参看参数说明here

    【讨论】:

    • 感谢您的回答。可以请您看一下相关帖子here吗?
    【解决方案3】:

    让我补充一点,当我读到这个问题时,我被卡住了。

    大多数时候,您将它用于二进制分类(我假设),其中您有一个多数类 0 和一个异常值类 1。例如,如果您想detect fraud,那么您的主要类是非欺诈(0) 而欺诈是 (1)。

    现在,如果您有训练和测试拆分:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

    然后你运行:

    clf = IsolationForest(max_samples=10000, random_state=10)
    clf.fit(x_train)
    y_pred_test = clf.predict(x_test)
    

    “正常”分类器评分的输出可能非常混乱g。如前所述,y_pred_testwill 由 [-1,1] 组成,其中 1 是您的多数类 0,-1 是您的次要类 1。所以我可以建议您转换它:

    y_pred_test = np.where(y_pred_test == 1, 0, 1)
    

    然后你就可以使用正常的评分功能等了。

    【讨论】:

    • 我相信 IF 指的是无监督学习,而您在这里指的是有监督的异常检测
    • 即使模型以无监督方式工作,标签也可用于测量准确性等。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2018-09-10
    • 2019-07-11
    • 2019-06-29
    • 2020-11-16
    • 2019-08-02
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多