一、解决的问题

  • 数据是实时产生的,对数据进行批处理所花费的成本太高了,数据产生的价值被低估
  • 在高维数据下,如何能发现异常的维度?

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。

具体的构建过程如下:

  1. 从原始训练集合X种无放回的抽取样本子集
  2. 划分样本子集,每次划分都从样本中随机选择一个属性q,再从该属性中随机选择一个划分的值p,该p值介于属性q的最大与最小值之间
  3. 根据2中的属性q与值p,划分当前样本子集,小于值p的样本作为当前节点的左孩子,大于p值的样本作为当前的右孩子
  4. 重复上述2,3步骤,递归构建每个节点的左、右孩子节点,知道满足终止条件为止,通常终止条件为所有节点均只包含一个样本或者多个相同的样本,或者树的深度达到了限定的高度

2. 构建参数的说明

有两个参数控制着模型的复杂度:

  • 每棵树的样本子集大小,它控制着训练数据的大小,论文中的实验发现,当该值增加到一定程度后,IForest的辨识能力会变得可靠,但没有必要继续增加下去,因为这并不会带来准确率的提升,反而会影响计算时间和内存容量,论文实现发现该参数取256对于很多数据集已经足够;
  • 集成的树的数量,也可以理解为对原始数据的采样的次数,它控制着模型的集成度,论文中描述取值100就可以了;

3. 如何衡量样本的异常值

计算样本的异常值的过程如下:将测试数据在iTree树上沿着对应的条件分支往下走,直到达到叶子节点,并记录这过程中经过的路径长度h(x),利用如下公式进行异常分数的计算:

其中,

是二叉搜索树的平均路径长度,用来对结果进行归一化处理,其中的
来估计,其中
是欧拉常数,其值大约为0.5772156649。

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相关推荐

  1. 节点图一般的比例_基于图的异常检测(二):LOCKINFER

    论文:Inferring lockstep behavior from connectivity pattern in large graphs 作者:Meng Jiang,Peng Cui 来源:P ...

  2. 剔除异常值栅格计算器_R语言系列 数据清洗3 异常值处理

    [免责声明:用于教学资料整理] 目录: 一. 用箱线图检测异常值 二. 使用局部异常因子法(LOF法)检测异常值 三. 用聚类方法检测异常值 四. 检测时间序列数据中的异常值 五. 基于稳健马氏距离检 ...

  3. 检测噪声大小的c语言程序,单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计.doc...

    单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计 摘 要 本文以AT89S52 单片机为控制核心,通过播音判断电路寻找广播间歇时段,实时采集噪声环境内的噪音信 号,根据A/ D 转换 ...

  4. 五种常用的异常值检测方法(均方差、箱形图、DBScan 聚类、孤立森林、Robust Random Cut Forest

    什么是异常/离群点? 在统计学中,离群点是并不属于特定族群的数据点,是与其它值相距甚远的异常观测.离群点是一种与其它结构良好的数据不同的观测值. 例如,你可以很清楚地看到这个列表中的离群点:[20,2 ...

  5. 基于时间序列的异常检测算法小结

    简介 搜罗了网上几乎所有的基于时间序列的异常检测方法,没有包括文献,整理记录一下. 综合引用以下文章: 数据挖掘导论 时间序列异常检测机制的研究 KPI异常检测竞赛笔记 异常检测之时间序列的异常检测 ...

  6. 《异常检测——从经典算法到深度学习》7 基于条件VAE异常检测

    <异常检测--从经典算法到深度学习> 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测 ...

  7. 基于图的异常检测算法——概述

    正在调研基于图的异常检测算法,先出个概述,后面再慢慢填坑 基于图的异常检测 给定一个图数据库,找到其中罕见不同于其他数据对象的点/边/子结构 静态图的异常检测 普通静态图 基于结构 基于特征:利用图结 ...

  8. 基于图的异常检测(三):GraphRAD

    基于图的异常检测(三):GraphRAD 参考文章: (1)基于图的异常检测(三):GraphRAD (2)https://www.cnblogs.com/bonelee/p/11948963.htm ...

  9. 基于高斯分布的异常检测算法 项目描述

     异常检测项目整理 基于高斯分布的异常检测算法 收集特征:电机轴1到6,问问剑桥,那份文档每个参数啥意思. 假设机器数据符合高斯分布,如果不符合,就用对数函数转化为高斯分布. 一个机器的1轴和2轴 ...

最新文章

  1. 三章:CentOS6.5 更改时区设置、安装samba、install VMware、install XFS 、install XFS --parted
  2. java字母反过来_java之字母反转~~ - Plight - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  3. Java多线程学习笔记一
  4. 第一个一千行总结-数据结构C复习--知识点总结1--一到四章
  5. java android上传文件_Java-Android-如何将txt文件上传到网站?
  6. Linux学习之内核模块编程
  7. 查询SQLSERVER执行过的SQL记录
  8. WPF中DatePiker值绑定以及精简查询
  9. java中sping基础_Java回顾之Spring基础
  10. GAN网络的详细内容
  11. USB Server应用于税控盘的远程集中管理
  12. 腾讯产品能力框架之通用能力篇(一)学习能力
  13. p2p与反p2p的博弈,一劳永逸真的不容易么
  14. 51单片机的定时器/计数器及编程
  15. 汇率兑换 python第一课_【Python 07】汇率兑换1.0-2(基本元素)
  16. 解决出现Creating mailbox file: File exists问题,并分析出错原因
  17. 数据库原理和应用(2)—— 数据库系统的组成
  18. android推流屏幕显示,抖音直播如设置推流,直播神器:通过AirDroid无线投屏功能,...
  19. 评选最牛群主v1.0(哈工大Mooc)
  20. OpenStack云平台的管理

热门文章

  1. Linux 操作命令记录
  2. Vue Router的集中统一管理
  3. excel三次样条函数_日常系列2:二次和三次函数样条、数据的插值
  4. oracle定时器定时删除30天前的数据_Redis的过期键删除策略
  5. LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)
  6. windows部署Apollo
  7. Dubbo原理和源码解析之服务引用
  8. Leetcode中单链表题总结
  9. 浅谈JavaScript中的事件
  10. linux中怎样进入桌面目录,linux – 如何获得给定用户“桌面路径”