离群点检测与序列数据异常检测以及异常检测大杀器-iForest
1. 异常检测简介
异常检测,它的任务是发现与大部分其他对象不同的对象,我们称为异常对象。异常检测算法已经广泛应用于电信、互联网和信用卡的诈骗检测、贷款审批、电子商务、网络入侵和天气预报等领域。这些异常对象的主要成因有:来源于不同的模式、自然变异、数据测量以及随机误差等。而常见的异常检测算法都是针对独立的数据点进行异常检测,此时异常检测又称为离群点检测。而在序列数据的异常检测过程中,我们既可以直接使用对序列进行异常检测的算法,也可以先对序列数据进行特征提取然后转化为传统的离群点检测。
2. 基本的离群点检测算法
离群点检测方法 | 方法描述 | 方法特点 |
基于统计 | 大部分的基于统计的离群点检测方法是构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为离群点 | 基于统计模型的离群点检测方法的前提是必须知道数据集服从什么分布;而对于高维的数据,可能每一维度服从的分布都不太一致,所以通常对高维数据来讲通常效果较差。 |
基于邻近度 | 通常可以在数据对象之间定义邻近性度量,把远离大部分点的对象视为离群点。 | 算法假定离群点是离散的,低维数据我们可以作图观察,而高维数据我们无法观察,所以难以确定有效的参数和全局阈值,效果较差。 |
基于密度 | 考虑到数据集可能存在不同密度区域这一事实,从基于密度的观点分析,离群点是在低密度区域中的对象。 | 算法假定离群点存在密度较低的区域,具有全局的阈值,对参数选择敏感。 |
基于聚类 | 一种利用聚类检测离群点的方法是直接丢弃远离其他簇的小簇;另一种是对数据点属于簇的程度进行评价,去除得分较低的点。 | 聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大,对数据的可分类性要求较高 |
3. 序列数据的异常检测算法
3.1 序列数据的异常分类
异常类别名称 |
异常描述 |
异常图形 |
语境异常点 |
此种异常为序列数据中的点异常,语境异常点一定是处在序列数据的上下文中的异常点,如右图(横坐标代表时间,纵坐标代表温度),t1处和t2处的取值是一样的,但是t2属于异常点,而t1是正常的温度 |
|
异常子序列 |
如右图所示,异常的子序列就是红色部分,顾名思义,就是子序列的方式与整体序列的模式大不相同。 |
|
异常序列-对比于基础序列 |
此种是给出一个基础的序列,判断测试序列与基础序列相比是否异常。如右图左部分是基础序列,右部分是测试序列,红色序列模式大不相同所以是异常序列。 |
3.2 序列异常检测的挑战
1)异常子序列的长度难以有效确定
2)异常未在训练集中出现
3)序列经常存在比较大的噪声,会产生像离群点检测一样的淹没效应(异常点和正常点的距离很小,甚至难以分别)以及掩蔽效应(异常点增多,导致其密度增大)
3.3 序列异常检测的预处理-数据转换常见方式
1)聚合数据;常见的操作有 Piecewise Aggregate Approximation(PAA)以及其变体 Adaptive piecewise constant approximation(APCA)
2)离散化;与我们常见的数据离散化方式一致
3)基于信号处理的;常见的如傅里叶变换、小波变换、Haar变换等
3.4 序列异常检测常见的方式
序列异常检测方法 | 方法描述 | 方法特点 |
基于窗口 | 此方法将序列分为具体的固定长度的窗口来进行检测 | 窗口的大小需要谨慎的选择,一定要能覆盖到异常序列,不然检测效果会比较差。 |
基于邻近度 | 此方法使用邻近度来衡量序列数据之间的距离,方法假设异常数据在此度量下是远离正常数据的 | 此方法的预测效果极大的依靠我们设计的邻近度度量,PS:针对序列数据来讲,DTW是一种强大的衡量序列数据距离的方法。 |
基于预测 | 此种方法通过预测数据,让后将预测数据与真实数据对比偏差较大的市委异常 | 基于预测的方法,比较适用于异常点的检测,如果针对一个子序列,预测的时间过长,难以达到有效精度会影响检测的效果。 |
4. 异常检测中的大杀器-iForest
4.1 iForest 异常检测的原理
iForest(孤立森林)的原理和常见的异常检测算法一样直观上非常容易理解,iForest像随机森林一样也是由大量的树构成,简称iTree。iTree的构建过程是每次随机选一个特征,然后随机在特征的最大值和最小值之间选择一个分界值,然后对数据进行二叉划分,不断的递归下去,直到不能够进行划分为止,就构造了一颗二叉树-iTree。而进行离群点判断时,我们会发现离群点在iTree树的深度更浅。如上图所示,正常点xi需要多次划分才能定位,而异常点比较少的划分就可以定位。
如上图所示,随着iTree树的个数的增加,正常点和离群点的树的平均深度都快速收敛,而且正常点的树的深度明显更大。
4.2 iForest 异常检测的优势
1)高效,尤其在线的检测只需要遍历整个iForest既可得到结果。
2)自适应,与传统基于密度或者距离的异常检测算法不同,它们的阈值全部是全局的阈值,所以在异常点局部密度较大时会失效,而iTree在每次对二叉树进行划分时,都是在局部的最大值和最小值之间随机选值,也就是说每次划分的取值区间是根据局部自适应的,这让iForest变得鲁棒、强大。
参考文献:
《python 数据分析与挖掘实战》张良均 等; 书籍
《外卖订单量预测异常报警模型实践》东杰; 美团技术团队博客 链接:https://tech.meituan.com/order-holtwinter.html
《Introduction to Anomaly Detection》Pramit Choudhary; datascience blog链接:https://www.datascience.com/blog/intro-to-anomaly-detection-learn-data-science-tutorials
《Outlier detection with several methods》;sklearn doc 链接:http://scikit-learn.org/stable/auto_examples/covariance/plot_outlier_detection.html#sphx-glr-auto-examples-covariance-plot-outlier-detection-py
《Anomaly Detection of Time Series》Deepthi Cheboli;硕士论文
《Isolation-based Anomaly Detection》周志华 等;期刊论文
离群点检测与序列数据异常检测以及异常检测大杀器-iForest的更多相关文章
- 如何利用AI识别未知——加入未知类(不太靠谱),检测待识别数据和已知样本数据的匹配程度(例如使用CNN降维,再用knn类似距离来实现),将问题转化为特征搜索问题而非决策问题,使用HTM算法(记忆+模式匹配预测就是智能),GAN异常检测,RBF
https://www.researchgate.net/post/How_to_determine_unknown_class_using_neural_network 里面有讨论,说是用rbf神经 ...
- paip.检测信用卡账单数据的正确性算法
paip.检测信用卡账单数据的正确性算法 主要3点: //1.重点检测.大钱记录 //2.检测遗漏记录 //3.排除双唇记录. //4.试着cls share,改变错误的cls. 作者Attilax ...
- ueditor 添加微软雅黑字体 异常“从客户端中检测到有潜在危险的 request.form值”,解决
使用ueditor往数据库添加文本内容时,如果字体有css样式, <,>," 这些字符会导致报出异常信息:从客户端中检测到有潜在危险的 request.form值 因为这些字符有 ...
- 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练
将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...
- SpringMVC由浅入深day02_5数据回显_6异常处理器
5 数据回显 5.1 什么数据回显 表单提交失败需要再回到表单页面重新填写,原来提交的数据需要重新在页面上显示. 5.2 pojo数据回显方法 1.springmvc默认对pojo数据进行回显. po ...
- TensorFlow TFRecord封装不定长的序列数据(文本)
TensorFlow TFRecord封装不定长的序列数据(文本) 在实验室环境中,通常数据都是一次性导入内存的,然后使用手工写的数据mini-batch函数来切分数据,但是这样的做法在海量数据下显得 ...
- rancher导入k8s集群后添加监控无数据
1.日志报错 rancher导入k8s集群后添加监控无数据,rancher日志报错: k8s.io/kube-state-metrics/pkg/collectors/builder.go:: Fai ...
- @Valid 数据校验 + 自定义全局异常信息
关于javax.validation.Validator校验的使用 对于要校验的实体类:其需要校验的字段上需要添加注解 实际例子 使用:首先要拿到 validator的子类 Validator val ...
- Python的序列数据和变量
本篇内容涉及字符串.列表.元组.Python中的报错,以及变量本质,包括引用计数技术 该篇只为抛砖引玉,其内容来自Python学习中总结,另外感谢李老师的教导和Python班同学们的帮助 附上李老师和 ...
随机推荐
- OpenStack 单元测试
OpenStack 单元测试 OpenStack开发——单元测试 本文将介绍OpenStack单元测试的部分.本文将重点讲述Python和OpenStack中的单元测试的生态环境. openstack ...
- 实现text-detection-ctpn一路的坎坎坷坷
小编在学习文字检测,因为作者提供的caffe实现没有训练代码(不过训练代码可以参考faster-rcnn的训练代码),所以我打算先使用tensorflow实现,主要是复现前辈的代码,主要是对文字检测模 ...
- 异步加载CSS
说到加载 CSS 这种事儿不是很简单吗?像这样咯: <link rel="stylesheet" href="cssfile.css"> 这不就完事 ...
- Hive基础之绪论
我本人大概是从2013年12月份开始接触Hadoop,因为公司当时要开始处理一些数据量比较大的数据,现有的通过程序去统计数据的方式在效率方面渐渐不能满足业务需求,所以便开始了Hadoop技术的探索,即 ...
- 探秘 Java 热部署
# 前言 在之前的 深入浅出 JVM ClassLoader 一文中,我们说可以通过修改默认的类加载器实现热部署,但在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能 ...
- Java并发编程的艺术(一)
题目1 创建3个线程,让3个线程分别按着顺序打印AAAA,BBBB,CCCC(第一个线程打印AAAA,第二个线程打印BBBB,第一个线程始终在第二个线程之前打印) 代码(该代码为打印3个线程分别打印一 ...
- jQuery学习(2)ajax()使用
在上一篇分享JavaScript之使用AJAX(适合初学者)中,我们学习了如何在JavaScript中使用AJAX.由于jQuery出色的性能和简洁的写法,且它也支持AJAX的使用,所以,本次分享 ...
- jquery之商城菜单
实现效果:悬浮总菜单,显示分类菜单,移走隐藏总菜单,悬浮分类菜单,显示商品种类,移走隐藏商品种类和分类菜单,悬浮商品种类,显示商品种类和分类菜单,移走隐藏商品菜单和分类菜单. 代码如下: <!D ...
- csharp: using HtmlAgilityPack and ScrapySharp reading Url find text
https://github.com/exaphaser/ScrapySharp https://github.com/zzzprojects/html-agility-pack https://gi ...
- 洛谷P1742 最小圆覆盖(计算几何)
题意 题目链接 Sol 暴力做法是\(O(n^3)\)枚举三个点然后check一下是否能包含所有点 考虑一种随机算法,首先把序列random_shuffle一下. 然后我们枚举一个点\(i\),并维护 ...