剔除异常值栅格计算器_基于数据流的异常检测: Random Cut Forest
一、解决的问题
- 数据是实时产生的,对数据进行批处理所花费的成本太高了,数据产生的价值被低估
- 在高维数据下,如何能发现异常的维度?
If my time-series data with 30 features yields an unusually high anomaly score. How do I explain why this particular point in the time-series is unusual?
Ideally I'm looking for some way to visualize "feature importance" for a specific data point.
二、业内的解决方案
1、Numenta公司提出的HTM算法模型
- 背景:在大多数情况下,传感器流的数量很大,人类很少有机会,更不用说专家干预了。 因此,以无人监督的自动方式(例如,无需手动参数调整)操作通常是必要的。 底层系统通常是非平稳的,探测器必须不断学习和适应不断变化的统计数据,同时进行预测。 Hierarchical Temporal Memory (HTM)网络以有原则的方式在各种条件下稳健地检测异常。
- 生产系统应该是高效的,非常容忍噪声数据,不断使用数据统计的变化,并检测非常微妙的异常,同时最大限度地减少误报。该算法在实时金融异常检测中表现较好,切已经得到商业化部署。HTM与序列预测中的一些现有算法相比是有利的,特别是复杂的非马尔可夫序列,HTM不断学习系统,自动适应不断变化的统计数据,这是一种与流分析特别相关的属性。
- 该公司开发的Grok系统,目前服务在AWS,针对物理机器进行异常检测。The Leading AIOPS Platform For Intelligent Incident Prediction And Self-Healing Operations In IT Service Assurance
2、Amazon Kinesis
2.1 应用场景
- AWS Metering
- Amazon S3 events
- Amazon Cloud Watch Logs
- http://Amazon.com online catalog
- Amazon Go Video analysis
2.2 Kinesis - RRCF调用方式
-- creates a temporary stream.
CREATE OR REPLACE STREAM "TEMP_STREAM" ("passengers" INTEGER,"distance" DOUBLE,"ANOMALY_SCORE" DOUBLE);-- creates another stream for application output.
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ("passengers" INTEGER,"distance" DOUBLE,"ANOMALY_SCORE" DOUBLE);-- Compute an anomaly score for each record in the input stream
-- using Random Cut Forest
CREATE OR REPLACE PUMP "STREAM_PUMP" ASINSERT INTO "TEMP STREAM"SELECT STREAM "passengers", "distance", ANOMALY_SCOREFROM TABLE (RANDOM_CUT_FOREST (CURSOR(SELECT STREAM * FROM "SOURCE_SQL_STREAM")))-- Sort records by descending anomaly score, insert into output stream
CREATE OR REPLACE PUMP "OUTPUT_PUMP" ASINSERT INTO "DESTINATION_SQL_STREAM"SELECT STREAM * FROM "TEMP_STREAM"ORDER BY FLOOR("TEMP_STREAM".ROWTIME TO SECOND), ANOMALY_SCORE
DESC;
3、Azure IoT Edge, Azure Stream Analytic
- 下面的示例查询假设在2分钟的滑动窗口中以每秒120个事件的历史记录来统一输入每秒事件的速率。 最终的SELECT语句提取并输出得分和异常状态,置信度为95%。
WITH AnomalyDetectionStep AS
(SELECTEVENTENQUEUEDUTCTIME AS time,CAST(temperature AS float) AS temp,AnomalyDetection_SpikeAndDip(CAST(temperature AS float), 95, 120, 'spikesanddips')OVER(LIMIT DURATION(second, 120)) AS SpikeAndDipScoresFROM input
)
SELECTtime,temp,CAST(GetRecordPropertyValue(SpikeAndDipScores, 'Score') AS float) ASSpikeAndDipScore,CAST(GetRecordPropertyValue(SpikeAndDipScores, 'IsAnomaly') AS bigint) ASIsSpikeAndDipAnomaly
INTO output
FROM AnomalyDetectionStep
4、SLS @ Alibaba Cloud
- 阿里云日志服务功能介绍
三、算法原理
3.0、无监督树形异常检测算法发展历程
- 2008 - Isolation Forest Published
- 2013 - Survey on outlier detection
- 2016 - RRCF published in JMLR
- 2016 - RRCF available on Amazon Kinesis
- 2018 - RCCF available on Hydroserving
3.1 2008年Isolate Forest原理
1. 单棵树的构建过程
iTree是一种随机二叉树,每个节点要么有两个孩子,要么就是叶子节点,每个节点包含一个属性q和一个划分值p。
具体的构建过程如下:
- 从原始训练集合X种无放回的抽取样本子集
- 划分样本子集,每次划分都从样本中随机选择一个属性q,再从该属性中随机选择一个划分的值p,该p值介于属性q的最大与最小值之间
- 根据2中的属性q与值p,划分当前样本子集,小于值p的样本作为当前节点的左孩子,大于p值的样本作为当前的右孩子
- 重复上述2,3步骤,递归构建每个节点的左、右孩子节点,知道满足终止条件为止,通常终止条件为所有节点均只包含一个样本或者多个相同的样本,或者树的深度达到了限定的高度
2. 构建参数的说明
有两个参数控制着模型的复杂度:
- 每棵树的样本子集大小,它控制着训练数据的大小,论文中的实验发现,当该值增加到一定程度后,IForest的辨识能力会变得可靠,但没有必要继续增加下去,因为这并不会带来准确率的提升,反而会影响计算时间和内存容量,论文实现发现该参数取256对于很多数据集已经足够;
- 集成的树的数量,也可以理解为对原始数据的采样的次数,它控制着模型的集成度,论文中描述取值100就可以了;
3. 如何衡量样本的异常值
计算样本的异常值的过程如下:将测试数据在iTree树上沿着对应的条件分支往下走,直到达到叶子节点,并记录这过程中经过的路径长度h(x),利用如下公式进行异常分数的计算:
其中,
4. 一些缺点
- Contains all points
- Every leaf contains one distinct point
- Each node separates bounding box of it's points in two halves
3.2 2016年RRCF原理
0. 为何会引入RRCF算法?
- 数据是持续产生的,数据中的时间戳是一个重要因素,而这个维度却经常被大家忽略
- 数据的结构和形态是未知的,需要设计一个鲁棒性的算法来应对各种复杂的场景需求
- iTree是针对候选数据,进行N次无放回的采样,通过对静态数据集进行划分而得到。若针对流式数据,每次都要针对最新的数据进行采样,再去构造数据集,运行算法,得到相应的结果;
- 在针对流式数据的异常检测场景中,缺少对序列中时序的关系的考虑,算法仅仅把当前的点当做孤立的点进行建模;
1. 针对数据流进行采样建模
针对第一个上述的第一个问题:
- 可以采用一些采样策略(蓄水池采样)能准确的当前的数据点是否参与异常建模;
- 同时指定一个时间窗口长度,当建模的数据过期后,应该从模型中剔除掉;
2. 算法中核心的几个操作
- 构造Robust Random Cut Tree操作
- 从一个Tree中删除某个样本
- 插入一个新的样本到树结构中
3. 如何衡量样本的异常值
- 引用论文中的一段话
Let 0 be a left decision and 1 be a right decision. Thus, for x ∈ S, we can write its path as a binary string in the same manner of the isolation forest, m(x). We can repeat this for all x ∈ S and arrive at a complete model description: M(S) = ⊕x∈Sm(x), the appending of all our m(x) together. We will consider the anomaly score of a point x to be the degree to which including it causes our model description to change if we include it or not,
- 形象化的描述如下所示:
上图左侧表示构造出来的树的结构,其中x是我们待处理的样本点,有图表示将该样本点删除后,动态调整树结构的形态。其中q_0,...,q_r表示从树的根节点编码到
- 每个样本的异常分数的含义:将点x的异常得分视为包含或不包含该点,而导致模型的描述发生改变的程度
论文中通过对上式的变换,得到对应的公式:
- 利用上述公式的描述,可以得到具体的衡量分数,但是如果将上述分数直接转换为异常值,还需要算法同学根据自己的场景进行合理的转换
3.3 流式改造 - 蓄水池采样算法
- 算法大致描述:给定一个数据流,数据流长度N很大,且N直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出m个不重复的数据。
- 具体的伪代码描述
int[] reservoir = new int[m];// init
for (int i = 0; i < reservoir.length; i++)
{reservoir[i] = dataStream[i];
}for (int i = m; i < dataStream.length; i++)
{// 随机获得一个[0, i]内的随机整数int d = rand.nextInt(i + 1);// 如果随机整数落在[0, m-1]范围内,则替换蓄水池中的元素if (d < m){reservoir[d] = dataStream[i];}
}
通过对数据流进行采样,可以较好的从数据流中等概率的进行采样,通过RRCF中提供的DELETE方法,可以将置换出模型的数据动态的删除掉,将新选择的样本数据动态的加入到已经有的树中去,进而得到对应的CODISP值。
3.4 并行调用的改造
该算法同Isolation Forest算法一样,非常适合并行构建,在此不做太多的赘述,推荐读者使用Python一个并行的软件包Joblib,能非常方便的帮助用户开发。
传送门:Joblib: running Python functions as pipeline jobs
四、算法实验结果
4.1 多维度的流量场景实验
- 实验数据说明:(时间戳,流量,平均请求延迟,访问次数),数据每5秒聚合一个点
- 该实验结果是使用全量的数据进行RRCF树的构造,在对结果中的全部叶子节点去获取对应的CODISP值,可视化如下结果,其中第一条曲线表示:网站每5秒的请求流量情况;第二条曲线表示:网站每5秒的平均请求延迟情况;第三条曲线表示:网站每5秒的访问次数情况;第四条曲线表示:每个点的CODISP值的大小;
- 在实际场景中,可以通过对CODISP值的判别来判定具体点是否是异常;
- 使用数据的前1024个点做为基础模型的数据,去构造100棵树;针对余下的数据点逐点输入算法中去,采用蓄水池采样的策略,动态的对树内部的有效点进行增删,实时得到最新点的CODISP值,绘制结果如下图所示;
4.2 如何将CODISP分数转换成异常值
- 理解下算法的本质:某个点的删除,导致整体树结构发生变化的程度(目前使用受影响程度正比于树种点的数量),对于一个确定容量的树来说,可以通过设置具体的阈值,来判别异常
- 可以针对CODISP使用K-Sigma算法,得到具体的上界异常值
4.3 如何对检测到的异常进行可解释性描述
- 该部分比较复杂,请等下一篇文章的分享
参考文献
- Sudipto Guha, Nina Mishra, Gourav Roy, and Okke Schrijvers. "Robust random cut forest based anomaly detection on streams." In International Conference on Machine Learning, pp. 2712-2721. 2016.
- Byung-Hoon Park, George Ostrouchov, Nagiza F. Samatova, and Al Geist. "Reservoir-based random sampling with replacement from data stream." In Proceedings of the 2004 SIAM International Conference on Data Mining, pp. 492-496. Society for Industrial and Applied Mathematics, 2004.
- http://proceedings.mlr.press/v48/guha16-supp.pdf
- Implementation of the Robust Random Cut Forest Algorithm for anomaly detection on streams. https://klabum.github.io/rrcf/scoring-rctree.html
- 亚马逊中关于该算法的参数说明 https://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/sqlrf-random-cut-forest-with-explanation.html
- 亚马逊中关于该算法的具体例子说明 https://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/dev/app-anomaly-detection.html
剔除异常值栅格计算器_基于数据流的异常检测: Random Cut Forest相关推荐
- 节点图一般的比例_基于图的异常检测(二):LOCKINFER
论文:Inferring lockstep behavior from connectivity pattern in large graphs 作者:Meng Jiang,Peng Cui 来源:P ...
- 剔除异常值栅格计算器_R语言系列 数据清洗3 异常值处理
[免责声明:用于教学资料整理] 目录: 一. 用箱线图检测异常值 二. 使用局部异常因子法(LOF法)检测异常值 三. 用聚类方法检测异常值 四. 检测时间序列数据中的异常值 五. 基于稳健马氏距离检 ...
- 检测噪声大小的c语言程序,单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计.doc...
单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计 摘 要 本文以AT89S52 单片机为控制核心,通过播音判断电路寻找广播间歇时段,实时采集噪声环境内的噪音信 号,根据A/ D 转换 ...
- 五种常用的异常值检测方法(均方差、箱形图、DBScan 聚类、孤立森林、Robust Random Cut Forest
什么是异常/离群点? 在统计学中,离群点是并不属于特定族群的数据点,是与其它值相距甚远的异常观测.离群点是一种与其它结构良好的数据不同的观测值. 例如,你可以很清楚地看到这个列表中的离群点:[20,2 ...
- 基于时间序列的异常检测算法小结
简介 搜罗了网上几乎所有的基于时间序列的异常检测方法,没有包括文献,整理记录一下. 综合引用以下文章: 数据挖掘导论 时间序列异常检测机制的研究 KPI异常检测竞赛笔记 异常检测之时间序列的异常检测 ...
- 《异常检测——从经典算法到深度学习》7 基于条件VAE异常检测
<异常检测--从经典算法到深度学习> 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测 ...
- 基于图的异常检测算法——概述
正在调研基于图的异常检测算法,先出个概述,后面再慢慢填坑 基于图的异常检测 给定一个图数据库,找到其中罕见不同于其他数据对象的点/边/子结构 静态图的异常检测 普通静态图 基于结构 基于特征:利用图结 ...
- 基于图的异常检测(三):GraphRAD
基于图的异常检测(三):GraphRAD 参考文章: (1)基于图的异常检测(三):GraphRAD (2)https://www.cnblogs.com/bonelee/p/11948963.htm ...
- 基于高斯分布的异常检测算法 项目描述
异常检测项目整理 基于高斯分布的异常检测算法 收集特征:电机轴1到6,问问剑桥,那份文档每个参数啥意思. 假设机器数据符合高斯分布,如果不符合,就用对数函数转化为高斯分布. 一个机器的1轴和2轴 ...
最新文章
- 三章:CentOS6.5 更改时区设置、安装samba、install VMware、install XFS 、install XFS --parted
- java字母反过来_java之字母反转~~ - Plight - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- Java多线程学习笔记一
- 第一个一千行总结-数据结构C复习--知识点总结1--一到四章
- java android上传文件_Java-Android-如何将txt文件上传到网站?
- Linux学习之内核模块编程
- 查询SQLSERVER执行过的SQL记录
- WPF中DatePiker值绑定以及精简查询
- java中sping基础_Java回顾之Spring基础
- GAN网络的详细内容
- USB Server应用于税控盘的远程集中管理
- 腾讯产品能力框架之通用能力篇(一)学习能力
- p2p与反p2p的博弈,一劳永逸真的不容易么
- 51单片机的定时器/计数器及编程
- 汇率兑换 python第一课_【Python 07】汇率兑换1.0-2(基本元素)
- 解决出现Creating mailbox file: File exists问题,并分析出错原因
- 数据库原理和应用(2)—— 数据库系统的组成
- android推流屏幕显示,抖音直播如设置推流,直播神器:通过AirDroid无线投屏功能,...
- 评选最牛群主v1.0(哈工大Mooc)
- OpenStack云平台的管理