本文主要是介绍孤立森林 Isolation Forest 论文翻译(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
README
自己翻译的+参考有道,基本是手打的可能会有很多小问题。
括号里的斜体单词是我觉得没翻译出那种味道的或有点拿不准的或翻译出来比较奇怪的地方,尤其是profile、swamping和masking这三个词不知道怎样更准确。
欢迎指正和讨论,需要Word版可以留言。
孤立森林
摘要
大多数现有的基于模型的异常检测算法构建了一个正常实例的特征轮廓(profile),然后将不符合正常轮廓的实例识别为异常。本文提出了一种完全不同的基于模型的方法,显示地隔离异常而不是构建正常点的特征轮廓。据我们所知,目前的文献中还没有讨论过孤立的概念。
隔离性的使用使得本文提出的方法,iForest,能够在一定程度上采用现有方法无法使用的子采样,创建了一个有低常数项和低内存需求的线性时间复杂度的算法(an algorithm which has a linear time complexity with a low constant and a low memory requirement)。本文的实验结果表明,iForest在AUC和处理时间上优于ORCA(一种具有线性时间复杂度的基于距离的方法)、LOF和随机森林,尤其是在大数据集上。iForest也适用于具有大量不相关属性的高维问题,以及训练集不包含任何异常的情况。
1 引言
异常是具有与正常实例不同的数据特征的数据模式。异常的监测有明显的相关性(significant relevance),通常可以为各种应用领域提供关键的可操作(actionable)信息。例如,信用卡交易中的异常可能表示信用卡的欺诈使用。一张天文学图片中的一个异常点可能表明一颗新星的发现。一个不正常的计算机网络流量模式可能代表着未经授权的访问。这些应用需要检测性能高和执行速度快的异常检测算法。
大多数现有的基于模型的异常检测算法构建一个正常实例的轮廓,然后将不符合正常轮廓的实例识别为异常。值得注意的例如统计方法[11]、基于分类的方法[1]、基于聚类的方法[5]都使用了这种普遍的方法。这种方法的两个主要缺点是:(i)异常检测器被优化用于构建正常实例的轮廓,而不是被优化用于检测异常——结果,异常检测的结果可能并不像预期的一样好,导致大量的误报(将正常实例识别为异常)或检测到的异常太少;(ii)许多现有的方法由于其较高的计算复杂度而被局限于低维数据和小数据量的情况。
本文提出一种基于模型的不同类型的方法,显式地分离异常而不是对正常实例构建轮廓。为了实现这个目的,本文的方法利用了异常点的两个数量属性(quantitative properties):i)它们是由较少实例组成的少数,并且 ii)它们有和正常实例非常不同的属性值。换言之,异常“少且不同”,这使得它们比正常点更容易被孤立。本文表明一个树结构可以被有效地构建来隔离每个单独的实例。由于它们容易被孤立,异常点在离树的根结点更近的地方被隔离;而正常点在树的更深的末端被隔离。树的这种隔离特征构成了本文方法检测异常的基础,本文称这种树为孤立树(Isolation Tree)或iTree。
本文提出的方法,被称为孤立森林(Isolation Forest)或iForest,为一个给定的数据集合构建一个iTrees的集合,异常为iTrees中有短平均路径长度的实例。这种方法中只有两个变量:要构建的树的数量和子采样大小。本文表明少数量的树的iForest的检测性能很快地收敛,并且只需要一个小的子采样大小来实现高效的高性能表现。
除了隔离和构建特征的关键区别外,iForest还在以下方面与现有的基于模型的方法[11, 1, 5]、基于距离的方法[6]、基于密度的方法[4]不同:
●iTrees的隔离特性使它们能够构建部分模型并在一定程度上利用现有方法不能使用的子采样。由于异常检测不需要分离正常点的iTree的大部分,这部分不需要被构建。一个小的采样大小产生更好的iTrees因为减轻了淹没效应(swamping)和掩蔽效应(masking)。
●iForest不使用距离或密度方法来检测异常。这消除了所有基于距离和基于密度的方法中距离计算的主要计算消耗。据我们所知,现有的性能最好的方法仅能接近线性时间复杂度且内存使用率高[13]。
●iForest具有扩展处理超大数据规模和具有大量不相关属性的高维问题的能力。
本文的结构如下:在第二节,本文使用一棵递归划分数据的iTree来演示隔离。一种基于iTrees的异常分数也被提出。在第三节,本文描述这种方法有利于解决swamping和masking问题的特点。在四节,本文提供构建iTrees和iForest的算法。第五节将该方法与三种最先进的异常检测器进行了实证比较;本文还分析了所提方法的效率,还从AUC和处理时间两个方面报告实验结果。第六节讨论效率,第七节总结本文。
2 孤立和孤立树(Isolation and Isolation Trees)
在本文中,术语孤立(isolation)意味着“从剩下的实例中分离出一个实例”。由于异常点“少且不同”,因此他们更容易被分离。在数据诱导(data-induced)的随机树中,递归地重复对实例的划分,直到所有实例都被隔离。这种随机划分会使异常产生显著的更短的路径由于(a)少的异常实例导致少数量的划分——在树结构中更短的路径,而且(b)有明显不同属性值的实例更容易在早期的划分中被分离出来。因此,当随机树森林集体为某些特定点产生较短的路径长度时,它们很可能是异常点。
图1. 异常更容易被分离因此有短路径长度。给定一个高斯分布(135个点),(a)一个正常点xi 需要12次划分来被隔离;(b)一个异常点 xo只需要四次划分就被隔离出来。(c)xi和xo的平均路径长度随着树的数量的增加而收敛。
为了证明异常点更容易在随机划分中被隔离出来的观点,本文在图1(a)和1(b)中展示了一个例子来可视化一个正常点和异常点的随机划分。我们观察到一个正常点,xi,通常需要更多划分来被隔离。对于异常点xo来说,情况也正好相反,通常需要较少的划分来被隔离。在这个例子中,划分是通过随机选择一个属性,然后随机选择一个所选属性的最大值和最小值之间的划分值。由于递归地划分可以用一个树结构来表示,分离一个点需要的划分次数相当于从根结点到一个终端结点的路径长度。在这个例子中,xi 的路径长度大于xo的路径长度。
由于每次划分是随机产生的,各个树是由不同的划分的集合生成的。本文计算许多树的路径长度的平均值来得到平均路径长度。图1(c)表明xo和xi 的平均路径长度随着树的数量的增加而收敛。使用1000棵树,xo和xi 的平均路径长度分别收敛到4.02和12.82。这表明异常点有比正常点更短的路径长度。
定义:孤立树(Isolation Tree)。令 T 为一棵孤立树的一个结点。T 要么是一个没有孩子的外部节点,要么是一个有一个检验(test)和恰好两个子结点(Tl,Tr)的内部节点。一个检验包括一个属性q和一个划分值p,检验 q<p 将数据划分到Tl和Tr。
给定一个d变量分布(a d-variate distribution)的n个实例的数据集来构建一棵孤立树(iTree),本文通过随机选择一个属性q和一个划分值p来递归划分X直到以下情况之一:(i)树达到了高度限制,(ii)|X| = 1或(iii)所有X中的数据具有相同的值。一棵iTree是一棵完全二叉树,树中的每个结点恰好有零个或两个子结点。假设所有的实例都是独立的,当一棵iTree完全长成时每个实例都被分离到一个外部结点,这种情况下外部结点的数量是 n 且内部结点的数量是 n-1,;一棵 iTree的结点总数是 2n-1;因此,内存需求是有界的,只随n线性增长。
异常检测的任务是提供一个异常程度的等级。因此,一个检测异常的方法是根据他们的路径长度或异常分数对数据点进行排序;异常点是指那些在列表中排名较高的点。本文定义路径长度和异常分数如下。
定义:路径长度(Path Length)一个点x 的h(x) 是指x从根节点开始遍历一棵树,直到遍历结束于一个外部节点为止的边的数量。
任意一个异常检测方法都需要异常分数。从h(x)得到这样一个分数的困难在于,iTree的最大可能高度是n阶增长的,而平均高度是log n阶增长的[7]。上述任何一项对h(x)的归一化要么没有界限,要么不能直接比较。
表1. iTree和二叉搜索树相当的结构和操作列表
由于iTree有和二叉搜索树(Binary Search Tree或BST)相同的结构(见表1),外部结点终止的平均h(x)估计值和BST中的失败查找相同。本文借鉴BST的分析方法来估计iTree的平均路径长度。给定一个有n个实例的数据集合,[9]的10.3.3节给出了如下的BST中失败查找的平均路径长度:
c(n) = 2H(n-1) – (2(n-1)/n), (1)
其中H(i)是调和数,可以通过 ln(i)+0.5772156649(欧拉常数)来估计。由于c(n)是给定n的h(x)的平均值,我们使用它来归一化h(x)。实例x的异常得分s定义为:
(2)
其中E(h(x))是从孤立树集合中得到的h(x)的平均值。在式(2)中:
●当E(h(x))趋向于c(n), s趋向于0.5;
●当E(h(x))趋向于0, s趋向于1;
●当E(h(x))趋向于n-1, s趋向于0。
s对h(x)是单调的。图2表明了E(h(x))和s之间的关系,以及以下条件:0 < h(x)≤n−1,0 < s≤1。使用异常分数s,我们可以做出以下评估:
●(a) 如果实例返回的s非常接近1,那么它们肯定是异常点,
●(b) 如果实例的s远远小于0.5,那么它们就可以被视为正常实例,并且
●(c) 如果所有样本返回的s≈0.5,那么整个样本实际上没有任何明显的异常。
图2. 期望路径长度E(h(x))和异常分数 s 的关系。c(n)是在式1中定义的平均路径长度。如果期望路径长度E(h(x))和平均路径长度c(n)相同,那么无论n的值为多少,s=0.5。
图3. 64点高斯分布的iForest异常分数轮廓。图中给出了s = 0.5、0.6、0.7的等高线。s≥0.6可识别为潜在异常点。
3 孤立森林的特征
本节描述iTrees的特征和它们解决swamping和masking影响的独特方式。作为一个使用孤立树的树的集合,iForest a)将有较短的路径长度的点识别为异常,且b)有多个作为“专家”的树来针对不同的异常。由于iForest不需要分离所有的正常实例——训练样本的大部分,iForest能够在不隔离所有正常点的情况下很好地处理部分模型,并使用小样本大小构建模型。
与现有的更需要大样本量的方法相反,隔离的方法在采样大小保持小的时候表现更好。大的采样大小降低了iForest隔离异常的能力,由于正常实例会干扰分离过程,因此会降低其清晰地分离异常的能力。因此,子采样为iForest的工作提供了良好的环境。在本文中,子采样通过无放回随机抽样实现。
在异常检测中,swamping和masking问题已经被广泛研究[8]。swamping指错误地将正常实例识别为异常点。当正常实例离异常点太近时,分离异常点需要的划分次数增加——这使得从正常实例中区别异常点变得更加困难。Masking是太多的异常点掩盖了自身的存在。当一个异常簇大且密集时,同样会增加隔离每个异常的划分次数。在这些情况下,使用这些树进行评估会有更长的路径长度,使得异常更难被检测出来。请注意,对于异常检测而言,swamping和masking都是数据过多的结果。孤立树独特的特点使iForest可以通过子采样构建一个部分模型从而顺便减轻了swamping和masking的影响。这是由于:1)子采样控制数据大小,这有利于iForest更好地分离异常样本且2)每个孤立树都可以特殊化,因为每个子样本都包含不同的异常集,甚至没有异常。
为了说明这一点,图4(a)展示了一个由Mulcross生成的数据集合。这个数据集有两个异常簇靠近另一个位于中间的大的由正常点组成的簇。在异常簇的周围有干扰的正常点,且在这个有4096个实例的例子中异常簇比正常点更密集。图4(b)展示了原始数据的一个个实例的子样本。异常簇在子样本中能够更清楚地被识别。那些围绕在两个异常簇周围的正常实例已经被清除,且异常簇变得更小,这使得它们更容易被识别。当使用整个样本时,iForest得到的AUC为0.67。当使用大小为128的子采样时,iForest达到0.91的AUC。实验结果表明,iForest通过显著减少的子样本,在处理淹没和掩盖效应方面具有优越的异常检测能力。
图4. 使用生成的数据来演示swamping和masking的影响,(a)为Mulcross生成的原始数据。(b)显示原始数据的子样本。圆表示正常实例,三角形表示异常点。
4 使用iForest进行异常检测
使用iForest的异常检测是一个两个阶段的处理过程。第一个(训练)阶段使用训练集的子采样构建孤立森林。第二个(测试)阶段将测试实例遍历孤立森林来得到每个实例的异常分数。
4.1 训练阶段
在训练阶段,通过递归划分给定的训练集直到实例被分离或达到一个特定的树高来构建iTrees,结果是生成了一个部分模型。注意树高限制l是根据子采样大小ψ自动设置的:l=ceiling(log2ψ),这大概是树的平均高度[7]。将树生长到平均树高的基本原理是,我们只对比平均路径长度短的数据点感兴趣,因为这些点更有可能是异常。训练阶段的详细内容可以在算法1和算法2中找到。
在孤立森林算法中有两个输入参数。它们是子采样大小ψ和树的数量t。本文提供以下的引导来选择这两个参数的一个合适的值。
子采样大小ψ控制训练数据的大小。本文发现当ψ增长到一个合适的值时,iForest检测结果可靠而且没有必要再增加ψ,因为这增加了处理时间和内存大小却没有在检测性能上获得任何提升。经验上(Empirically),本文发现设置ψ为28或256通常能够提供足够多的细节在大范围数据中实施异常检测。除非特别指出,本文实验设置ψ=256为默认值。子采样大小的分析见5.2节,结果表明,在该默认设置下,检测性能接近最优,并且对很大范围的ψ不敏感。
树的数量t控制集成大小。本文发现路径长度通常在t=100前收敛。除非特别之处,本文将使用t=100作为实验的默认值。
在训练阶段的末尾,返回一个树的集成并准备进入评估阶段。训练一个孤立森林的复杂度是O(tψlogψ)。
4.2 评估阶段
在评估阶段,对每个测试实例通过期望路径长度E(h(x))得到一个异常分数s。E(h(x))通过将实例传递到iForest中的每棵孤立树得到。使用 PathLength函数,单个路径长度h(x)是通过统计实例x遍历树时从根节点到终止节点的边数e得到的。当x在一个外部结点终止且Size>1时,返回值是e加一个调整值c(Size)。该调整考虑了超出树的高度限制未构建的子树。当得到集成中每棵树的h(x)后,通过计算式2中s(x, ψ)得到一个异常分数。评估阶段的复杂度是O(nt logψ),其中n是测试数据大小。算法3详细介绍PathLength函数。为了找到最异常的m个点,只需使用s按降序对数据进行排序。前m个实例就是最异常的m个点。
这篇关于孤立森林 Isolation Forest 论文翻译(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!