异常检测介绍(5)

高维数据异常检测

引言

在实际场景中,很多数据集都是多维度的。随着维度的增加,数据空间的大小(体积)会以指数级别增长,使数据变得稀疏,这便是维度诅咒的难题。维度诅咒不止给异常检测带来了挑战,对距离的计算,聚类都带来了难题。例如基于邻近度的方法是在所有维度使用距离函数来定义局部性,但是,在高维空间中,所有点对的距离几乎都是相等的(距离集中),这使得一些基于距离的方法失效。在高维场景下,一个常用的方法是子空间方法。

集成是子空间思想中常用的方法之一,可以有效提高数据挖掘算法精度。集成方法将多个算法或多个基检测器的输出结合起来。其基本思想是一些算法在某些子集上表现很好,一些算法在其他子集上表现很好,然后集成起来使得输出更加鲁棒。集成方法与基于子空间方法有着天然的相似性,子空间与不同的点集相关,而集成方法使用基检测器来探索不同维度的子集,将这些基学习器集合起来。

下面来介绍两种常见的集成方法:

Feature Bagging

Feature Bagging,基本思想与bagging相似,只是对象是feature。feature bagging属于集成方法的一种。集成方法的设计有以下两个主要步骤:

1. 选择基检测器。这些基本检测器可以彼此完全不同,或不同的参数设置,或使用不同采样的子数据集。Feature Bagging常用LOF算法为基算法。下图是Feature Bagging的通用算法:

屏幕截图1

每种离群值检测算法都会输出不同的离群值得分向量 A S t AS_{t} ASt,以反映数据集 S S S中每个数据记录是离群值的可能性。

2. 分数标准化和组合方法:不同检测器可能会在不同的尺度上产生分数。例如,平均k近邻检测器会输出原始距离分数,而LOF算法会输出归一化值。另外,尽管一般情况是输出较大的异常值分数,但有些检测器会输出较小的异常值分数。因此,需要将来自各种检测器的分数转换成可以有意义的组合的归一化值。分数标准化之后,还要选择一个组合函数将不同基本检测器的得分进行组合,最常见的选择包括平均和最大化组合函数。

下图是两个feature bagging两个不同的组合分数方法:

屏幕截图1
方法一:广度优先

广度优先方法首先将所有异常检测向量 A S t AS_{t} ASt排序到排序向量 S A S t SAS_{t} SASt中,并返回给出得分向量的排序元素与排序向量的原始元素之间的对应关系的索引 I n d t Ind_{t} Indt。例如, I n d t ( 1 ) = k Ind_{t}(1)=k Indt(1)=k表示在第 t t t个异常检测得分向量 A S t AS_{t} ASt中,数据记录 x k x_{k} xk具有最高的异常得分 A S t ( k ) AS_{t}(k) ASt(k)。因此,在下图中, A S 1 , 1 AS_{1,1} AS1,1对应于被算法 1 1 1列为最可能为离群值的数据记录, A S 1 , 2 AS_{1,2} AS1,2对应于被算法 1 1 1列为第二可能离群值的数据记录,依此类推。

在将所有异常值得分向量排序为 A S t AS_{t} ASt之后,广度优先方法只需从所有异常值检测算法中获取异常值最高的数据记录(得分为 A S 1 , 1 AS_{1,1} AS1,1,得分为 A S 2 , 1 AS_{2,1} AS2,1,得分为 A S 3 , 1 AS_{3,1} AS3,1,…,得分为 A S t , 1 AS_{t,1} ASt,1),并将其索引插入向量 I n d F I N A L Ind_{FINAL} IndFINAL中,然后获取异常得分第二高的数据记录(下图中的得分为 A S 1 , 2 AS_{1,2} AS1,2 A S 2 , 2 AS_{2,2} AS2,2 A S 3 , 2 AS_{3,2} AS3,2、…… A S t , 2 AS_{t,2} ASt,2),并将其索引附加到向量 I n d F I N A L Ind_{FINAL} IndFINAL的末尾,依此类推。如果当前数据记录的索引已在向量 I n d F I N A L Ind_{FINAL} IndFINAL中,则不会再次追加该索引。

屏幕截图1
屏幕截图1
方法二:累积和

该组合方法首先通过对所有 T T T次迭代中的所有离群值向量 A S t AS_{t} ASt求和来创建最终离群值向量 A S F I N A L AS_{FINAL} ASFINAL,然后对向量 A S F I N A L AS_{FINAL} ASFINAL进行排序,最后将离群值最高的数据记录识别为离群值。

