时序数据异常检测算法

引言

异常检测的场景很多,例如:硬件的故障检测、流量的异常点的检测等场景。针对时间序列类数据的异常检测算法也有很多,业界比较流行的比如普通的统计学习方法–3σ原则和箱线图识别数据离群点,它利用检测点偏移量来检测出异常。比如普通的回归方法,用曲线拟合方法来检测新的节点和拟合曲线的偏离程度,还有人将CNN 和 RNN 技术应用到异常点的检测,但笔者通过大量的实践经验发现以上做法要么识别效果较差【比如:统计学习方法、回归方法】,要么部署难度较大【比如:RNN、CNN等】。

在综合考虑部署成本、实施可行性以及识别效果等方面,本方案提出了一种新的检测算法,此类方法在 LVS 流量异常检测中得到了很好的应用,本文将此类算法应用于污水处理领域的水质指标检测。

异常检测算法原理

1、短期环比(SS)

对于时间序列(是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列)来说,T时刻的数值对于T-1时刻有很强的依赖性。比如氨氮含量在8:00很大,在8:01时刻的概率是很大的,但是00:01时刻对于8:01时刻影响不是很大。

首先,我们可以使用最近时间窗口(T)内的数据遵循某种趋势的现象来做文章。比如我们将T设置为60,则我们取检测值(now_value)和过去60个(记为i)点进行比较,如果大于阈值我们将count加1,如果count超过我们设置的count_num,则认为该点是异常点。

在这里插入图片描述

上面的公式涉及到threshold和count_num两个参数,threshold如何获取我们将在下节进行介绍,而count_num可以根据的需求进行设置,比如对异常敏感,可以设置count_num小一些,而如果对异常不敏感,可以将count_num设置的大一些,AI检测算法中的count_num设置为57,通过参数counter_thld(百分比)来控制。

动态阈值

业界关于动态阈值设置的方法有很多,今天介绍一种针对时间序列类异常检测的阈值设置方法。通常阈值设置方法会参考过去一段时间内的均值、最大值以及最小值,我们也同样应用此方法。取过去一段时间(比如T窗口算法设置为60min)的平均值、最大值以及最小值,然后取max-avg和avg-min的最小值。之所以取最小值的原因是让筛选条件设置的宽松一些,让更多的值通过此条件,减少一些漏报的事件。AI检测算法中为了降低误报率选择是max方法。

在这里插入图片描述

2、 长期环比(LS)

上面短期环比参考的是短期内的数据,而仅仅有短期内的数据是不够的,我们还需要参考更长时间内数据的总体走势。

通常使用一条曲线对该趋势进行拟合来反应曲线的走势,如果新的数据打破了这种趋势,使曲线变得不平滑,则该点就出现了异常。曲线拟合的方法有很多,比如回归、moving average 等等。在本文中,我们使用 EWMA,即指数权重移动平均方法来拟合曲线。在 EWMA 中,下一点的平均值是由上一点的平均值,加上当前点的实际值修正而来。对于每一个 EWMA 值,每个数据的权重是不一样的,最近的数据将拥有越高的权重。

有了平均值之后,我们就可以使用 3-sigma 理论来判断新的 input 是否超过了容忍范围。比较实际值是否超出了这个范围就可以知道是否可以告警了。

3、同比(chain)

很多监控项都具有一定的周期性,其中以一天为周期的情况比较常见,比如进水量在早上0点最低,而在晚上7点最高。为了将监控项的周期性考虑进去,我们选取了某个监控项过去7天的数据。对于某个时刻,将得到7个点可以作为参考值,我们记为xi,其中i=1,…,7。

我们先考虑静态阈值的方法来判断input是否异常(突增和突减)。如果input比过去7天同一时刻的最小值乘以一个阈值还小,就会认为该输入为异常点(突减);而如果input比过去7天同一时刻的最大值乘以一个阈值还大,就会认为该输入为异常点(突增)。

注:本方案针对污水处理变量指标的异常分析,指标变量的周期性明显为一周,此外,因为数据传输过程以及传感器收集数据都需要时间,会存在一定的时间延迟,因此,具体实施时取7天内每天同一小时内的最值代替这一时刻的值。

4、同比振幅(CA)

同比的方法遇到这样的现象就不能检测出异常。比如今天是10月1日【节假日】,假设过去14天的历史曲线比今天的曲线低很多。那么今天设备出了一个小故障,曲线下跌了,相对于过去14天的曲线仍然是高很多的。这样的故障使用以上方法就检测不出来,那么我们将如何改进我们的方法呢?一个直觉的说法是,两个曲线虽然不一样高,但是“长得差不多”。那么怎么利用这种“长得差不多”呢?那就是振幅了。

