paper 地址 https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/tkdd11.pdf
孤立森林,isolation forest,简称 iforest;
它由 周志华 老师提出,本质是一种 无监督算法,其主要用于异常点检测,在工业界有广泛应用;
基本思想
异常点总是稀疏的,而且异常点总是离密集点较远;
在整个数据空间中,随机拿一个超平面进行切割,把数据集一分为二,然后继续随机切割子空间,迭代下去,直到每个子空间内只有一个样本;
直观上讲,密集区域要被切割很多次才能分开到不同空间,而稀疏点很容易很早停在一个子空间;
看这样一张图,红色框内是密集点,外面黑色的点为异常点
随机切分,一定是异常点更容易被分到一个子空间;
孤立森林的目标就是找到 那条 红色的边框,就是我们的“决策边界” ;
具体步骤
孤立森林需要建立多棵 二叉树,以实现 集成学习 Ensemble 的思想;
至于怎么分裂数据集,是 iForest 的核心思想,本文只介绍基本方法;
训练阶段
白话文
1. 随机选取 部分数据样本 放到 二叉树的根节点
2. 随机选择一个特征(attribute),获取节点中样本在该 维度 上的 取值空间(min max),在 取值空间 内 随机选择一个值,把 数据集 一分为二,放到两个子节点
// 注意这步要记录下 分裂的 维度 和分裂值
3. 如果 某个 子节点 只有一个样本,或者 规定数目的样本,或者 树到达 规定 深度,则停止分裂
4. 重复 2、3 步,完成一棵二叉树
5. 重复上述步骤,完成多棵二叉树
论文参数设置
subsample:256
tree height:8
number of tree:100
测试阶段
把样本喂给每棵树模型,获取 样本 在 该棵树上的深度,最终 统计 所有树的平均深度,深度越浅,越有可能是异常点,可设定阈值,小于阈值即为异常点;
注意几点:
1. 如果 样本 落在的节点中有多个样本,则可以使用一个公式来修正它的 深度,公式见 paper
2. 论文对 树的高度做了 归一化,获取深度的相对值
类似这样
可以看到,d 更早的停在了子空间,说明 d 很可能是异常值
总结
应用
常用于 网络安全中的攻击检测、金融交易欺诈检测、疾病侦测、噪声数据过滤等
优势
iForest 是一种基于 Ensemble 的快速异常检测算法,具有线性时间复杂度和高精准度,是符合大数据处理要求的 state-of-the-art 算法;
1. 自适应提高鲁棒性
传统的基于距离或者密度的异常检测,其阈值都是全局阈值,在 异常不是很明显时,这种做法容易出错,孤立森林在每次分裂时都根据当前样本集的最大和最小值选择分裂点,是一种自适应的策略
2. 与随机森林一样采取了双随机的策略,随机选择样本,随机选择特征,使得孤立森林能够很好地避免“过拟合”
// 不同于 rf 的是,rf 是有放回抽样,iforest 是无放回抽样
3. 树之间相互独立,可以部署在分布式系统上,加速运算,特别是测试阶段,非常高效
劣势
不适合维度特别高的数据,一是因为 随机选择 特征,很可能有更有用的信息没有被选到,二是可能有很多噪声维度,导致模型可靠性差
优化思路
每次随机选择一个分裂点,这样增加了模型的不确定性,或者说收敛变慢,我们可以这样想,二叉树的目的是把所有样本分到不同空间,那么两条路同时切分,肯定要比一条路切分速度更快,
所以我们可以采用某种策略,选择合适的分裂点,使得分裂后的两个样本集相对较平衡,我大概考虑了几个点:
a. 我们可以多选几个分裂点,比较分裂后的效果,选择一个更合适的
b. 把 dbscan 融合到分裂过程,把 密度相连 的样本 尽量分到 一个样本集
c. 参考资料1 链接了一些改进,自己可以看看
参考资料:
https://www.jianshu.com/p/5af3c66e0410 iForest (Isolation Forest)孤立森林 异常检测 入门篇
https://blog.csdn.net/qq_39521554/article/details/81329047 异常检测算法:孤立森林(Isolation Forest)
https://www.cnblogs.com/bonelee/p/7776711.html 异常检测概览——孤立森林 效果是最好的
https://www.zhihu.com/question/280696035 数据挖掘中常见的「异常检测」算法有哪些?
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html sklearn API