例如下图,数据记录 N C 1 NC_{1} NC1可以通过算法 1 1 1被排名为第一个离群值,通过算法 2 2 2被排名为第四个,…,通过算法 t t t被排名为第二个。在累积求和方法中,我们将与数据记录 N C 1 NC_{1} NC1(Normal (majority) Class)对应的所有得分相加,即得分 A S 1 , 1 AS_{1,1} AS1,1 A S 2 , 4 AS_{2,4} AS2,4,…和 A S t , 2 AS_{t,2} ASt,2,然后根据新计算的得分对所有数据记录 N C i ,   i = 1 , … , m NC_{i},\ i = 1,…,m NCi, i=1,,m进行排序。

屏幕截图1

重要的是要注意,此方法类似于在对排名进行汇总的元搜索引擎中的排名方法,但是它更加灵活,因为在排名方法中,可能无法在最终决策中检测到由单个算法检测到的异常值,尤其是在其他检测算法将其排名较低的情况下。

另一方面,在“累积和”方法中,由单个算法检测到的离群值可能具有非常大的离群值,并且在执行所有求和之后,仍可能具有足够大的最终离群值以被检测。

在离群值仅在少数维度上可见的情况下,这一事实非常重要,因为在那种情况下,仅在少量迭代中选择相关特征就足够了,为这些特征子集计算较高的离群值,从而导致这些异常
离群值在最终分数中排名较高。

基探测器的设计及其组合方法都取决于特定集成方法的特定目标。很多时候,我们无法得知数据的原始分布,只能通过部分数据去学习。除此以外,算法本身也可能存在一定问题使得其无法学习到数据完整的信息。这些问题造成的误差通常分为偏差和方差两种。

方差:是指算法输出结果与算法输出期望之间的误差,描述模型的离散程度,数据波动性。

偏差:是指预测值与真实值之间的差距。即使在离群点检测问题中没有可用的基本真值

Isolation Forests

孤立森林(Isolation Forest)算法是周志华教授等人于2008年提出的异常检测算法,是机器学习中少见的专门针对异常检测设计的算法之一,方法因为该算法时间效率高,能有效处理高维数据和海量数据,无须标注样本,在工业界应用广泛。

孤立森林属于非参数和无监督的算法,既不需要定义数学模型也不需要训练数据有标签。孤立森林查找孤立点的策略非常高效。假设我们用一个随机超平面来切割数据空间,切一次可以生成两个子空间。然后我们继续用随机超平面来切割每个子空间并循环,直到每个子空间只有一个数据点为止。直观上来讲,那些具有高密度的簇需要被切很多次才会将其分离,而那些低密度的点很快就被单独分配到一个子空间了。孤立森林认为这些很快被孤立的点就是异常点。

用四个样本做简单直观的理解, d d d是最早被孤立出来的,所以 d d d最有可能是异常。

在这里插入图片描述

怎么来切这个数据空间是孤立森林的核心思想。因为切割是随机的,为了结果的可靠性,要用集成(ensemble)的方法来得到一个收敛值,即反复从头开始切,平均每次切的结果。孤立森林由 t t t棵孤立的数组成,每棵树都是一个随机二叉树,也就是说对于树中的每个节点,要么有两个孩子节点,要么一个孩子节点都没有。树的构造方法和随机森林(random forests)中树的构造方法有些类似。流程如下:

  1. 从训练数据中随机选择一个样本子集,放入树的根节点;
  2. 随机指定一个属性,随机产生一个切割点 V V V,即属性 A A A的最大值和最小值之间的某个数;
  3. 根据属性 A A A对每个样本分类,把 A A A小于 V V V的样本放在当前节点的左孩子中,大于等于 V V V的样本放在右孩子中,这样就形成了 2 2 2个子空间;
  4. 在孩子节点中递归步骤 2 2 2 3 3 3,不断地构造左孩子和右孩子,直到孩子节点中只有一个数据,或树的高度达到了限定高度。

获得 t t t棵树之后,孤立森林的训练就结束,就可以用生成的孤立森林来评估测试数据。

孤立森林检测异常的假设是:异常点一般都是非常稀有的,在树中会很快被划分到叶子节点,因此可以用叶子节点到根节点的路径长度来判断一条记录是否是异常的。和随机森林类似,孤立森林也是采用构造好的所有树的平均结果形成最终结果的。在训练时,每棵树的训练样本是随机抽样的。从孤立森林的树的构造过程看,它不需要知道样本的标签,而是通过阈值来判断样本是否异常。因为异常点的路径比较短,正常点的路径比较长,孤立森林根据路径长度来估计每个样本点的异常程度。

