问题标签 [isolation-forest]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 用于异常检测的集群训练
根据类似行为对我的数据进行聚类后,我现在正在努力检测每个聚类中的异常情况。数据是pandas.Dataframe()
s 的列表,如下所示:
如您所见,数据帧由时间戳和某些值(这些值已经标准化)组成。作为预处理步骤,我正在重塑数据:
聚类过程发生TimeSeriesKMeans
在数据上train_data
:
这一步至关重要,因为数据具有非常不同的行为,我的目标是基于此集群数据创建多个模型,以使用隔离森林检测每个时间序列(在每个集群中)的异常。因此,我正在创建一个按集群排序的数据框列表。
我得到的是完整的数组,它们被检测为异常值。但我更想要一个“经典隔离森林”,这意味着检测集群中每个数组的异常点。我究竟做错了什么?我的预处理不正确还是我必须以不同的方式提供模型?
TLDR:如何按集群训练单个模型,而不是检测每个集群的异常阵列,而是检测每个阵列的异常点?
data-science - IsolationForest,转换数据
一位同事和我正在尝试检测大型数据集中的异常情况。我们想尝试不同的算法(LOF、OC-SVM、DBSCAN 等),但我们目前正在使用 IsolationForest。
我们的数据集目前形状如下。它是每个用户每天记录的事件类型数量的计数,包含 > 300.000 条记录:
日期 | 用户 | 事件 | 数数 |
---|---|---|---|
2021 年 6 月 1 日 | user_a | 打开 | 2 |
2021 年 6 月 2 日 | user_a | 打开 | 4 |
2021 年 6 月 1 日 | 用户b | 调整 | 3 |
2021 年 6 月 2 日 | 用户b | 打开 | 5 |
2021 年 6 月 2 日 | 用户b | 删除 | 2 |
2021 年 6 月 3 日 | 用户b | 打开 | 7 |
2021 年 6 月 5 日 | 用户b | 移动 | 4 |
2021 年 6 月 4 日 | 用户 c | 调整 | 3 |
2021 年 6 月 4 日 | 用户 c | 移动 | 6 |
我们的目标是自动检测每个用户的异常事件计数。例如,通常每天记录 5 到 10 个“打开”事件的用户,计数为 400 将是异常值。我和我的同事正在讨论我们应该如何为 IsolationForest 算法准备数据集。
我们中的一个人说我们应该删除日期字段并标记其余数据 => 用整数编码所有字符串,让 IF 计算每个记录的异常值。
另一种观点认为不应该进行标签编码,因为无法用整数替换分类数据。然而,数据应该被缩放,用户列应该被删除(或设置为索引),并且事件列中的数据应该被旋转以生成更多维度(下面的示例显示了他想要做什么):
日期 | 用户 | event_Open | event_Modify | 事件_删除 | event_Move |
---|---|---|---|---|---|
2021 年 6 月 1 日 | user_a | 2 | 钠 | 钠 | 钠 |
2021 年 6 月 2 日 | user_a | 4 | 钠 | 钠 | 钠 |
2021 年 6 月 1 日 | 用户b | 钠 | 3 | 钠 | 钠 |
2021 年 6 月 2 日 | 用户b | 5 | 钠 | 2 | 钠 |
2021 年 6 月 3 日 | 用户b | 7 | 钠 | 钠 | 钠 |
2021 年 6 月 5 日 | 用户b | 钠 | 钠 | 钠 | 4 |
2021 年 6 月 4 日 | 用户 c | 钠 | 3 | 钠 | 6 |
所以我们在几点上存在分歧。我将在下面列出它们并包括我对它们的想法:
问题 | 评论 |
---|---|
标签编码 | 是必须的,并且不影响数据集的分类性质 |
缩放 | IsolationForest 本质上对缩放不敏感,因此缩放是多余的 |
删除数据列 | 日期实际上不是数据集中的一个特征,因为日期与每个用户每个事件类型的计数的异常性没有任何相关性 |
删除用户列 | 用户实际上是一个(关键)特性,不应被丢弃 |
枢轴事件列 | 这会生成一个备用矩阵,这可能是不好的做法。它还引入了数据中实际上不存在的关系(例如 user_b 在 2.6 月记录了 5 个打开事件和 2 个删除事件,但这些被认为不相关,因此不应形成单个记录) |
我很好奇你对这些问题的看法。在使用 IsolationForest 算法进行异常检测时,关于上述问题的最佳实践是什么?
machine-learning - 如何使用隔离森林仅找到下边界异常值?
当我使用隔离森林时,它会返回具有较高和较低边界的异常值。隔离森林中是否有任何技术可以仅查找边界较低的异常值?
例如,在下面的代码中
输出是:
我们知道值 1 和 1000 是异常值,1 是下界,1000 是上界。有什么方法可以只找到具有较低边界的值吗?
例如上面的输出必须是这样的:
python - 有什么方法可以找出算法为什么将这些数据检测为异常值?
我使用隔离森林来检测异常值,但我想更多地探索它为什么将这些数据确定为异常值,我很难直接从结果中看到。有没有办法做到这一点?或者我如何检查准确性?
我从 70000 个数据中得到了大约 7000 个异常值,但我不知道这是否准确。
python - 异常检测中的日志预处理
我尝试在无监督的日志消息异常检测上实施这项工作,但预处理步骤对我来说很不清楚。
在这篇论文中,他们告诉消息被填充到 40 个单词,然后计算词频。我不明白为什么需要填充序列,因为像 TF-IDF 这样的词频会根据词汇量的大小生成结果。
所提出的无监督异常检测模型包括两个深度自动编码器网络和一个隔离森林。首先,将包括标记化和将字母更改为小写在内的文本预处理应用于数据集。接下来,将句子填充到 40 个单词,并删除少于 5 个单词的句子。然后计算词频并对数据进行混洗。接下来,对数据集进行归一化并在 0 和 1 之间缩放。
我在这个实验中使用的数据是BGL。
这是一个数据示例。 数据框
目前,我只是将填充序列直接提供给模型。
实际上,自动编码器应该在隔离森林之前应用,但我尝试仅使用隔离森林作为其评估案例之一(a)一个隔离森林。
与纸上的结果相比,结果很糟糕。
python - 从python中的数据集中删除行
我正在尝试获取一些被归类为异常值的行,并从原始数据集中删除这些行,但我无法使其工作 - 你们知道出了什么问题吗?我尝试运行以下代码,并收到此错误“ValueError:索引数据必须是一维的”
python - 我可以使用 SHAP 值的大小作为异常值检测的阈值吗?
我有一个数据集,它有 ~60 列和 ~75000 行。我使用隔离森林模型来检测一些异常值并绘制 shap plot 以查看这些隔离森林的主要特征。
我的问题是:是否可以使用 shap 值作为删除值的阈值?就像如果我为某些变量设置 shap 值的级别,如果 shap 值 > 或 < 阈值,它们将被确定为异常值并且可以被删除。这是可执行的吗?如果是这样,我该如何在python中做到这一点?
python - 如何在 Python 中保存/腌制 IsolationForest 模型?
我正在使用 IsolationForest 来预测异常值。我想保存我所有的步骤,以便下次我可以直接在其他数据上使用它。
我构建隔离林的代码是:
我想腌制 iforest 模型及其之后的步骤。基本上我想保存我写的所有步骤作为一个整体。我应该如何在python中做到这一点?
supervised-learning - 异常检测算法可以为基于逻辑回归的不良监督模型带来多大的改进?
我有一个不平衡的文本数据集(很多 0 和少数 1)。目前我正在使用带有逻辑回归的监督机器学习模型对它们进行分类。在训练集上,准确率是 98%,但召回率只有 32%。显然,这不是正常的文本分类任务,因为数据非常不平衡,几乎是一个奇怪的检测。
现在我面临着权衡。我知道有一些奇怪的检测算法(例如隔离森林?)。但是时间非常有限。如果我更改算法,我是否应该期望模型的性能有很大提高?或者我应该中止任务,因为逻辑模型显示出糟糕的结果?