20200920 -
0. 引言
在之前的时候,进行一些任务分类的时候,使用过孤立森林来实现一些代码,但是也没有具体来深究原理,只知道这个跟随机森林有些像,都是决策树的一种集成方式,最近正好看到了这部分内容,就正好记录一下,本部分内容主要是有文章[1]中阅读后记录。
1. 孤立森林的理论背景
1.1 孤立森林是什么
- 孤立森林可以用于异常点检测
- 孤立森林是一种无监督学习方法
- 孤立森林是一种集成学习方法
1.2 孤立森林所使用的假设
- 异常点在整个实例中的数量上占比比较小
- 他们的某些属性与正常点有差别
以上的说法,透露出来的一个意思就是,异常是少量的,同时也是带有不同属性的。
思考:那么这个比例,是不是可以通过参数进行控制,这个控制的过程是什么样子?但是这个比例是自己设置嘛?还是怎么样?还有,如果我的数据集中没有异常呢,他也会强行把这个东西给列举出来吗?
1.3 孤立森林的简单描述
孤立森林是很多个二叉树的集成算法,而异常点相对于正常点来说,他们的点在树上的路径会更短,或者说是最短的。
那么整体的算法就是这个样子:构造一个树,然后通过集成算法构造一个森林,然后度量每个点在每个树中距离,最后决定这个点是不是异常。
2. 代码设计
前文中已经说明了,孤立森林主要是三个部分:
1)构造一个隔离树
2)利用集成算法构造一个森林
3)度量每个点在每个树上的距离,最后得出一个类似异常分数的数值,最后分析出来是不是异常点
那么具体代码我就不粘贴了,直接去原文看就好了,下面简单说一下一些细节。
2.1. 构造隔离树
构造过程中,分割属性是随机选取的;而属性的分割点也是随机生成的(random),他提供的代码是仅仅适用于数值类型的。
2.2. 构造隔离森林
直接根据树的个数进行构造。
2.3. 测量路径
直接将所有的实例点都带入到隔离森林中;他这部分代码提供的方式是所有的树的路径然后取平均。当然也有其他的方法来测试。
3. 思考
在前面的说法中,我一开始以为可以填充异常的比例(因为我之前的时候实验好像就是这么实验,不过我也记不清了,不知道是不是sklearn中的实现是可以实现的,这个后续可以进行考究。)
我的想法就是,是不是数据集中一定要有异常呢?但是我实现也不知道比例,他们应该是怎么知道的呢?这个很关键,他怎么把控这个输出的比例呢?
参考
[1]Isolation Forest from Scratch