怎么计算t时刻的振幅呢? 我们使用x(t) – x(t-1) 再除以 x(t-1)来表示振幅。举个例子,例如t时刻的进水量为900,t-1时刻的是1000,那么可以计算出进水量下降了10%。如果参考过去14天的数据,我们会得到14个振幅值。使用14个振幅的绝对值作为标准,如果m时刻的振幅([m(t) – m(t-1)]/m(t-1))大于amplitudethreshold并且m时刻的振幅大于0,则我们认为该时刻发生突增,而如果m时刻的振幅大于amplitudethreshold并且m时刻的振幅小于0,则认为该时刻发生突减。

在这里插入图片描述

算法接口说明

一套实用的时间序列数据异常检测算法

算法封装为类AIDetector(),通过创建对象,调用方法run()进行异常诊断,具体参数如下:

timeseries:输入数据,格式为pandas的Series格式,数据长度必须大于一周数据。

short_term:用于短期环比的时间窗口,默认为60min

counter_thld:短期环比识别阈值,古玩论坛百分比格式,即当前值大于(小于)短期时间窗口内数值的百分比,默认为95%

threshold_method:动态阈值的取值方式,默认为max

long_time:长期环比的时间窗口,默认为一周

max_thld:同比突增的判断阈值,默认为2

min_thld:同比突降的判断阈值,默认为0.1

score:集成算法的投票阈值,默认为2.

### 关于时序数据异常检测算法的毕业设计实现方案 #### 一、选题背景与意义 随着信息技术的发展,时间序列数据分析成为众多行业的重要需求之一。在国内,对于时间序列数据的异常检测和预测研究已取得显著成果[^1]。这不仅有助于提升各行业的运营效率和服务质量,也为学术界提供了丰富的研究素材。 #### 二、理论基础和技术路线 - **数据预处理** - 时间序列往往存在周期性和趋势性,在正式分析之前需对其进行平稳化转换以及去除噪声干扰等操作,确保后续工作的准确性。 - **特征工程** - 提取能够反映时间序列特性的指标作为输入变量,比如通过计算滑动窗口内的均值变化率或是运用自回归积分移动平均模型(ARIMA)捕捉长期依赖关系。 - **方法论探讨** - 探索多种类型的异常检测策略,包括但不限于基于统计学原理构建的概率密度估计框架;采用K最近邻(KNN)或孤立森林(Isolation Forest)这样的无监督学习机制来进行离群点甄别;借助循环神经网络(RNN)/长短时记忆单元(LSTM)模拟复杂的动态过程并据此判断是否存在偏离常态的现象发生。 #### 三、具体实施方案概述 ```python import numpy as np from sklearn.ensemble import IsolationForest from statsmodels.tsa.arima.model import ARIMA def preprocess_data(time_series): """ 对时间序列做必要的前处理 """ # 平稳化 & 去噪逻辑... pass def extract_features(preprocessed_ts): """ 计算所需特征向量 """ features = [] for i in range(len(preprocessed_ts)-window_size+1): window_slice = preprocessed_ts[i:i+window_size] feature_vector = compute_feature(window_slice) features.append(feature_vector) return np.array(features) def detect_anomalies_with_isoforest(X_train, X_test): clf = IsolationForest(contamination=0.05).fit(X_train) predictions = clf.predict(X_test) anomalies_indices = np.where(predictions==-1)[0] return anomalies_indices time_series = load_time_series() # 加载待分析的时间序列数据集 preprocessed_ts = preprocess_data(time_series) features_matrix = extract_features(preprocessed_ts) # 利用训练好的Isolation Forest模型发现潜在异常位置 anomalous_points = detect_anomalies_with_isoforest( *split_dataset_into_train_and_validation_sets(features_matrix)) print(f"Detected {len(anomalous_points)} anomalous points at indices:", anomalous_points.tolist()) ``` 上述代码片段展示了如何利用Python编程语言配合Scikit-Learn库中的`IsolationForest`类完成一次简单的时间序列异常探测任务。当然还可以考虑引入更先进的深度学习组件如TensorFlow/Keras来搭建LSTM结构用于更加精准地刻画非线性演变规律下的突变情况。 #### 四、预期目标及创新之处 本课题旨在综合现有研究成果之上进一步优化传统手段难以克服的问题——即当面对高度复杂且多变的实际应用场景时仍能保持较高的检出精度与较低误报概率。同时鼓励尝试跨学科融合思路开拓新的解决路径,例如结合领域专业知识定制专属评估体系衡量不同算法间的优劣差异。 #### 五、总结与展望 通过对国内外前沿进展的学习借鉴加上个人实践探索,期望最终形成一套具备一定通用价值的技术解决方案服务于更多有需要的人士群体当中去。未来工作可以着眼于深入理解各类因素对整体性能的影响程度进而指导参数调优流程;另外就是不断积累真实世界里的典型案例充实到教学资源里边供后来者参考学习之便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值