异常检测之孤立森林算法详细解释且配上代码运行实例
由于异常值往往有的两个特点:异常数据只占很少量、异常数据特征值和正常数据差别很大。孤立森林,不是描述正常的样本点,而是要孤立异常点,由周志华教授等人于2008年在第八届IEEE数据挖掘国际会议上提出。孤立森林不需要根据距离和密度来衡量异常,因此孤立森林的时间复杂度是线性的,需要的内存也很少。孤立森林有能力处理大数据和高维数据,对于我们大数据背景下的异常识别,是十分适合的一个模型。
孤立森林的基本思想是对数据子采样后选择特征孤立数据到一颗树的叶节点,直到终止条件发生,孤立树建立完成。再循环建立新的孤立树,直至形成一片孤立森林。然后数据放入计算此数据在对于叶节点的路径长度,路径长度越短表示越先被孤立出来,越可能是异常值。
孤立森林的思想如下图所示:
孤立森林相关定义如下:
异常分数的评价:
当异常分数s越接近1时,表明数据异常的可能性很大
当异常分数大于0.5时,数据有可能是异常值
当所有数据异常分数s在0.5左右时,可以不认为数据整体有明显异常。
孤立森林的算法流程图如下
======================================================
论文中的图,表达的意思应该是一样的。
通过一颗树分叉来划分数据集,往往异常值(和正常值差的比较大)只需几次会被首先孤立出来,而正常值,往往需要更多的次数才会被孤立出来。
如下图所示Xi为正常值,一棵树需要对数据切分多次才能够将其孤立出来,而Xo明显为离群值,一棵树只需要划分一两次就可能将其孤立出来了。
由于是集成学习模型,那么孤立树的个数也有讲究,当数量过小时,会导致路径平均值波动较大,当数量过大时,会白白浪费计算资源,因此文章也经过多次实验证明,当孤立树选100棵时,既能使得路径平均收敛(即稳定在为某一值),也能拥有较高的性能。
还有一点就是,由于孤立森林的思想是孤立异常值,那么当样本数据量过大时,可能异常值也可能会挤在一起,就会导致孤立的思路失效了。如下图所示
对于这个问题,可以通过子采样来解决。
子采样之后可见异常值又重新被明显的区分开来了,论文中也通过多次实验发现子采样为256时,效果是最好的。
时间复杂度和空间复杂度
简单来说训练时间是O(1),预测时间是O(N),空间同理。
最后因为这个模型十分经典,sklearn中已经帮我们实现了。
# coding:utf-8
import pandas as pd
import numpy as np
from sklearn.ensemble import IsolationForest
import matplotlib.pyplot as plt
np.random.seed(0)
mean = np.array([3, 0])
cov = np.eye(2)
dot_num = 300
fxy = np.random.multivariate_normal(mean, cov, dot_num)
data = pd.DataFrame(fxy)
data.columns = ["X", "Y"]
model = IsolationForest()
model.fit(data)
data["label"] = model.predict(fxy)
data["score"] = model.decision_function(fxy)
inner = data[data["label"] == 1]
outer = data[data["label"] == -1]
fig = plt.figure()
fig1 = fig.add_subplot(121)
fig2 = fig.add_subplot(122)fig1.scatter(inner["X"], inner["Y"], label="inner-position", alpha=0.5, color="blue")
fig1.scatter(outer["X"], outer["Y"], label="outer-position", alpha=1, color="red")
fig1.legend()fig2.bar(inner.index, inner["score"], label="inner-score", alpha=0.5, color="blue")
fig2.bar(outer.index, outer["score"], label="outer-score", alpha=1, color="red")
fig2.legend()
plt.show()
结果:
可见孤立森林的效果还是很客观的,不过值得注意的是,sklearn中的异常分数是经过调整的,他应该是通过取负之后再加上0.5作为异常分数,因此这里的异常线为0,即大于0为正常,小于0为异常,从图中应该也看得出来。
异常检测之孤立森林算法详细解释且配上代码运行实例相关推荐
- 异常检测-基于孤立森林算法Isolation-based Anomaly Detection-1-论文学习
异常检测-基于孤立森林算法Isolation-based Anomaly Detection-1-论文学习 参考文章: (1)异常检测-基于孤立森林算法Isolation-based Anomaly ...
- 异常检测概览——孤立森林 效果是最好的
用机器学习检测异常点击流 本文内容是我学习ML时做的一个练手项目,描述应用机器学习的一般步骤.该项目的目标是从点击流数据中找出恶意用户的请求.点击流数据长下图这样子,包括请求时间.IP.平台等特征: ...
- 在envi做随机森林_基于模糊孤立森林算法的多维数据异常检测方法
引用:李倩, 韩斌, 汪旭祥. 基于模糊孤立森林算法的多维数据异常检测方法[J]. 计算机与数字工程, 2020, 48(4): 862-866. 摘要:针对孤立森林算法在进行异常检测时,忽略了每一条 ...
- 孤立森林算法 python_孤立森林(isolation forest)
1.简介 孤立森林(Isolation Forest)是另外一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择. 在建树过程中 ...
- 孤立森林算法 python_异常检测怎么做,试试孤立随机森林算法(附代码)
选自blog.paperspace 作者:Dhiraj K 机器之心编译 参与:李诗萌.一鸣 异常检测看似是机器学习中一个有些难度的问题,但采用合适的算法也可以很好解决.本文介绍了孤立森林(isola ...
- 【项目实战】Python基于孤立森林算法(IsolationForest)实现数据异常值检测项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 孤立森林是基于Ensemble的快速异常检测方法,具有线性时间复 ...
- 孤立森林算法的离群点检测
孤立森林算法的离群点检测,包含设置隔一段时间运行检测函数.读取数据库.插入数据库.保存异常检测模型.可视化异常分数与异常值直方图关系.插入uuid.当前日期. import pandas as pd ...
- UEBA 学术界研究现状——用户行为异常检测思路:序列挖掘prefixspan,HMM,LSTM/CNN,SVM异常检测,聚类CURE算法...
论文 技术分析 <关于网络分层信息泄漏点快速检测仿真> "1.基于动态阈值的泄露点快速检测方法,采样Mallat算法对网络分层信息的离散采样数据进行离散 小波变换;利用滑动窗口对 ...
- AIOps指标异常检测之无监督算法
随着系统规模的变大.复杂度的提高.监控覆盖的完善,监控数据量越来越大,运维人员无法从海量监控数据中发现质量问题.智能化的异常检测就是要通过AI算法,自动.实时.准确地从监控数据中发现异常,为后续的诊断 ...
最新文章
- 2.1 DNS服务介绍和安装
- python画正方形的代码_python绘制正方形螺旋线的代码分享
- Input and Output-HackerRank C++
- zigbee协议栈-端点
- 海康威视复赛题 --- 算法说明书
- evga x58服务器芯片组,EVGA发布X58主板 首次涉足Intel芯片组
- 读书笔记---《小强升职记》
- Harris角点检测及数据分析
- 如何把应用程序和资料转移到新的硬盘?
- 淘宝低价引流违法吗,低价引流的处罚
- 学习python的难点
- HAWQ技术解析(十一) —— 数据管理
- mac电脑上遇到的坑,持续更新...
- 备份表(表结构和数据)
- css3从入门到熟练运用(三):炫目字体,多样背景和渐变颜色,神奇边框
- html c3效果,使用c3动画实现摇铃铛效果
- 从线性到非线性模型-线性回归,岭回归,Lasso回归,局部加权线性回
- PDU会话建立流程(8)-SM Policy Association的建立
- 黑客教父详解账号泄露全过程:1亿用户已泄露
- java 内存压缩_JVM之指针压缩内存如何设置