首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

超棒教程!在Python中使用PyOD进行异常值检测

原文来自analyticsvidhya

作者是LAKSHAY ARORA

介绍

我在做数据科学项目时,涉及到预测特定商店中每种产品的销售情况。有几种方法可以解决这个问题。但无论我使用哪种方法,我的准确度都没有提高。我花了一些时间检查数据后才发现问题---异常值!

这是我们经常忽略的一个错误。根据您已有的数据立刻开始建立模型是很大的诱惑,但这实际上是让自己陷入失败。

数据探索没有捷径可走。如果您跳过数据科学项目的这个阶段直接构建模型只会让您到此为止。经过一段时间后,您将达到准确度的天花板,但模型的性能不会为此让步。

数据探索包括许多因素,例如变量识别,处理缺失值,特征工程等。检测和处理异常值也是数据探索阶段的主要部分。输入的质量决定了输出的质量!

PyOD是一个用于检测数据异常值的库。它提供20多种不同算法来检测异常值,并兼容Python 2和3,绝对是一颗宝石!在本文中,我将带您了解异常值以及如何使用Python中的PyOD检测异常值。

本文假设您具有机器学习算法和Python语言的基本知识。您可以参考这篇文章-“ 机器学习的基本知识 ”(链接请见文末),来理解或重温这些概念。

目录

1. 什么是异常值?

2. 为什么我们需要检测异常值?

3. 我们为什么使用PyOD进行异常值检测?

4. PyOD库的功能

5. 在Python中安装PyOD

6. PyOD中使用的一些异常值检测算法

7. PyOD提供的额外实用程序

8. 在Python中实现PyoD

什么是异常值?

异常值是在数据集中与其他观察值有很大差距的数据点。让我们看一些真实的例子来理解异常值检测:

当一个学生的平均成绩超过90%而其他同学的成绩只有70%时---一个明显的异常值

在分析某个客户的购买模式时,突然出现了非常高的值。虽然他/她的大部分交易都低于Rs.10,000,而这一条是Rs.1,00,000。可能是购买了一个电子产品---无论什么原因,它是整体数据的异常值

Usain Bolt怎么样?当你考虑大多数运动员时,那些破纪录的短跑绝对是异常值

存在异常值的原因有很多。也许分析师在数据输入时出错,或者机器在测量中引起错误,甚至可能是故意产生的!有些人不想透露他们的信息,因此在表格中输入虚假信息。

异常值有两种类型:单变量和多变量。单变量异常值是仅由一个变量中的极值组成的数据点,而多变量异常值是至少两个变量的组合异常分数。假设您有三个不同的变量 - X,Y,Z。如果您在三维空间中绘制这些变量的图形,它们应该形成一种云。位于此云之外的所有数据点都将是多变量异常值。

我强烈建议您阅读这篇数据探索的精彩指南,其中详细介绍了异常值。(链接请见文末)

为什么我们需要检测异常值?

异常值会极大地影响我们的分析和统计建模的结果。下图是出现异常值时模型的情况与处理后的情况:

但这里有一点需要注意:异常值并不总是坏事。了解这一点非常重要。只是简单地从数据中删除异常值,而不考虑它们如何影响结果的话,可能会导致灾难。

“异常值不一定是坏事。这些只是与其他模式不一致的观察。但事实上异常值非常有趣。例如,如果在生物实验中,某只老鼠没有死亡而其他老鼠都死了,去了解为什么将会非常有趣。这可能会带来新的科学发现。因此,检测异常值非常重要。“

- Pierre Lafaye de Micheaux,统计师

我们倾向于使用简单直接的方法,如箱形图,直方图和散点图来检测异常值。但是,在处理大量数据并需要在较大数据集中执行模式识别的领域,专用的异常值检测算法非常有价值。

金融中的欺诈检测和网络安全中的入侵检测需要密集而准确的技术来检测异常值。如果你发现一个异常值但居然是真实的,你能想象那会有多尴尬吗?

PyOD库可以弥补这一缺口。让我们看看它的全部内容。

我们为什么要使用PyOD进行异常值检测?

在各种编程语言中有许多异常检测库。我发现这些语言在R中很有用。但是当我切换到Python时,显然缺少异常值检测库。这怎么可能?!

像PyNomaly这样库并不是专门为异常值检测而设计的(虽然它值得一试!)。为填补这一空白,Yue Zhao、Zain Nasrullah和Zheng Li设计并实现了PyOD库。

PyOD是一个可扩展的Python工具包,用于检测多变量数据中的异常值。它可以在一个文档完备的 API 下实现大约20个异常值检测算法。

PyOD的特点

PyOD有很多优势以及许多有用的功能。以下是我挑选的一些:

包含各种算法的详细文档和示例的开源库

支持高级模型,包括神经网络,深度学习和离群集

使用JIT(即时)与Numba和joblib 并行优化性能

兼容Python 2和3

在Python中安装PyOD

是时候打开Python笔记本了!首先我们来安装PyOD:

就是这么容易!

