首页 > 其他分享 >异常检测:探索数据深层次背后的奥秘《下篇》

异常检测:探索数据深层次背后的奥秘《下篇》

时间:2023-09-25 11:07:06浏览次数:45  
标签:下篇 孤立 数据 深层次 算法 train 奥秘 test 异常

异常检测:探索数据深层次背后的奥秘《下篇》

异常检测——高维数据异常检测:孤立森林

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

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

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

1.Feature Bagging

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

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

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

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

​ (广度优先)

​ (累积求和)

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

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

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

2、Isolation Forests

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

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

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

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

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

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

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

路径长度计算方法:

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

  • 小结

1.feature bagging可以降低方差

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

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

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

  • 参考资料

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

[2]《Outlier Analysis》——Charu C. Aggarwal

3.数据集

  1. Outlier Detection DataSets (ODDS) :http://odds.cs.stonybrook.edu/#table1
  2. KDD99(网络入侵):http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html

4.工具

4.1 scikit-learn

ensemble.IsolationForestneighbors.LocalOutlierFactor 在此处考虑的数据集上表现良好。的svm.OneClassSVM被称为是对异常值敏感并因此对异常值检测不执行得非常好。话虽如此,在高维中进行离群检测,或者不对基础数据的分布进行任何假设都是非常具有挑战性的。svm.OneClassSVM仍然可以与离群值检测一起使用,但需要对其超参数nu进行微调 以处理离群值并防止过拟合。最后, covariance.EllipticEnvelope假设数据为高斯并学习一个椭圆。有关不同估计量的更多详细信息,请参阅“比较异常检测算法以对玩具数据集进行异常检测的示例” 及其以下部分。

4.2 PyOD

PyOD是一个全面且可扩展的Python工具箱,用于检测多元数据中的异常对象。这个令人兴奋而又充满挑战的领域通常称为 异常值检测异常检测

从传统的LOF(SIGMOD 2000)到最新的COPOD(ICDM 2020),PyOD包括30多种检测算法。自2017年以来,PyOD [ AZNL19 ]已成功用于众多学术研究和商业产品[ AGSW19ALCJ + 19AWDL + 19AZNHL19 ]。机器学习社区也通过各种专门的帖子/教程对它进行了广泛认可,包括 Analytics VidhyaTowards Data ScienceKDnuggetsComputer Vision Newsawesome-machine-learning.。

代码示例

以下内容来自PyOD官网介绍

  1. 导入模型

    from pyod.models.knn import KNN   # kNN detector
    
  2. 使用 pyod.utils.data.generate_data()生成数据

    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)
    
  3. fit and predict

# train kNN detector
clf_name = 'KNN'
clf = KNN()
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
  1. 使用ROC和Precision @ Rank n 评估预测

    from pyod.utils.data import evaluate_print
    # evaluate and print the results
    print("\nOn Training Data:")
    evaluate_print(clf_name, y_train, y_train_scores)
    print("\nOn Test Data:")
    evaluate_print(clf_name, y_test, y_test_scores)
    
  2. 观察训练集以及测试集的输出

    On Training Data:
    KNN ROC:1.0, precision @ rank n:1.0
    
    On Test Data:
    KNN ROC:0.9989, precision @ rank n:0.9
    
  3. 可视化

    visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
              y_test_pred, show_figure=True, save_figure=False)
    

详细代码请看官网说明:https://pyod.readthedocs.io/en/latest/pyod.html

更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

标签:下篇,孤立,数据,深层次,算法,train,奥秘,test,异常
From: https://blog.51cto.com/u_15485092/7593420

相关文章

  • 异常检测:探索数据深层次背后的奥秘《下篇》
    异常检测:探索数据深层次背后的奥秘《下篇》异常检测——高维数据异常检测:孤立森林在实际场景中,很多数据集都是多维度的。随着维度的增加,数据空间的大小(体积)会以指数级别增长,使数据变得稀疏,这便是维度诅咒的难题。维度诅咒不止给异常检测带来了挑战,对距离的计算,聚类都带来了难题......
  • 解密TCP连接断开:四次挥手的奥秘和数据传输的安全
    TCP连接断开在当今数字化时代,互联网已经成为了人们生活中不可或缺的一部分。而在互联网的基础之上,TCP协议扮演着关键的角色,它负责着数据在网络中的可靠传输。在TCP连接的建立过程中,我们已经了解了三次握手的过程和原理。然而,连接的建立只是TCP协议的一部分,同样重要的是连接的断......
  • 【Java 基础篇】Java 方法使用详解:让你轻松掌握方法的奥秘
    如果你正在学习Java编程,方法是一个不可或缺的重要概念。方法允许你将代码组织成可重用的块,提高了代码的可维护性和可读性。在本篇博客中,我们将深入探讨Java方法的使用,从基础概念开始,逐步介绍如何定义、调用、传递参数、返回值、异常处理以及方法的最佳实践。无论你是编程的新手还是......
  • 异常检测:探索数据深层次背后的奥秘《中篇》
    异常检测:探索数据深层次背后的奥秘《中篇》1.异常检测——线性相关方法  真实数据集中不同维度的数据通常具有高度的相关性,这是因为不同的属性往往是由相同的基础过程以密切相关的方式产生的。在古典统计学中,这被称为——回归建模,一种参数化的相关性分析。  一类相关性分析......
  • c语言之操作符下篇
    前言......
  • Java并发Map的面试指南:线程安全数据结构的奥秘
    简介在计算机软件开发的世界里,多线程编程是一个重要且令人兴奋的领域。然而,与其引人入胜的潜力相伴而来的是复杂性和挑战,其中之一就是处理共享数据。当多个线程同时访问和修改共享数据时,很容易出现各种问题,如竞态条件和数据不一致性。本文将探讨如何在Java中有效地应对这些挑战,介......
  • Java并发Map的面试指南:线程安全数据结构的奥秘
    简介在计算机软件开发的世界里,多线程编程是一个重要且令人兴奋的领域。然而,与其引人入胜的潜力相伴而来的是复杂性和挑战,其中之一就是处理共享数据。当多个线程同时访问和修改共享数据时,很容易出现各种问题,如竞态条件和数据不一致性。本文将探讨如何在Java中有效地应对这些挑战,......
  • 高级系统架构师学习(五)软件架构设计-下篇
    一、大型网站系统架构演化【高速发展阶段】第四阶段【使用服务集群改善网站并发处理能力】背景:用户的请求由谁来转发到具体的应用服务器?用户如果每次访问到的服务器不一样,那么如何维护session的一致性?负载均衡分类:基于特定软件的负均衡(HTTP重定向)【应用层】反向......
  • 探索操作系统:内核、启动和系统调用的奥秘
    前言首先,对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终无法理解。这些计算机基础文章将为你打通知识的任督二脉,祝你在编程领域中取得成功!操......
  • 探索语言的奥秘:我与英汉词性分布的碰撞
    在我的语言学之旅中,我一直对比较英语和汉语的词性分布特别感兴趣。最近,我有了一个深入探讨这一题目的机会。下面是我对这一话题的深度探讨和个人见解。第一章:词性分布的奇妙世界一天,我被一个看似简单但实则具有深度的问题吸引:“英语是不是比汉语更喜欢用名词?”这使我陷入了沉思......