时间序列异常检测的5种方法:从统计阈值到深度学习

简介: 时间序列异常检测旨在识别偏离正常规律的数据点,如凌晨流量突增、传感器骤降等。因数据含趋势、季节性与噪声,需结合统计法(Z-Score)、移动平均、季节分解、Isolation Forest或自编码器等方法,多策略融合可有效降低误报。

时间序列数据随处可见:网站每分钟的访问量、传感器读数、股票价格、人流计数、服务器 CPU 使用率,都是典型场景。

多数时候这类数据遵循某种规律。异常检测的目标就是找到规律被打破的那些时刻。

什么是时间序列数据中的异常?

异常指的是与正常行为产生明显偏离的数据点或数据序列。举几个例子:凌晨 3 点网站流量突然飙升;传感器因设备故障出现读数骤降;已关门的商店内人流量异常激增。

为什么时间序列异常检测很困难

时间序列数据天然包含趋势(缓慢的上升或下降)、季节性(日级或周级的周期模式)以及噪声(随机波动)。这三个成分叠加在一起,让"正常"本身就在不断变化。

一个值的高低本身不构成异常,它是否异常取决于出现的时间点。中午有 1000 个访客是正常的,凌晨 3 点有 1000 个访客就不正常了。

学习"正常"的样子

在检测异常之前,系统需要先建立对正常行为的认知——预期的数值范围、长期趋势走向以及重复出现的季节性模式。

不同的数据特征对应不同的检测策略。

方法 1:统计阈值法(Z-Score)

最简单的做法,假设数据服从正态分布。

 import numpy as np  

def z_score_anomaly(data, threshold=3):  
    mean = np.mean(data)  
    std = np.std(data)  
    z_scores = (data - mean) / std  
    anomalies = np.abs(z_scores) > threshold  
     return anomalies

适用场景:没有趋势的平稳数据。

方法 2:移动平均 + 残差

适用于带有平滑趋势的数据。

 import pandas as pd  

def moving_average_anomaly(series, window=10, threshold=2):  
    rolling_mean = series.rolling(window).mean()  
    residual = series - rolling_mean  
    std = residual.std()  

     return abs(residual) > threshold * std

它的优势在于,每个数据点比较的是自身的局部上下文而非全局均值。

方法 3:季节性分解

周期性模式明显的数据最适合用这个方法。

 from statsmodels.tsa.seasonal import seasonal_decompose  

 def seasonal_anomaly(series, period=24):  
     result = seasonal_decompose(series, model='additive', period=period)  
     residual = result.resid  
     threshold = 3 * residual.std()  
     return abs(residual) > threshold

季节性分解把原始序列拆成趋势、季节性和残差三个分量,异常通常藏在残差里。

方法 4:机器学习(Isolation Forest)

不依赖任何分布假设,直接隔离罕见模式。

 from sklearn.ensemble import IsolationForest  

 def isolation_forest_anomaly(data, contamination=0.02):  
     model = IsolationForest(contamination=contamination)  
     preds = model.fit_predict(data.reshape(-1, 1))  
     return preds == -1

适用场景:模式未知、数据不规则,或者多变量时间序列。

方法 5:深度学习(自编码器)

自编码器学习重建正常序列,重建误差高的部分即为异常。

 import numpy as np  

 def reconstruction_error(original, reconstructed):  
     return np.mean((original - reconstructed) ** 2)

适合处理模式复杂、维度较多、存在长期依赖关系的时间序列。

示例:人流量分析

 import pandas as pd  
import numpy as np  
from statsmodels.tsa.seasonal import seasonal_decompose  

# 生成商店人流量数据(1 周,每小时)  
hours = pd.date_range('2024-01-01', periods=24*7, freq='H')  
hour_of_day = hours.hour  

# 正常:上午 9 点到晚上 9 点繁忙,夜间安静  
base = 100 + 80 * ((hour_of_day >= 9) & (hour_of_day <= 21))  
traffic = pd.Series(base + np.random.normal(0, 10, len(hours)), index=hours)  

