离群点检测与序列数据异常检测以及异常检测大杀器-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班同学们的帮助 附上李老师和 ...
随机推荐
- Java访问文件夹中文件的递归遍历代码Demo
上代码: import java.io.File; /* * 需求:对指定目录进行所有内容的列出(包含子目录中的内容) * 也可以理解为 深度遍历. */ public class FindAllFi ...
- Unsupervised learning无监督学习
Unsupervised learning allows us to approach problems with little or no idea what our results should ...
- Hive ROW_NUMBER,RANK(),DENSE_RANK()
准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100 创建表 CREATE t ...
- .NET 线程池编程技术
摘要 深度探索 Microsoft .NET提供的线程池, 揭示什么情况下你需要用线程池以及 .NET框架下的线程池是如何实现的,并告诉你如何去使用线程池. 内容 介绍 .NET中的线程池 线程池中执 ...
- C 语言精髓之变参函数
我们以 printf 这个 very 熟悉的函数为例,来分析一下变参函数.先看下 printf 函数的定义: int printf(const char *fmt, ...) { int i; int ...
- [转]git提交代码时遇到代码库有更新以及本地有更新的解决方法
本文转自:https://blog.csdn.net/myphp2012/article/details/80519156 在多人协作开发时,经常碰到同事把最新修改推送到远程库,你在本地也做了修改,这 ...
- [转]【Angular4】基础(一):脚手架 Angular CLI
本文转自:https://blog.csdn.net/u013451157/article/details/79444495 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- CSS学习笔记09 简单理解BFC
引子 在讲BFC之前,先来看看一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- deepin使用笔记-解决蓝牙设备开机自动开启的问题
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装蓝牙驱动管理 #apt-get install blueman 2.打开蓝牙驱动管理,关闭设备 3.关闭蓝牙开机启动服务 ...
- Django Rest framework 之 序列化
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...