网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

时间序列数据随处可见:网站每分钟的访问量、传感器读数、股票价格、人流计数、服务器 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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
死了白死?俄方绝口不提贝加尔湖惨剧赔偿 中日美此类案例都有赔款

死了白死?俄方绝口不提贝加尔湖惨剧赔偿 中日美此类案例都有赔款

劲爆体坛
2026-02-28 18:30:13
中国男篮vs中国台北时间已定!CCTV5直播,省队球员赛前放出狠话

中国男篮vs中国台北时间已定!CCTV5直播,省队球员赛前放出狠话

篮球专区
2026-02-28 20:36:42
杉杉集团破产,事实证明:美女主持人只会排节目,对管理无能为力

杉杉集团破产,事实证明:美女主持人只会排节目,对管理无能为力

晨光苏醒a
2026-02-27 06:33:24
1秒3亿、单日突破10亿!老铺黄金创下天猫大促最快销售纪录

1秒3亿、单日突破10亿!老铺黄金创下天猫大促最快销售纪录

财闻
2026-02-27 15:05:28
重庆高速公路集团,穆军任上被查,曾任两江新区最大国企董事长

重庆高速公路集团,穆军任上被查,曾任两江新区最大国企董事长

新浪财经
2026-02-28 20:20:04
美伊开战,却被中国卫星盯死!“天眼”24小时扫描,美军零秘密

美伊开战,却被中国卫星盯死!“天眼”24小时扫描,美军零秘密

书纪文谭
2026-02-28 19:28:21
大S一对子女去医院探望马筱梅,11岁玥儿抱小弟弟的画面好温馨!

大S一对子女去医院探望马筱梅,11岁玥儿抱小弟弟的画面好温馨!

娱乐团长
2026-02-27 12:27:55
美军上尉回忆:志愿军冲入阵地后,拿刺刀捅死看到的每一个美国兵

美军上尉回忆:志愿军冲入阵地后,拿刺刀捅死看到的每一个美国兵

阿器谈史
2026-02-26 17:42:09
太扎心!过了40岁已经死了,只是没人埋,80后发千字肺腑之言…

太扎心!过了40岁已经死了,只是没人埋,80后发千字肺腑之言…

慧翔百科
2026-02-28 08:52:23
美国以色列偷袭伊朗,意图斩首哈梅内伊!

美国以色列偷袭伊朗,意图斩首哈梅内伊!

胜研集
2026-02-28 15:36:36
新加坡大满贯赛:大捷报!林昀儒4:1淘汰世界亚军,晋级男单4强

新加坡大满贯赛:大捷报!林昀儒4:1淘汰世界亚军,晋级男单4强

国乒二三事
2026-02-28 19:55:46
吃兰州拉面的人为什么越来越少了?网友:进店小心翼翼的怕说错话

吃兰州拉面的人为什么越来越少了?网友:进店小心翼翼的怕说错话

另子维爱读史
2026-02-27 20:31:34
忍无可忍无需再忍!台海发生激烈对峙中方出动军机澳舰狼狈窜逃

忍无可忍无需再忍!台海发生激烈对峙中方出动军机澳舰狼狈窜逃

通鉴史智
2026-02-28 09:38:48
澳门的赌台,大面积关停!不是没人去,而是被“算法”割废的?

澳门的赌台,大面积关停!不是没人去,而是被“算法”割废的?

水泥土的搞笑
2026-02-27 17:09:36
卡塔尔受导弹攻击,暂时关闭领空!卡塔尔航空暂停全部航班,飞机纷纷返航备降!去年一幕要重演了

卡塔尔受导弹攻击,暂时关闭领空!卡塔尔航空暂停全部航班,飞机纷纷返航备降!去年一幕要重演了

新浪财经
2026-02-28 19:11:54
新加坡大满贯赛:太遗憾!世界冠军陈幸同0:4被淘汰,无缘女单4强

新加坡大满贯赛:太遗憾!世界冠军陈幸同0:4被淘汰,无缘女单4强

国乒二三事
2026-02-28 18:52:21
以色列已经告诉世界:日本若敢拥有核武器,美国并不会第一个翻脸

以色列已经告诉世界:日本若敢拥有核武器,美国并不会第一个翻脸

八斗小先生
2025-12-26 09:33:27
伊朗军队最高指挥官被击毙

伊朗军队最高指挥官被击毙

桂系007
2026-02-28 18:25:45
小米上架米家燃气灶3猛火版,到手价899元

小米上架米家燃气灶3猛火版,到手价899元

ZAEKE知客
2026-02-27 12:41:13
水利部长傅作义无实际职权,副部长代替签字,周总理:一律无效

水利部长傅作义无实际职权,副部长代替签字,周总理:一律无效

兴趣知识
2026-02-27 22:03:38
2026-02-28 22:24:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1934文章数 1456关注度
往期回顾 全部

科技要闻

狂揽1100亿美元!OpenAI再创融资神话

头条要闻

87岁哈梅内伊对拉里贾尼委以重任 还建立完整继承体系

头条要闻

87岁哈梅内伊对拉里贾尼委以重任 还建立完整继承体系

体育要闻

球队主力全报销?顶风摆烂演都不演了

娱乐要闻

疑似王一博被爆私密聊天记录

财经要闻

沈明高提共富建议 百姓持科技股国家兜底

汽车要闻

岚图泰山黑武士版3月上市 搭载华为四激光智驾方案

态度原创

教育
数码
旅游
公开课
军事航空

教育要闻

要调剂的老师来!!!

数码要闻

Pulsar推出X2N CrazyLight轻量化鼠标,收腰高背对称抓握模具

旅游要闻

文旅新探|灯火满神都,千年上元潮

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

美国以色列联合袭击伊朗 实时战况

无障碍浏览 进入关怀版