更新时间:2022-02-22 GMT+08:00

异常检测

异常检测应用场景相当广泛,包括了入侵检测,金融诈骗检测,传感器数据监控,医疗诊断和自然数据检测等。异常检测经典算法包括统计建模方法,基于距离计算方法,线性模型和非线性模型等。

我们采用一种基于随机森林的异常检测方法:

  • One-pass算法,O(1)均摊时空复杂度。
  • 随机森林结构仅构造一次,模型更新仅仅是节点数据分布值的更新。
  • 节点存储多个窗口的数据分布信息,能够检测数据分布变化。
  • 异常检测和模型更新在同一个代码框架中完成。

语法格式

1
SRF_UNSUP(ARRAY[字段1, 字段2, ...], '可选参数列表')
  • 函数输出为[0, 1]区间的DOUBLE值,表示数据的异常打分。
  • 字段名必须为一致的数值类型,若字段类型不同,可通过CAST函数转义,例如[a, CAST(b as DOUBLE)]。
  • 可选参数列表语法为"key1=value,key2=value2,..."。

参数说明

表1 参数说明

参数

是否必选

说明

默认值

transientThreshold

连续transientThreshold个窗口发生数据改变表示发生数据概念迁移。

5

numTrees

随机森林中Tree的数量。

15

maxLeafCount

Tree最大叶子节点数量。

15

maxTreeHeight

Tree最大高度。

12

seed

算法使用的随机种子值。

4010

numClusters

分类数,默认包含异常和非异常两类。

2

dataViewMode

算法学习模式。

  • history:学习所有历史数据。
  • horizon:仅考虑最近一段时间历史数据,默认为4个窗口。

history

示例

对于数据流MyTable中的c字段运行异常检测算法,当异常分大于0.8时输出异常。

1
2
3
4
5
6
SELECT c,
	CASE WHEN SRF_UNSUP(ARRAY[c], "numTrees=15,seed=4010") OVER (ORDER BY proctime RANGE BETWEEN INTERVAL '300' SECOND PRECEDING AND CURRENT ROW) > 0.8
		 THEN 'anomaly' 
		 ELSE 'not anomaly' 
	END
FROM MyTable