参考:https://blog.csdn.net/extremebingo/article/details/80108247

背景

现有的异常检测方法: 通过对正常样本的描述,给出一个正常样本在特征空间中的区域,对于不在这个区域中的样本,视为异常。这些方法的主要缺点是,异常检测器只会对正常样本的描述做优化,而不会对异常样本的描述做优化,这样就有可能造成大量的误报,或者只检测到少量的异常。

异常的两个特点:异常数据只占很少量、异常数据特征值和正常数据差别很大。

孤立森林,不再是描述正常的样本点,而是要孤立异常点,由周志华教授等人于2008年在第八届IEEE数据挖掘国际会议上提出。

先了解一下该算法的动机。目前学术界对异常(anomaly detection)的定义有很多种,在孤立森林(iForest)中,异常被定义为“容易被孤立的离群点 (more likely to be separated)”,可以将其理解为分布稀疏且离密度高的群体较远的点。 在特征空间里,分布稀疏的区域表示事件发生在该区域的概率很低,因而可以认为落在这些区域里的数据是异常的。孤立森林是一种适用于连续数据(Continuous numerical data)的无监督异常检测方法,即不需要有标记的样本来训练,但特征需要是连续的。对于如何查找哪些点容易被孤立(isolated),iForest使用了一套非常高效的策略。在孤立森林中,递归地随机分割数据集,直到所有的样本点都是孤立的。在这种随机分割的策略下,异常点通常具有较短的路径。

直观上来讲,那些密度很高的簇是需要被切很多次才能被孤立,但是那些密度很低的点很容易就可以被孤立。这里参考下面的图进行说明。

在图(a)和图(b)中,可以看到,正常点xixi需要更多次的分割才能被孤立,而异常点xoxo需要较少的分割次数就能被孤立。这里的分割方式采用的是,随机选择一个特征以及拆分的值(这个值位于该特征的最小值和最大值之间)。图(c)展示了异常点的平均路径长度小于正常点的路径长度。

isolation tree (iTree)
定义:假设TT是孤立树的一个节点,它要么是没有子节点的叶子节点,要么是只有两个子节点(Tl,Tr)(Tl,Tr)的内部节点。每一步分割,都包含特征qq和分割值pp,将q<pq<p的数据分到TlTl,将q≥pq≥p的数据分到TrTr。

给定nn个样本数据X={x1,⋯,xn}X={x1,⋯,xn},特征的维度为dd。为了构建一棵孤立树,需要随机选择一个特征qq及其分割值pp,递归地分割数据集XX,直到满足以下任意一个条件:(1)树达到了限制的高度;(2)节点上只有一个样本;(3)节点上的样本所有特征都相同。

异常检测的任务是给出一个反应异常程度的排序,常用的排序方法是根据样本点的路径长度或异常得分来排序,异常点就是排在最前面的那些点。

孤立树的特点
孤立森林作为孤立树的总体,将具有较短路径长度的点识别为异常点,不同的树扮演不同异常识别的专家。

已经存在的那些异常检测的方法大部分都期望有更多的数据,但是在孤立森林中,小数据集往往能取得更好的效果。样本数较多会降低孤立森林孤立异常点的能力,因为正常样本会干扰隔离的过程,降低隔离异常的能力。子采样就是在这种情况下被提出的。

swamping和masking是异常检测中比较关键的问题。swamping指的是错误地将正常样本预测为异常。当正常样本很靠近异常样本时,隔离异常时需要的拆分次数会增加,使得从正常样本中区分出异常样本更加困难。masking指的是存在大量异常点隐藏了他们的本来面目。当异常簇比较大,并且比较密集时,同样需要更多的拆分才能将他们隔离出来。上面的这两种情况使得孤立异常点变得更加困难。

造成上面两种情况的原因都与数据量太大有关。孤立树的独有特点使得孤立森林能够通过子采样建立局部模型,减小swamping和masking对模型效果的影响。其中的原因是:子采样可以控制每棵孤立树的数据量;每棵孤立树专门用来识别特定的子样本。

下面两张图说明了上述的现象。

iForest用于异常检测
基于iForest的异常检测包括两个步骤:训练阶段,基于训练集的子样本来建立孤立树;测试阶段,用孤立树为每一个测试样本计算异常分数。

训练阶段
在训练阶段,iTree的建立是通过对训练集的递归分隔来建立的,直到所有的样本被孤立,或者树达到了指定的高度。树的高度限制ll与子样本数量ψψ的关系为l=ceiling(log2(ψ))l=ceiling(log2⁡(ψ)),它近似等于树的平均高度。树只生长到平均高度,而不继续生长的原因是,我们只关心路径长度较小的那些点,它们更有可能是异常点,而并不关系路径很长的正常点。详细的训练过程如算法1和算法2所示。

子样本大小ψψ和树的数量tt的经验值:ψ=256ψ=256,t=100t=100。

