之后会持续更新算法剖析系列,力图用最生动的例子演示每一个算法的原理,不稀里糊涂做一个调包侠。欢迎持续关注,指正不足。


孤立森林(Isolation Forest)算法是西瓜书作者周志华老师的团队研究开发的算法,一般用于结构化数据的异常检测。

异常的定义

针对于不同类型的异常,要用不同的算法来进行检测,而孤立森林算法主要针对的是连续型结构化数据中的异常点。

使用孤立森林的前提是,将异常点定义为那些 “容易被孤立的离群点” —— 可以理解为分布稀疏,且距离高密度群体较远的点。从统计学来看,在数据空间里,若一个区域内只有分布稀疏的点,表示数据点落在此区域的概率很低,因此可以认为这些区域的点是异常的。

也就是说,孤立森林算法的理论基础有两点:

  • 异常数据占总样本量的比例很小;
  • 异常点的特征值与正常点的差异很大。

上图中,中心的白色空心点为正常点,即处于高密度群体中。四周的黑色实心点为异常点,散落在高密度区域以外的空间。

使用场景

孤立森林算法是基于 Ensemble 的异常检测方法,因此具有线性的时间复杂度。且精准度较高,在处理大数据时速度快,所以目前在工业界的应用范围比较广。常见的场景包括:网络安全中的攻击检测、金融交易欺诈检测、疾病侦测、噪声数据过滤(数据清洗)等。

与其他异常检测算法的差异

孤立森林中的 “孤立” (isolation) 指的是 “把异常点从所有样本中孤立出来”,论文中的原文是 “separating an instance from the rest of the instances”.

大多数基于模型的异常检测算法会先 ”规定“ 正常点的范围或模式,如果某个点不符合这个模式,或者说不在正常范围内,那么模型会将其判定为异常点。

孤立森林的创新点包括以下四个:

  • Partial models:在训练过程中,每棵孤立树都是随机选取部分样本;
  • No distance or density measures:不同于 KMeans、DBSCAN 等算法,孤立森林不需要计算有关距离、密度的指标,可大幅度提升速度,减小系统开销;
  • Linear time complexity:因为基于 ensemble,所以有线性时间复杂度。通常树的数量越多,算法越稳定;
  • Handle extremely large data size:由于每棵树都是独立生成的,因此可部署在大规模分布式系统上来加速运算。

算法思想

想象这样一个场景,我们用一个随机超平面对一个数据空间进行切割,切一次可以生成两个子空间(也可以想象用刀切蛋糕)。接下来,我们再继续随机选取超平面,来切割第一步得到的两个子空间,以此循环下去,直到每子空间里面只包含一个数据点为止。

直观上来看,我们可以发现,那些密度很高的簇要被切很多次才会停止切割,即每个点都单独存在于一个子空间内,但那些分布稀疏的点,大都很早就停到一个子空间内了。

训练-测试过程

  • 单棵树的训练
  1. 从训练数据中随机选择 Ψ 个点作为子样本,放入一棵孤立树的根节点;
  2. 随机指定一个维度,在当前节点数据范围内,随机产生一个切割点 p —— 切割点产生于当前节点数据中指定维度的最大值与最小值之间;
  3. 此切割点的选取生成了一个超平面,将当前节点数据空间切分为2个子空间:把当前所选维度下小于 p 的点放在当前节点的左分支,把大于等于 p 的点放在当前节点的右分支;
  4. 在节点的左分支和右分支节点递归步骤 2、3,不断构造新的叶子节点,直到叶子节点上只有一个数据(无法再继续切割) 或树已经生长到了所设定的高度 。(至于为什么要对树的高度做限制,后续会解释)

上图就是对子样本进行切割训练的过程,左图的 xi 处于密度较高的区域,因此切割了十几次才被分到了单独的子空间,而右图的 x0 落在边缘分布较稀疏的区域,只经历了四次切分就被 “孤立” 了。

  • 整合全部孤立树的结果

由于切割过程是完全随机的,所以需要用 ensemble 的方法来使结果收敛,即反复从头开始切,然后计算每次切分结果的平均值。

获得 t 个孤立树后,单棵树的训练就结束了。接下来就可以用生成的孤立树来评估测试数据了,即计算异常分数 s。 对于每个样本 x,需要对其综合计算每棵树的结果,通过下面的公式计算异常得分:

h(x) 为 x 在每棵树的高度,c(Ψ) 为给定样本数 Ψ 时路径长度的平均值,用来对样本 x 的路径长度 h(x) 进行标准化处理。

上图为孤立树的数目与每个样本点的平均高度的关系,可以看到数目选取在 10 以内时,结果非常不稳定,当数目达到 100 后就趋于收敛了。因此我们在使用过程中,树的棵树设置为 100 即可,如果棵树过少结果可能不稳定,若过多则白白浪费了系统开销。

  • 异常得分

如果异常得分接近 1,那么一定是异常点;

如果异常得分远小于 0.5,那么一定不是异常点;

如果异常得分所有点的得分都在 0.5 左右,那么样本中很可能不存在异常点。

算法伪代码

第一段伪代码为孤立树的创建。

树的高度限制 l 与子样本数量 ψ 有关。之所以对树的高度做限制,是因为我们只关心路径长度较短的点,它们更可能是异常点,而并不关心那些路径很长的正常点。

第二段伪代码为每棵孤立树的生长即训练过程。

第三段伪代码为每个样本点的高度整合计算。

