异常检测是检测与大多数数据明显不同的任何罕见事件。这些罕见事件不符合明确定义的行为。它们也被称为异常值、噪声、新奇或异常情况。罕见事件可能对业务运营产生不利影响,并导致重大损失。公司必须快速准确地检测它们,以减少和预防未来的损失。因此,异常检测成为数据科学中的一个重要主题。数据专业人员一直直接或间接参与欺诈检测和风险缓解。
已经提出了各种类型的建模算法用于异常检测。从简单到复杂地介绍异常检测算法将非常有帮助。最好能够解释一些选定的算法,并通过代码示例进行演示。这样的手册有望帮助数据专业人员检测异常。这是本手册的动机。
(A) 异常检测的应用是什么?
保险欺诈、网络黑客、设备故障和生产故障是罕见事件的例子,而异常检测技术一直发挥着关键作用。让我介绍一些现实世界的应用,以了解它们的重要性。
(A.1) 保险欺诈
欺诈是故意和蓄意执行以欺骗任何福利计划或获得经济利益。在保险业中,欺诈不仅给保险公司带来额外成本,还对消费者和企业造成经济影响。反保险欺诈联盟报告称,欺诈每年给企业和消费者造成3086亿美元的损失[1]。FBI估计,欺诈每年给普通家庭带来400至700美元的保费[2]。
近年来,欺诈的增长变得前所未有。让我们以两种流行的保险类型,财产保险和汽车保险,来看看欺诈是如何发生的。在家庭财产保险中,关于火灾损失的索赔是最昂贵的类别之一。虚假的火灾索赔可以发生在个人住宅索赔或商业财产索赔中。索赔人夸大损失,甚至故意策划火灾损失。火灾索赔之后,欺诈发生在盗窃和入室盗窃索赔中。虽然大多数索赔是真实和诚实的,但有些索赔人可能夸大损失,或者可能伪造盗窃损失以获得索赔赔付。在汽车保险中,策划虚假索赔对保险专业人员来说并不新鲜。例如,欺诈分子可以策划一起车祸,然后安排证人告诉警察受害者有责任。或者,车主可以让他的伙伴偷走他的车并将其拆分出售,然后提出车辆失窃索赔。
当我们准备在本教程中应用数据科学进行异常检测时,让我们使用数据科学术语来区分异常值和欺诈事件之间的区别。每个变量都有异常值,但并非所有异常值都是欺诈行为。例如,典型零售购物中的牛奶加仑数为1或2加仑,而大家庭或企业可能在一次购物中购买超过5加仑。后一种情况是异常值,但并非欺诈行为。欺诈活动往往出现在异常值中,因此我们关注异常值以检测它们。
(A.2) 机械故障检测
如今的现代大型机器经过精心设计,以确保正常运行,故障率非常低。然而,潜在的机械故障仍然可能发生并导致无法恢复的损失。安装了监控系统以发出任何异常情况的信号。考虑到在机器的许多部分(如冷却风扇、轴承、涡轮、齿轮和皮带)安装的温度传感器。检测到异常情况可以给工程师提供反应和防止危机发生的时间。例如,美国核能办公室的这份研究报告[3]展示了如何将异常检测技术应用于核电厂。
没有人可能不同意采取主动措施来防范任何可能的情况。然而,太多的虚假警报可能导致耗时的检查和停机,并可能延迟真正需要的调查。这种权衡指出了异常检测模型的一个重要标准——高准确性和低误报率。数据科学家面临的挑战是开发具有准确预测和低误报率的模型。这本教程的目标是调查各种算法,帮助数据科学家获得更好的模型结果。
(A.3) 网络安全
网络攻击发生是由于恶意意图、疏忽操作或外部恶意软件攻击。任何一次攻击都可能摧毁企业的财务资产,并导致无法恢复的损失。入侵检测系统有助于监控通过防火墙、网络网关和所有网络的流量。这些系统中内置了机器学习算法,用于检测任何恶意活动。
(B) 这教程适合谁?
正在寻找异常检测方法或想了解异常检测的新发展的读者会发现本教程很有帮助。数据科学专业人员将深入了解不同建模技术的实践。
© 本教程中的算法适用于多元数据
数据可以大致分为多元数据、序列数据和图像数据。多元数据可能是最常见的类型。它可以以数据矩阵的形式呈现,其中行对应于个体观测值,列对应于变量。序列数据包括任何单变量数据,如时间序列数据、文本句子或语音流数据。图像数据指的是数字图片或通过电子设备扫描产生的数据。本教程中的算法最适合多元数据。
(D) 异常检测建模中的挑战是什么?
异常检测建模的挑战是将异常视为正常模式,或将正常模式视为异常。如果模型将异常错误地分类为正常并让其不被注意到,业务可能会遭受无法恢复的损失。另一方面,创建太多的虚假警报是没有帮助的,因为它不断干扰正常操作。因此,异常检测需要多种算法来发现隐藏的数据模式,对罕见事件进行仔细调查,并更好地理解噪声的来源。
异常值具有三个明显的特点:(1) 罕见,(2) 异质,(3) 演变。异常值的罕见性意味着如果使用监督学习模型,目标极度不平衡。异常值是异质的,因为它们可能包括不同类型的罕见事件。异常值可以演变,因为欺诈者可以学习或发明新的攻击系统的技巧。
这些特性对于选择建模算法具有直接的影响。无监督学习算法自然适用于检测新类型的异常值。与监督学习技术相比,无监督学习可能提供较低的预测性能。另一方面,监督学习在检测已知类型的异常值方面是有效的。标记的异常值可以来自多种类型的异常值。监督学习可以更精确地针对异常值的类型。缺点是,如果没有标记的示例,它无法检测到新类型的异常值。
基于上述原因,建议使用无监督学习算法来探索不同类型的异常值。在验证和收集了不同类型的异常值之后,可以构建监督学习算法来针对这些特定类型的异常值。例如,我们之前提到的火灾索赔示例,一种欺诈类型是策划的军火库犯罪,另一种类型是火灾损失的夸大。这两种类型的异常值都偏离了常规的保险索赔。从监督学习的角度来看,这两种类型仍然可以标记为目标变量的1,其余常规索赔为0。监督学习模型将能够更准确地识别这两种类型的欺诈,并可能提出其他类型的可疑索赔,如这两种类型。
异常值的罕见性意味着在监督学习环境中,目标将极度不平衡。类别不平衡可能导致对多数类别的严重偏见,降低分类性能并增加虚假阴性的数量。这就是为什么本手册包括两章关于过采样和欠采样技术用于监督学习的原因。
(E) 如何选择本教程中的算法?
由于存在许多异常检测算法,并不需要涵盖所有算法,我为算法的选择设定了三个理由。第一个理由是算法速度。模型训练和评估是一个迭代过程,需要深入的领域知识。从项目管理的角度来看,突出快速算法将非常有用。这些算法包括经验累积异常检测(ECOD)、基于直方图的异常得分(HBOS)和孤立森林(IForest)。
第二个算法被包含在本教程中的原因是它们的普及度。读者可能听说过主成分分析(PCA)、K最近邻(KNN)、高斯混合模型(GMM)或单类支持向量机(OCSVM)。一些读者可能在统计课程中使用过这些算法。这些算法的普及性使它们易于理解并在生产中采用。
本教程中算法的第三个原因是它们代表了类似算法。通过学习这些算法,读者可以将相同的思想应用于其他变体。这些算法包括局部离群因子(LOF)、基于聚类的局部离群因子(CBLOF)、基于极限增强的异常检测(XGBOD)和自动编码器。通过学习XGBOD,读者可以尝试其他监督学习方法。通过学习自动编码器,读者可以应用于变分自动编码器(VAE)。
异常检测模型可以分为基于相似度、基于分布和基于集成的算法。首先,异常值是与其他值相距较远的罕见事件,一种直观的方法是测量数据点之间的接近程度。这些是基于相似度的算法,包括KNN、IForest、OCSVM、LOF和CBLOF。其次,基于接近性的概念,我们可以拟合变量的分布以发现异常值。这种类型的算法称为基于分布的。HBOS、ECOD和GMM都是基于分布的。最后,随着机器学习的进步,一些算法使用集成模型以追求更好的准确性。这种类型称为基于集成的。IForest和XGBOD是基于集成的。
本教程中的这十一种算法有望在算法空间中提供深度和广度。建议读者比较多种方法以获得最佳结果,甚至进一步研究本教程未包含的其他方法。
(F) 从无监督学习到监督学习的项目管理
通常,我们需要使用无监督学习设置,因为很难找到足够的罕见事件作为监督学习模型的目标。许多无监督学习模型,如单侧支持向量机(OCSVM),是在罕见事件极难找到时开发的。
如何管理无监督模型的结果?无监督学习模型的结果应该由人眼验证是否为期望的结果。例如,假设为保险欺诈应用开发了一个无监督学习模型,无监督模型识别出的异常值将由特别调查组(SIU)专业人员进行调查。
随着时间的推移,将会有足够的欺诈索赔。我们将了解人口中真实欺诈的百分比。我们可以将它们标记为目标实例并开发监督模型。该模型将旨在找到与目标实例类似的其他实例。记住,任何监督学习模型中的目标实例在过去曾经经过验证。
(G) 方法和建模过程
本教程将遵循以下建模过程。该过程将使您专注于模型的开发、评估和结果的解释。
-
模型开发
-
阈值确定
-
正常组和异常组的描述统计
当完成步骤1时,模型将为所有实例提供预测的异常值分数。实例的高异常值分数表示它是一个异常值。然而,我们没有目标来验证结果,我们不知道异常值的百分比。即便如此,我们仍然可以使用异常值分数来理解相对的“异常度”并识别那些与常规实例不同的实例。
在步骤2中,我们将异常值分数绘制在直方图中,然后选择一个阈值来区分正常观测和异常观测。阈值决定异常组的大小。如果任何先前的简要建议异常值的百分比不应超过1%,则可以选择一个导致约1%异常值的阈值。
步骤3是一个关键步骤,用于传达模型的可靠性。应仔细检查两个组之间特征的描述性统计(例如均值和标准差)。如果预期异常组中的特征均值应更高或更低,但结果与直觉相反,建议您检查或修改该特征。例如,在信用卡欺诈案例中,欺诈者希望在短时间内获得尽可能多的钱。异常值应该是与月度平均值差异很大的交易。在描述性统计表中,预期异常组的平均交易金额应高于正常组。如果不是这种情况,您应该检查该特征。您将迭代建模,直到所有特征在描述性统计表中都有意义。
(H) 什么是Python异常值检测(PyOD)?
正如其GitHub页面(https://github.com/yzhao062/pyod)上的标语所说,“Python异常值检测模块是一个全面且可扩展的Python库,用于异常值检测(异常检测)”。PyOD为55多个算法提供统一的API,并不断扩展。自2017年推出以来,它受到了广泛关注,已经下载了800多万次。主要贡献者是Yue Zhao,Zain Nasrullah和Zheng Li。
(H) 本教程的组织结构是怎样的?
本教程涵盖了主要的异常值检测算法,并提供了代码示例。对于每个算法,我介绍了其优点和局限性。本教程从基于邻近性、基于分布和基于集成的算法中选择了11个算法。所选的算法将使读者能够扩展到其他相关算法。
在“第1章:介绍”中,我讨论了异常值的特征。我提供了异常检测的建模过程。完成本章后,读者将全面了解技术选择的原因。
在“第2章:基于直方图的异常值分数(HBOS)”中,我介绍了一种直观且高效的无监督方法。本章详细介绍了过拟合的危险以及使用聚合方法来减轻过拟合的方法。本章还构建了几个用户定义的实用函数,这些函数将在本教程中使用。
在“第3章:基于经验累积分布的异常值检测(ECOD)”中,我解释了该算法如何应用非参数方法来估计累积分布。读者将发现ECOD非常易于理解,就像HBOS一样。
在“第4章:孤立森林”中,我解释了IForest与其他建模方法的区别。IForest与随机森林有类似的方法。本章中的可视化将使您更深入地了解。
在“第5章:主成分分析(PCA)”中,您将对这种熟悉的方法有一个更新的理解。
在“第6章:单类支持向量机(OCSVM)”中,您将清楚地了解单类支持向量机是如何从支持向量机中产生的,甚至欣赏其显著的方法。
在“第7章:高斯混合模型(GMM)”中,我对最大对数似然估计和期望最大化算法进行了视觉和详细的处理。我可视化了GMM与流行的K均值之间的差异。您将获得在异常值检测中应用GMM的扎实知识。
在“第8章:K最近邻(KNN)”中,我将首先解释为什么KNN可以在监督学习或无监督学习环境中使用。没有多少书籍或在线资源对此进行区分。本章将让您对KNN有一个新的看法。
在“第9章:局部离群因子(LOF)”中,我将将该主题分解为小步骤,并逐一解释它们。您将看到它如何利用KNN的概念,如何定义异常值以及何时特别有效。
在“第10章:基于聚类的局部离群因子(CBLOF)”中,我介绍了LOF的修改。您将了解LOF的优势和局限性,以及CBLOF如何克服这些局限性。
在“第11章:极限梯度提升异常值检测(XGBOD)”中,我介绍了一种称为表示学习的新概念。您将对先前章节中的无监督学习算法如何在监督学习模型中使用以实现更好的模型可预测性有一个新的认识。
在“第12章:自动编码器”中,我对深度学习框架进行了全面的调查,这是自动编码器的基础。鉴于一些读者可能没有深度学习背景,我从回归开始,以便过渡到深度学习。本章进一步解释了深度学习参数的细节。这种独特的处理将使读者具备构建自动编码器和深度学习模型的深入知识。
监督学习建模仍然是异常值检测的主要方法。然而,异常值的稀缺性意味着目标变量极度不平衡。这个问题可能会降低模型性能并增加假阴性的数量。当目标变量极度不平衡时,数据采样技术是解决方法。在“第13章:极度不平衡数据的欠采样”和“第14章:极度不平衡数据的过采样”中,我介绍了7种欠采样和3种过采样技术。
(I) 本教程中的数据
在教程中,我使用相同的数据生成过程(DGP)。这使您可以比较各种建模技术的结果。
(J) 代码示例
代码示例的整个目的是可以复制。本教程提供了所有代码的GitHub存储库。对于每一章,您将找到一个可执行的Jupyter Notebook。在Google Colab上运行笔记本是最简单的方法,因为您甚至不需要在本地计算机上安装Python。如果您对Google Colab的设置不熟悉,可以参考“开始使用Google Colab免费GPU”。
(K) 更多公共异常值检测数据集
如果您正在寻找用于模型训练的公共数据集,以下是一些数据源供您考虑。一个组织良好的数据集是ODDS(异常值检测数据集)(http://odds.cs.stonybrook.edu)。它包含许多代表各种领域和数据类型的数据集,例如多变量数据、时间序列数据、时间序列图数据、视频数据和网络安全数据。其中一些数据集具有标记的目标变量。因此,ODDS中的数据集可以用于监督或无监督学习模型的开发。下面让我引用两个数据集来解释它们的用途。
第一个是ODDS中的手写数字MNIST数据集(http://odds.cs.stonybrook.edu/mnist-dataset/),其中包含一个额外的变量。MNIST数据集是数据科学界广为人知的数据集。它包含由美国邮政服务提供的手写数字。与常规的MNIST数据集不同,该数据集具有目标标签“1”表示异常值,“0”表示正常值。它适用于监督学习。感兴趣的读者可以参考Bandaragoda, Tharindu R.等人的论文[6]以了解其目标创建方法。
第二个是ODDS中的Wine数据集,它包含13个葡萄酒属性和3个类别。在这三个葡萄酒类别中,将类别1的实例减少到仅有10个作为异常值。该数据集具有目标标签,因此适用于监督学习。感兴趣的读者可以参考Sathe和Aggarwal的论文[7]以了解其目标创建方法。
(L) 如何使用本教程?
我尽量使各章节相互独立。以下是一些建议,以便读者能够最好地利用本教程。
异常检测系列文章导航
异常检测系列:Histogram-based Outlier Score_HBOS算法