请注意,PyOD还包含一基于Keras实现的神经网络模型。PyOD不会自动安装Keras或TensorFlow。如果需要的话请手动安装。

PyOD中使用的异常值检测算法

让我们看看PyOD的异常值检测算法。它很好地实现了PyOD,但我觉得理解它的底层工作原理同样重要。这样当在数据集上使用它时将提供更大的灵活性。

注意:我们在本节中使用术语“ 离群评分”。这意味着每个模型以某种方式对数据点进行评分而不是使用阈值来确定该点是否异常。

基于角度的异常值检测(ABOD)

它考虑每个点与其邻近点之间的关系,但不考虑这些邻近点之间的关系。其加权余弦分值与所有相邻分值的方差可视为离群评分

ABOD在多维数据上表现良好

PyOD提供两种不同版本的ABOD:

快速ABOD:使用k近邻来估计

原始ABOD:考虑所有具有高时间复杂性的训练点

k-Nearest Neighbors 检测(KNN)

对于任何数据点,到其第k个最近邻居的距离可以被视为离群评分

PyOD支持三个kNN检测:

最大:使用第k个邻居的距离作为离群评分

平均值:使用所有k个邻居的平均值作为离群评分

中位数:使用与k个邻居距离的中位数作为离群评分

孤立森林

它的内部使用了scikit-learn库。在此方法中使用一组树完成数据分区。孤立森林根据这个数据点在结构中的孤立程度提供异常分数,然后使用异常分数来识别正常观察的异常值

孤立森林在多维数据上表现良好

基于直方图的异常值检测

这是一种有效的无监督方法,它假设特征独立并通过构建直方图来计算异常值

它比多变量方法快得多,但代价是精度较低

局部相关积分(LOCI)

LOCI对于检测异常值和异常值组非常有效。它为每个点提供LOCI图,总结了该点周围区域内数据的大量信息,确定了簇,微簇,它们的直径以及它们的簇间距离

现有的异常值检测方法都不能匹配此功能,因为它们只为每个点输出一个数字

特征集成

特征集成检测在数据集的各种子样本上匹配多种基础检测。它使用平均或其他组合方法来提高预测精度

默认情况下,Local Outlier Factor(LOF)用作基本估算器。但是,任何估算器都可以用作基本估算器,例如kNN和ABOD

特征集成首先通过随机选择特征子集来构造n个子样本。这带来了基本估算的多样性。最后,通过平均或取所有基础检测器的最大值来生成预测分数

基于聚类的局部异常因子

它将数据分为小型集群和大型集群。然后根据点所属集群的大小以及到最近的大集群的距离来计算异常分数

PyOD提供的额外实用程序

函数generate_data 可用于生成具有异常值的随机数据。内部数据由多元高斯分布生成,异常值由均匀分布生成。

我们可以在数据集中提供自己的异常值分数和我们想要的样本总数。我们将使用此实用函数在实现时创建数据。

PyOD的实施

解释这么多已经够了,让我们行动起来吧。在本节中,我们将在Python中实现PyOD库。我将使用两种不同的方法来演示PyOD:

使用模拟数据集

使用真实世界的数据集 - 大市场销售竞赛

模拟数据集上的PyOD

首先导入所需的库:

现在,导入想要用来检测数据集中异常值的模型。我们将使用ABOD和KNN:

现在创建一个带有异常值的随机数据集并绘制它。

创建一个字典并添加要用于检测异常值的所有模型:

将数据拟合到我们在字典中添加的每个模型,然后查看每个模型如何检测异常值:

看起来不错!

大型市场销售问题上的PyOD

现在看PyOD是如何在著名的大型市场销售问题上做的。

首先从导入所需的库并加载数据开始:

绘制Item MRP 和Item Outlet Sales直观的了解数据:

Outlet Sales的范围是0到12000,MRP是0到250.我们将这两个特征缩小到0到1之间的范围。这需要创建一个可解释的可视化效果(否则它将变得过于拉伸)。除此以外,对于这些数据,使用相同的方法将花费更多的时间来创建可视化。

注意:如果您不想要可视化,则可以使用相同的比例来预测某个点是否为异常值。

将这些值存储在Numpy 数组中,以便稍后在我们的模型中使用:

我们再次将创建一个字典。但这一次,我们将添加更多模型来看每个模型如何预测异常值。

您可以根据问题和对数据的理解来设置离群分数值。在我们的示例中,我想检测5%与其他数据不相似的观测值。所以,我要将离群分数值设置为0.05。

现在,我们将逐个拟合每个模型的数据,看看每个模型预测异常值方式的区别。

OUTPUT

在上图中,白点是由红线包围的样本点,黑点是蓝色区域中的异常值。

尾声

这对我来说也是一次非常美妙的学习经历。我花了很多时间研究PyOD并用Python实现它。我鼓励你在不同的数据集上练习使用它--它是一个非常有用的库!

PyOD已经支持大约20种经典的异常值检测算法,可用于学术和商业项目。其贡献者计划通过实现与时间序列和地理空间数据配合良好的模型来增强这个工具箱。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190221B12BHF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com