时间序列数据异常点是指序列中模式存在不一致的点(如突然的上升或下降,趋势改变,层级变换,超出历史最大值/最小值)。
时序数据的异常检测旨在快速准确的找到这些异常点。
按照算法的监督方式区分,时序异常检测可以分为有监督,无监督以及弱监督三类。
其中,有监督的方法将异常检测转化为二分类问题,正常数据为一个类,异常数据为一个类。这样可以直接利用现成的分类算法。但是需要人工标记异常数据,在许多实际应用中往往不太现实。
无监督的方法相对比较实用,主要分为三类:
1、基于规则的方法,如准则;
2、基于聚类的方法,将数据聚为多个类,如果某个数据和类中心都比较远,则该数据为异常,或是将数据量少于某个阈值的类中所有数据认为是异常。
3、基于重建的方法,这类的方法主要基于auto-encoder (AE)或variational auto-encoder (VAE)。先训练一个模型,得到数据的隐空间。对于测试数据,若该数据的重建误差较大,说明该数据不能和其他数据的分布吻合,即为异常数据。
然而,无论是有监督还是无监督,我们都需要进行调所选择合适的算法并调其超参数。并且,最终所的算法往往还存在不稳定的现象。在本文,笔者介绍一种针对于时序异常检测的AutoML工具:HyperTS。该工具利用弱监督结合无监督的方式,实现了全pipeline的时序异常检测,即可以端到端的实现数据预处理,模型选择,超参数调优,异常结果评估,可视化展示等。操作也十分的简单:
from hyperts import make_experiment
from hyperts.datasets import load_real_known_cause_dataset
from sklearn.model_selection import train_test_split
data = load_real_known_cause_dataset()
ground_truth = data.pop('anomaly')
detection_length = 15000
train_data, test_data = train_test_split(data, test_size=detection_length, shuffle=False)
model = make_experiment(train_data.copy(),
task='detection',
mode='stats',
reward_metric='f1',
max_trials=30,
early_stopping_rounds=10).run()
X_test, _ = model.split_X_y(test_data.copy())
y_test = ground_truth.iloc[-detection_length:]
y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test)
scores = model.evaluate(y_test, y_pred, y_proba=y_proba)
model.plot(y_pred, actual=test_data, history=train_data, interactive=False)
从上图可以看出,对于测试集,该算法检测出了一系列异常值(蓝色点),并且还绘制出了每个时间戳的异常程度(浅蓝色线条)。
笔者今天先介绍到这里,有兴趣的朋友,可以研究一下该项目示例,一起挖掘宝藏:
https://github.com/DataCanvasIO/HyperTS/blob/main/examples/14_anomaly_detection_experiment.ipynb