其中 c(size) 是一个 adjustment 项,因为有一些样本点还没有被孤立出来,树就停止生长了,该项对其高度给出修正。

总结

孤立森林算法总共分两步:

  • 训练 iForest:从训练集中进行采样,构建孤立树,对森林中的每棵孤立树进行测试,记录路径长度;
  • 计算异常分数:根据异常分数计算公式,计算每个样本点的 anomaly score。

两个坑

在使用孤立森林进行实际异常检测的过程中,可能有两个坑:

  • 若训练样本中异常样本的比例较高,可能会导致最终结果不理想,因为这违背了该算法的理论基础;
  • 异常检测跟具体的应用场景紧密相关,因此算法检测出的 “异常” 不一定是实际场景中的真正异常,所以在特征选择时,要尽量过滤不相关的特征。

一个生动的例子

因为我比较喜欢武林外传,而且这部剧中每个人的特点都很鲜明,所以拿过来做例子。以下是 9 位主要角色的基本数据:

接下来,我们模拟一棵孤立树的训练过程,把这九个人作为一个子样本放入一棵孤立树的根节点:

首先随机选择到的维度是 “年龄”,然后随机选择一个切割点 18,小于 18 岁的只有莫小贝一个人,所以她最先被 “孤立” 出来了;第二个随机选择的特征是 ”体重“,只有大嘴高于 80 公斤,所以也被 ”孤立“ 了;第三个选择 ”文化程度“ 这个特征,由于只有秀才的文化程度为高,于是被 ”孤立“ 出来了 ……

假设我们设定树的高度为 3,那么这棵树的训练就结束了。在这棵树上,莫小贝的路径长度为 1,大嘴为 2,秀才为 3,单看这一棵树,莫小贝的异常程度最高。但很显然,她之所以最先被孤立出来,与特征被随机选择到的顺序有关,所以我们通过对多棵树进行训练,来去除这种随机性,让结果尽量收敛。

算法源码

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/iforest.py

官方文档

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/ensemble/iforest.py

原文链接:https://zhuanlan.zhihu.com/p/74508141

欢迎关注我的知乎专栏【数据池塘】,专注于分享机器学习、数据挖掘相关内容:https://zhuanlan.zhihu.com/datapool

⬇️ 扫描下方二维码关注公众号【数据池塘】 ⬇️

回复【算法】,获取最全面的机器学习算法网络图:

孤立森林(Isolation Forest)算法剖析相关推荐

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

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

  2. 机器学习 - 异常检测算法之孤立森林(Isolation Forest)

    参考:https://blog.csdn.net/extremebingo/article/details/80108247 背景 现有的异常检测方法: 通过对正常样本的描述,给出一个正常样本在特征空 ...

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

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

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

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

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

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

  6. Isolation Forest算法原理详解

    本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...

  7. 运用孤立森林异常检测算法,过滤异常数据

    向AI转型的程序员都关注了这个号

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

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

  9. 【机器学习】孤立森林-一个通过瞎胡乱分进行异常检测的算法

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

  10. 孤立森林算法 python_异常检测怎么做,试试孤立随机森林算法(附代码)

    选自blog.paperspace 作者:Dhiraj K 机器之心编译 参与:李诗萌.一鸣 异常检测看似是机器学习中一个有些难度的问题,但采用合适的算法也可以很好解决.本文介绍了孤立森林(isola ...

最新文章

  1. php spl的优势,PHP SPL核心库相对以前有什么好处嘛?
  2. 实训项目1-熟练使用VMware安装Windows server 2012
  3. 使用windows 7加入windows server 2008的域!
  4. 1592E - Скучающий Бакри
  5. ubuntu设置PATH
  6. python视频-python剪切视频与合并视频的实现
  7. js动态填充select
  8. hsqldb的存储方式
  9. 计算机声音如何处理器,我电脑运行的声音很大,而且CPU的温度总在70到80之间,怎么办啊?...
  10. 时钟和数据恢复(CDR)电路原理——基于PLL
  11. win7、10系统怎么设置打印机共享(打印机USB接口共享)
  12. linux主机名hostname老是被更改为broad原理分析和恢复
  13. selenium借助pywinauto工具上传附件
  14. 2022年十大科技应用趋势
  15. 编程入门:零基础想要学好C/C++编程?那你一定要看看这五个步骤!
  16. 怎么用计算机美元和人民币怎么换算,美金换算人民币计算器(人民币和美元换算)...
  17. 中标麒麟5.0安装(内含安装包)-小白手把手史上最全教程!
  18. 《程序员修炼之道》给所有毕业生的18条建言
  19. 重新整理秋招准备的思路-9.20
  20. python定义复数数组_python数组

热门文章

  1. mysql 主从复制 表结构_MySQL主从复制-双主结构
  2. 河南省2020年计算机高考真题,2020年最新版对口高考试卷(计算机).docx
  3. 硬盘安装Linux救援系统,通过急救系统里往硬盘里安装 alpine linux
  4. mysql 日志文件_Mysql 日志文件类型
  5. imei模拟修改_悟空分身 — 支持位置模拟设备修改
  6. jsonobject修改key的值_JSONObject(org.json)的一点修改
  7. 文字识别_文字识别的应用
  8. 模糊pid控制的温度系统matlab源代码_模糊PID控制系统(二)对比分析
  9. 使用jsoncpp解析生成json
  10. Centos开放查看端口 防火墙关闭打开