路径长度计算方法:

屏幕截图1

孤立森林也是一种基于子空间的方法,不同的分支对应于数据的不同局部子空间区域,较小的路径对应于孤立子空间的低维。

总结

  1. feature bagging可以降低方差

  2. 孤立森林的优势在于:

  • 计算成本相比基于距离或基于密度的算法更小。
  • 具有线性的时间复杂度。
  • 在处理大数据集上有优势。

孤立森林不适用于超高维数据,因为孤立森林每次都是随机选取维度,如果维度过高,则会存在过多噪音。

怎样理解 B a g g i n g Bagging Bagging能够减少训练方差, B o o s t i n g Boosting Boosting能够减少偏差?

B a g g i n g Bagging Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的 b i a s bias bias v a r i a n c e variance variance。由于 E ( ∑ X i n ) = E ( X i ) E\left (\frac{\sum X_{i}}{n} \right )=E\left ( X_{i} \right ) E(nXi)=E(Xi),所以 b a g g i n g bagging bagging后的 b i a s bias bias和单个子模型的接近,一般来说不能显著降低 b i a s bias bias。另一方面,若各子模型独立,则有 V a r ( ∑ X i n ) = V a r ( X i ) n Var\left (\frac{\sum X_{i}}{n} \right )=\frac{Var\left ( X_{i} \right )}{n} Var(nXi)=nVar(Xi),此时可以显著降低 v a r i a n c e variance variance。若各子模型完全相同,则 V a r ( ∑ X i n ) = V a r ( X i ) Var\left (\frac{\sum X_{i}}{n} \right )=Var\left ( X_{i} \right ) Var(nXi)=Var(Xi),此时不会降低 v a r i a n c e variance variance

B a g g i n g Bagging Bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低 v a r i a n c e variance variance

B o o s t i n g Boosting Boosting从优化角度来看,是用 f o r w a r d − s t a g e w i s e forward-stagewise forwardstagewise这种贪心法去最小化损失函数,由于采取的是串行优化的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低 v a r i a n c e variance variance。所以说 b o o s t i n g boosting boosting主要还是靠降低 b i a s bias bias来提升预测精度。

练习

  1. 使用PyOD库生成toy example并调用feature bagging
from pyod.models.feature_bagging import FeatureBagging
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize
from pyod.utils.data import evaluate_print

 
contamination = 0.1  # percentage of outliers
n_train = 200  # number of training points
n_test = 100  # number of testing points

X_train, y_train, X_test, y_test = generate_data(
    n_train=n_train, n_test=n_test, contamination=contamination)
 
clf_name = 'FeatureBagging'
clf = FeatureBagging()
clf.fit(X_train)

# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_  # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_  # raw outlier scores
 
# get the prediction on the test data
y_test_pred = clf.predict(X_test)  # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test)  # outlier scores

# evaluate and print the results
print("\nFeatureBagging On Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nFeatureBagging On Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
FeatureBagging On Training Data:
FeatureBagging ROC:0.9258, precision @ rank n:0.8

FeatureBagging On Test Data:
FeatureBagging ROC:0.8944, precision @ rank n:0.8

在这里插入图片描述

  1. 使用PyOD库生成toy example并调用Isolation Forests
# train Isolation Forests detector
clf_name = 'IsolationForest'
from pyod.models.iforest import IForest
 
clf = IForest()
 
clf.fit(X_train)
 
# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_  # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_  # raw outlier scores
 
# get the prediction on the test data
y_test_pred = clf.predict(X_test)  # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test)  # outlier scores
 
# evaluate and print the results
print("\nIsolationForest On Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nIsolationForest On Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
IsolationForest On Training Data:
IsolationForest ROC:0.9225, precision @ rank n:0.75

IsolationForest On Test Data:
IsolationForest ROC:0.8989, precision @ rank n:0.8
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
              y_test_pred, show_figure=True, save_figure=True)

在这里插入图片描述

参考文献

[1] Goldstein, M. and Dengel, A., 2012. Histogram-based outlier score(hbos):A fast unsupervised anomaly detection algorithm . InKI-2012: Poster and Demo Track, pp.59-63.

[2] https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf

[3]《Outlier Analysis》——Charu C. Aggarwa

[4] Lazarevic A, Kumar V. Feature bagging for outlier detection[C]//Proceedings of the eleventh ACM SIGKDD international
conference on Knowledge discovery in data mining. 2005: 157-166.

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值