评估阶段

在评估阶段,每一个测试样本的异常分数由期望路径长度E(h(x))E(h(x))得到,E(h(x))E(h(x))是将样本通过孤立森林中的每一棵树得到的。具体过程见算法3。

机器学习 - 异常检测算法之孤立森林(Isolation Forest)相关推荐

  1. 异常检测概念、异常检测的思路、孤立森林Isolation Forest、​​​​​​​局部异常因子LOF、OneClassSVM、EllipticEnvelop

    异常检测概念.异常检测的思路.孤立森林Isolation Forest.局部异常因子LOF.OneClassSVM.EllipticEnvelop 目录

  2. Python实现孤立森林 (Isolation Forest)

    文章目录 引入 代码 改进代码 引入   代码说明:   1)输入:给定数据集:   2)属性:tree,根据孤立森林建立的二叉树:   3)用法示例: # >>> np.rando ...

  3. 孤立森林算法 python_孤立森林(isolation forest)

    1.简介 孤立森林(Isolation Forest)是另外一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择. 在建树过程中 ...

  4. 库存监控 - 异常检测算法

    目录 背景 第一部分 - 数据整理 1. 数据录入 2. 清洗数据 3. 数据调整.聚合 第二部分 - 探索库存数据(EDA) 1. 了解库存整体情况 2. 可视化 第三部分 - 建立模型 1. 数据 ...

  5. 孤立森林(isolation):一个最频繁使用的异常检测算法

    孤立森林(isolation Forest)算法,2008年由刘飞.周志华等提出,算法不借助类似距离.密度等指标去描述样本与其他样本的差异,而是直接去刻画所谓的疏离程度(isolation),因此该算 ...

  6. 孤立森林异常检测算法原理和实战(附代码)

    孤立森林(isolation Forest)算法,2008年由刘飞.周志华等提出,算法不借助类似距离.密度等指标去描述样本与其他样本的差异,而是直接去刻画所谓的疏离程度(isolation),因此该算 ...

  7. (一)异常检测算法:Isolation Forest原理及其python代码应用

    异常检测 (anomaly detection),又被称为"离群点检测" (outlier detection),是机器学习研究领域中跟现实紧密联系.有广泛应用需求的一类问题.但是 ...

  8. 异常检测算法分类及经典模型概览

    最近工作涉及有关异常检测的内容,而且前几天在公司做了一次有关异常检测算法和应用场景的分享,在此总结记录一下. 什么是异常检测? 异常检测(Anomaly Detection 或 Outlier Det ...

  9. python 异常点检测 cook距离_异常检测算法汇总

    本文来自:https://github.com/Albertsr 第一部分:无监督异常检测 1. 算法 1.1 孤立森林(Isolation Forest) 算法论文: Isolation Fores ...

最新文章

  1. mysql 存储过程 递增_mysql 存储过程实例 (日期以小时递增 while loop循环嵌套 随机数生成)...
  2. 怎样使用计算机上的高级共享设置密码,win7系统电脑,如何设置共享,共享计算机的用户名和密码怎样设置...
  3. Javascript Throttle Debounce
  4. 添加javascript代码:_JavaScript(1)
  5. NAS新突破,仅需半个 GPU day 即可训练出高性能架构!阿里提出 Zen-NAS
  6. Linux命令:find
  7. 值得一看的50条从商之道
  8. 微信小程序——图片打马赛克
  9. 常用数据手册(Datasheet)下载网站
  10. Ubuntu 18.04双系统卸载教程,不借助第三方软件(UEFI)
  11. 听说这是互联网时代100本必读书单,你看过几本?
  12. BZOJ#4816. [Sdoi2017]数字表格
  13. 【总结】1298- 如何用油猴提升前端开发效率
  14. 赵鑫:强化学习在京东广告序列推荐中的应用
  15. 在大厂,我和同事搞对象
  16. 演化策略(Evolutionary Strategies)
  17. Java 最全面的面试题675道
  18. 某Q音乐最新歌曲查询API 可用!
  19. 【翻转直角三角形图案】
  20. Java中的过滤器doFilter里的chain.doFilter()函数理解

热门文章

  1. Drill在Ubuntu配置
  2. 王思聪喜提50台华为Mate RS保时捷设计手机!网友直呼:贫穷限制了我的想象力...
  3. 【C++ 泛型编程 入门篇】C++元模版中std::remove_reference_t和std::remove_cv_t的运用
  4. Typora+PicGo图床配置(超详步骤教学)
  5. 米成凤,未来首富可期?看一个少女是如何成长的
  6. linux麒麟编码方式,麒麟Linux系统vi文本编辑器介绍(24页)-原创力文档
  7. Java虚拟机学习整理笔记
  8. linux里的drwxr-xr-x代表的意思(777又代表什么意思)
  9. 打印空心菱形问题解析
  10. 中国卫星电话行业市场供需与战略研究报告