基于LSTM自编码器的多元时间序列异常检测阈值选取问题
LSTM自编码器时间序列异常检测的阈值选择方案
两种方案的适用边界
不存在绝对最优的阈值方案,选型完全匹配你的数据特征和业务需求:
- 单特征独立阈值
适用场景:各特征物理含义独立、波动范围差异大,需要定位异常所属特征
实现逻辑:在全正常的训练集上,计算每个特征的重建误差序列,取95/99分位数或均值+3倍标准差作为对应特征的专属阈值。测试阶段任意特征的重建误差超过对应阈值,即判定当前时间窗口为异常。 - 全局统一阈值
适用场景:多特征间存在强相关性,仅需要判定窗口是否异常无需根因定位
实现逻辑:在全正常的训练集上,先将每个窗口所有特征的重建误差做聚合(求和、平均、取最大值均可),再基于聚合后的误差序列计算分位数或3σ作为全局阈值。测试阶段先聚合当前窗口的重建误差,超过阈值即判定为异常。
工业界通用折中方案
如果无法确定选型,直接采用组合判定逻辑:测试窗口只要满足「任意单特征误差超过对应阈值」或「全局聚合误差超过全局阈值」任意一条,就判定为异常,可同时降低漏报率和误报率。
阈值计算伪代码示例
import numpy as np # y_train: 训练集正常样本输入,shape=(samples, window_size, features) # recon_train: 模型对训练集的重建输出,shape和y_train一致 recon_err = np.square(y_train - recon_train) # 对时间窗口维度求平均,得到每个样本各特征的平均重建误差 sample_feature_err = np.mean(recon_err, axis=1) # shape=(samples, features) # 计算单特征阈值(取99分位数) feature_thresholds = np.percentile(sample_feature_err, 99, axis=0) # shape=(features,) # 计算全局阈值(先对特征维度求和再取99分位数) global_err = np.sum(sample_feature_err, axis=1) # shape=(samples,) global_threshold = np.percentile(global_err, 99)
内容的提问来源于stack exchange,提问作者Alessio Siciliano
相关产品推荐
相关产品推荐

