异常检测(5)—高维数据的异常检测

在高维数据中,数据集是多维的(这里的维度是特征),对于距离、聚类的计算都是一个难题,基于邻近度的计算方法是对每一个维度进行距离计算,但是点对的距离相对集中(( x m i , y i x_{m}^{i},y^{i} xmi,yi)在第m维上距离近),这使得基于距离的计算方法失效,对于高维数据的处理,采用子空间的方法,集成方法是子空间思想中常用的一种。

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

一点理解:在某些维度上某些异常检测方法表现良好,能够检测到在该维度上的异常;在其他维度上另外一些异常检测算法表现良好;将这两种在不同维度上的算法结合起来,使得结果表现更优

两种集成方法:Feature Bagging、Isolation Forests

1.Feature Bagging

Feature Bagging,基本思想与bagging相似,只是对象是feature。

  1. 选择基检测器。这些基本检测器可以彼此完全不同,或不同的参数设置,或使用不同采样的子数据集。Feature bagging常用lof算法为基算法。
    在这里插入图片描述

理解:

  • 给定数据集 S { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , x i ∈ X d S\{(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{m},y_{m})\},x_{i} \in \mathbf{X}^{\mathrm{d}} S{(x1,y1),(x2,y2),...,(xm,ym)},xiXd,标签 y i ∈ Y ∈ { C , N C } y_{i}\in Y\in\{C,NC\} yiY{C,NC} C C C对应异常类, N C NC NC对应正常类, d d d对应向量 X \mathbf{X} X的维度——特征数量;
  • 标准化数据集 S S S;
  • 循环(1~T:特征子集/基检测器个数——一个特征子集应用在一个基检测器上):随机的选择特征子集 N t N_{t} Nt,特征是从一半特征到所有特征中随机抽样;使用 N t N_{t} Nt个特征创建特征子集 F t F_{t} Ft;将异常检测算法 O t O_{t} Ot应用到特征子集 F t F_{t} Ft上;输出异常得分向量 A S t AS_{t} ASt
  • 结合异常得分向量 A S t AS_{t} ASt输出最终的异常分数 A S F I N A L AS_{FINAL} ASFINAL每一个数据样本得一个分数???
  1. 分数标准化和组合方法:不同的基检测器的输出不同,如:平均k近邻检测器会输出原始距离分数,而LOF算法会输出归一化值。因此,需要将来自各种检测器的分数转换成可以有意义的组合的归一化值。分数标准化之后,还要选择一个组合函数将不同基本检测器的得分进行组合,最常见的选择包括平均和最大化组合函数。
    两种组合方式:广度优先、累计求和
    广度优先:
    在这里插入图片描述

理解:

  • 给定异常得分向量 A S t AS_{t} ASt m m m是数据集 S S S和每个 A S t AS_{t} ASt的样本数量;
  • A S t AS_{t} ASt进行排序为 S A S t SAS_{t} SASt,返回排序后向量的索引 I n d t Ind_{t} Indt。如: S A S t ( 1 ) SAS_{t}(1) SASt(1)表示拥有最高的 A S t AS_{t} ASt异常检测得分, I n d t ( 1 ) Ind_{t}(1) Indt(1)是在数据集 S S S的索引——即: S A S t ( 1 ) SAS_{t}(1) SASt(1)的索引。
  • 设置 A S F I N A L AS_{FINAL} ASFINAL I n d F I N A L Ind_{FINAL} IndFINAL为空;
  • 循环遍历数据集:循环每一个特征子集:如果 I n d t ( i ) Ind_{t}(i) Indt(i)和异常检测得分 A S t ( i ) AS_{t}(i) ASt(i)不在 I n d F I N A L Ind_{FINAL} IndFINAL A S F I N A L AS_{FINAL} ASFINAL中;那么,将 I n d t ( i ) Ind_{t}(i) Indt(i)插入到 I n d F I N A L Ind_{FINAL} IndFINAL中,将异常检测得分 A S t ( i ) AS_{t}(i) ASt(i)插入到 A S F I N A L AS_{FINAL} ASFINAL中;
  • 返回 I n d F I N A L Ind_{FINAL} IndFINAL A S F I N A L AS_{FINAL} ASFINAL
    累计求和:
    在这里插入图片描述

理解:

  • 已知 A S t , t = 1 , . . . , T AS_{t},t=1,...,T ASt,t=1,...,T,和 A S t AS_{t} ASt的大小 m m m
  • 对T次迭代求和
  • 遍历数据集:对每个特征子集加和
  • 得到 A S F I N A L ( i ) AS_{FINAL}(i) ASFINAL(i):所求的第 i i i个样本的特征子集的异常检测得分的和

基检测器的设计及其组合方法都取决于特定集成方法的特定目标。很多时候,我们无法得知数据的原始分布,只能通过部分数据去学习。除此以外,算法本身也可能存在一定问题使得其无法学习到数据完整的信息。这些问题造成的误差通常分为偏差和方差两种。
方差:是指算法输出结果与算法输出期望之间的误差,描述模型的离散程度,数据波动性。
偏差:是指预测值与真实值之间的差距。即使在离群点检测问题中没有可用的基本真值

2.Isolation Forests

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

假设我们用一个随机超平面来切割数据空间,切一次可以生成两个子空间。然
后我们继续用随机超平面来切割每个子空间并循环,直到每个子空间只有一个数据点为止。直观上来讲,那些具有高密度的簇需要被切很多次才会将其分离,而那些低密度的点很快就被单独分配到一个子空间了。孤立森林认为这些很快被孤立的点就是异常点。
用四个样本做简单直观的理解,d是最早被孤立出来的,所以d最有可能是异常。
在这里插入图片描述
孤立森林构造过程

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

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

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

3.总结

  1. feature bagging可以降低方差
  2. 孤立森林的优势在于:
  • 计算成本相比基于距离或基于密度的算法更小。
  • 具有线性的时间复杂度。
  • 在处理大数据集上有优势。
  1. 孤立森林不适用于超高维数据,因为孤立森林每次都是随机选取维度,如果维度过高,则会存在过多噪音。

4.练习

使用Pyod库生成toy example并调用feature bagging

from pyod.models.feature_bagging import FeatureBagging
from pyod.utils.data import generate_data,evaluate_print
from pyod.utils.example import visualize
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.9681, precision @ rank n:0.9

#FeatureBagging On Test Data:
#FeatureBagging ROC:0.9989, precision @ rank n:0.9

在这里插入图片描述
使用Pyod库生成toy example并调用Isolation Forests

from pyod.models.iforest import IForest
from pyod.utils.data import generate_data,evaluate_print
from pyod.utils.example import visualize
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 = '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("\nIForest On Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nIForest On Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)

#IForest On Training Data:
#IForest ROC:0.9897, precision @ rank n:0.95
#IForest On Test Data:
#IForest ROC:1.0, precision @ rank n:1.0
#可视化所有示例
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
          y_test_pred, show_figure=True, save_figure=False)

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrs.King_UP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值