Anomaly detection

异常检测

简介

在数据分析中,异常检测(也称为异常值检测,有时也称为新颖性检测)通常被理解为识别罕见项目,事件或观察结果,这些项目,事件或观察结果与大多数数据明显偏离并且不符合明确定义的正常行为概念。这些例子可能会引起人们对由不同机制产生的怀疑,或看起来与该组数据的其余部分不一致。

存在三大类异常检测技术。监督式异常检测技术需要一个被标记为“正常”和“异常”的数据集,并涉及训练分类器。但是,由于标记数据的一般不可用以及类固有的不平衡性质,此方法很少用于异常检测。半监督异常检测技术假定数据的某些部分已标记。这可能是正常或异常数据的任意组合,但通常情况下,技术会从给定的正常训练数据集构造表示正常行为的模型,然后测试模型生成测试实例的可能性。无监督异常检测技术假设数据是未标记的,并且由于其更广泛和相关的应用,因此是迄今为止最常用的。

异常检测可识别异常值,以回答“发生了什么通常不会发生?"而预测则的目标则是发现 “未来将会怎样”,例如 Amazon QuickSight 就使用随机切割森林(RCF)算法的内置版本。

试用

创建数据模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUT sensor
{
"mappings": {
"properties": {
"voltage": {
"type": "float"
},
"status" : {
"type": "keyword"
},
"@timestamp": {
"type": "date"
}
}
}
}

插入样本数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import time

from elasticsearch import Elasticsearch

ELASTIC_PASSWORD = "Demo123.."
VOLTAGE_MIN = 1.0
VOLTAGE_MAX = 5.0
VOLTAGE_STEP = 0.5


def build_voltage_array(voltage_min: float, voltage_max: float, step: float):
result = []
for i in range(int((voltage_max - voltage_min) / step) + 1):
result.append(voltage_min + i * step)
return result


if __name__ == '__main__':
client = Elasticsearch(
"https://192.168.2.77:9200",
ca_certs="ca/ca.crt",
basic_auth=("elastic", ELASTIC_PASSWORD)
)
voltage_array = build_voltage_array(VOLTAGE_MIN, VOLTAGE_MAX, VOLTAGE_STEP)
while True:
for voltage in voltage_array:
data = {
"voltage": voltage,
"@timestamp": int(time.time())
}
time.sleep(10)
client.index(index='sensor', document=data)

创建任务并进持续进行监测

  • 在 Kibana 中创建 Data Views
  • 创建 Anomaly detection 任务
    • 将 voltage 参数作为监控参数

注:在创建任务的过程中需要注意,历史数据的持续时间需要超过两个小时才能完成训练。

  • 在 Single Metric Viewer 中即可查看检测结果,或者根据数据进行预测
  • 之后修改插入逻辑,插入异常值然后观测结果即可

参考资料

Elasticsearch Anomaly detection

Amazon QuickSight

OpenSearch 文档


Anomaly detection
https://wangqian0306.github.io/2022/anomaly-detection/
作者
WangQian
发布于
2022年10月12日
许可协议