# 注入异常  
traffic.iloc[15] = 200   # 凌晨 3 点飙升(摄像头问题)  
traffic.iloc[75] = 5     # 营业时间下降(故障)  

# 检测  
result = seasonal_decompose(traffic, model='additive', period=24)  
residual = result.resid  
anomalies = abs(residual) > 3 * residual.std()  

 print(f"Detected {anomalies.sum()} anomalies")

减少误报

误报是异常检测在生产环境中最常见的痛点。三种思路可以缓解。

调整灵敏度:控制标记比例:

 model = IsolationForest(contamination=0.02)  # 仅标记 2%

要求持续性:只有连续多个点都表现异常时才触发告警:

 # 仅当异常持续 3 个及以上连续点时才标记  
 consecutive_count >= 3

集成投票:多种方法同时判断,取多数一致的结果:

 # 投票:如果 2 个及以上方法一致则标记  
 votes = method1 + method2 + method3  
 anomalies = votes >= 2

总结

异常检测的核心不在于找出"奇怪的数字",而在于理解每个时间点上什么才算正常。先对数据做可视化探索,从移动平均或季节性分解入手;如果数据模式复杂,引入 Isolation Forest;生产系统中建议组合多种方法以降低误判。

异常检测要做的,是识别那些偏离了时间、趋势和行为规律的数据点。

https://avoid.overfit.cn/post/a6de4ac94dd64768a768593e39b6c7cb

by Bhargavi Guddati

目录
相关文章
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1316 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
1月前
|
机器学习/深度学习 自然语言处理 供应链
大模型应用:销量预测升级:Qwen大模型让时序分析从算数值到给建议.82
本文提出“会说话的时序分析系统”,融合ARIMA、Prophet等专业预测算法与大模型,实现从冰冷数值到自然语言洞察的跃迁:算法精准算未来,大模型解读原因、生成可落地建议,让时序数据真正成为懂业务、会决策的智能助手。
426 3
|
3月前
|
数据库 Python
15 分钟用 FastMCP 搭建你的第一个 MCP Server(附完整代码)
Model Context Protocol(MCP)是一个轻量开放标准,让LLM能统一、可靠地调用外部工具。无需手写解析逻辑或维护胶水代码。核心仅三概念:Server(暴露工具)、Tool(带装饰器的函数)、Client(调用方)。FastMCP框架15分钟即可上手,支持stdio快速测试、HTTP生产部署,真正实现“写一次,随处调用”。
789 5
15 分钟用 FastMCP 搭建你的第一个 MCP Server(附完整代码)
|
5月前
|
人工智能 自然语言处理 安全
Lux 上手指南:让 AI 直接操作你的电脑
Lux 是一款能直接操作计算机的AI基础模型,通过视觉理解与动作预测,实现自然语言指令下的自动化任务。它无需依赖API,可像真人一样点击、输入、滚动,完成浏览器操作等复杂工作,准确率超越主流模型,是迈向“意图即执行”的重要突破。(238字)
1626 13
Lux 上手指南:让 AI 直接操作你的电脑
|
7月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
586 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
机器学习/深度学习 运维 自然语言处理
大模型也能当“运维警察”?——大模型技术在异常检测中的应用
大模型也能当“运维警察”?——大模型技术在异常检测中的应用
2285 13
|
11月前
|
机器学习/深度学习 运维 算法
基于LSTM自编码器与KMeans聚类的时间序列无监督异常检测方法
本文提出的基于LSTM自编码器和KMeans聚类的组合方法,通过整合深度学习的序列建模能力与无监督聚类的模式分组优势,实现了对时间序列数据中异常模式的有效检测,且无需依赖标注的异常样本进行监督学习。
495 0
|
机器学习/深度学习 人工智能 运维
日志别只会“看”,现在是该让AI帮你“算”了!
日志别只会“看”,现在是该让AI帮你“算”了!
1239 9