如何在每行数据中发现异常?

数据挖掘 Python scikit-学习 支持向量机 异常检测
2022-02-23 04:32:30

我有一些我想发现异常的报告数据。这些列是设施名称,然后是该给定设施的月度报告。

-----------------------------------------------------------------------------
| Facility  | 2017  Jan Visitors | 2017 Feb Visitors | 2017  March Visitors |
-----------------------------------------------------------------------------
| Facility 1|         1234       |       1345        |  100345              |
----------------------------------------------------------------------------
| Facility 2|        56          |      567          | 34                   |
----------------------------------------------------------------------------

如何按行训练这个熊猫数据框?

计划使用 sklearn 的一类 SVM。我想获取每个设施中的异常情况,例如在设施 1 中,我将 100345 标记为异常。我有跨越几年的数据。当我们在这里时,我是 ML 和数据科学方面的超级菜鸟,我可以得到一个关于无监督学习的简明教程的指针,我遇到的大多数教程都是有监督的。

2个回答

我假设您的目标是时间序列异常检测,您希望随着时间的推移检测异常值的发生。为此,您需要先建立一个时间序列预测模型,然后在此基础上进行异常值检测。

对于无监督异常值检测,只需查看 Andrew Ng 在 Coursera 上的机器学习课程,其中有一章是关于基于高斯核的异常检测。您还可以阅读 OneClassSVM、LocalOutlierFactor 等的 sklearn 文档。基本上,无监督异常检测的核心思想是设置一个指标来描述样本之间的相似性,然后使用用户定义的阈值来确定新样本是否足够相似其他样品。

假设设施之间没有关系,对数据框进行异常值检测的最直接方法是将每个设施视为单独的数据集,并孤立地查看每个设施。因此,每个设施训练一个模型。简而言之,在无监督的情况下,您希望将模型拟合到返回分数或距离度量的数据集。然后,您可以使用它来判断哪些点是异常值。

对于一类 SVM,您可以调整scikit-learn 新颖性和异常值检测页面隔离林示例上的代码和示例,但请记住,您一次只需要查看一个设施。

如果您不介意不进行无监督学习,并愿意考虑更简单的方法,请以直方图和时间序列的形式绘制每个设施的分布,以计算出预期的异常值数量和规模(除非设施的数量使这令人望而却步)。

了解数据中的异常值后,可以通过z-score转换每个设施的数据并查看最高和最低分数来识别正态分布之外的点;这些点离分布中心最远。为每个设施选择一个阈值并将该阈值之外的所有内容标记为异常值。这假设一个正态分布,因此值得查看直方图和线图,看看这是否适用于您的情况。