新闻详情

新闻详情

首页 / 资讯中心 / 详情

多变量时间序列异常检测数据集与可运行Baseline实战指南

发布时间:2026/9/20 14:07:39来源:尧图网络
多变量时间序列异常检测数据集与可运行Baseline实战指南
简介面向多变量时间序列异常检测研究者的资源包整合SMD、SMAP/MSL、SWaT与WADI四类公开数据集及配套标准化处理代码解决从数据下载、时间格式统一到异常标签生成的预处理难题。其中SMD来自服务器机器SMAP/MSL来自航天器遥测SWaT与WADI分别覆盖水处理系统和配水网络为工业故障检测、航天监控、水利安全等场景提供了跨领域基准数据。压缩包共10个文件约30MB包含CSV原始/处理后数据、TXT说明文件、Python处理脚本、HTML报告页面及运行配置文件目录结构清晰便于按数据集快速定位。已有502人学习/下载适合数据分析、算法研究人员和具备基础Python能力的开发者使用。资源特别提供Python数据处理脚本与依赖清单可一键完成MSL、SMAP、SMD、WADI、SWaT数据集的读取、解析与标签处理并附处理结果摘要和可视化报告页面帮助使用者核对预处理效果直接投入模型训练与异常检测实验。 我第一次做多变量时间序列异常检测的时候光是在“数据集选哪个”这件事上就耗了将近一周。网上能搜到的数据集名字不少但每个的格式、标签方式、异常类型都不一样有的要填表申请有的下载回来是一堆没有任何说明的npy文件。真正跑通一个能用的baseline比想象中费劲得多。所以这篇就把我实际整理过的多变量时间序列异常检测数据集和可直接运行的源码经验写出来覆盖选型思路、数据格式、预处理、可运行baseline和几个容易被忽略的坑给准备入门的同学和需要快速选型的工程师做个参考。1. 选数据集前先想清楚你的异常长什么样很多人选数据集只看“哪个名气大、哪个论文用得多”但我建议先反过来想一个问题你要检测的异常到底是什么形态1.1 异常形态决定评测粒度多变量时间序列里的“异常”其实分好几类不同数据集的异常形态差异非常大选错了会导致后续评估方式完全对不上。第一种是点异常指某个时间点上的单个样本值明显偏离正常范围。比如MSL、SMAP这类航天器遥测数据里某个传感器突然跳变然后恢复训练集里没有这种模式。这类异常适合做逐点评估模型只需要判断“这个时间点是不是异常”。第二种是子序列异常指一段时间内的连续行为异常。SWaT、WADI这类物理系统数据集大多属于这一类攻击者篡改阀门或传感器后异常会持续几十秒甚至几分钟不是单点跳变。对这类异常做逐点评估会非常刻薄因为窗口边界错一个点就算误判所以很多论文会引入我们后面会讲的“点调整”策略。第三种是相关异常也就是单通道数值看起来都正常但通道之间的联合分布被破坏了。比如两个传感器在正常工况下有明显的比例关系突然这个联动关系消失了。这类异常是多变量模型的甜区也是单变量模型识别不了的场景。我见过不少新手拿着单变量检测器硬跑这类数据效果奇差还以为是模型不行其实是问题本身就超出了模型能力。1.2 按场景锁定数据集想清楚异常形态后选数据集就简单了快速验证算法、做学术迭代首选Tsinghua、SMD、PSM这类公开可下载、切分固定的数据不用等流程能立刻跑起来。验证工业物理系统场景选SWaT、WADI它们有真实的物理攻击过程异常有明确的因果关系缺点是申请流程需要时间。研究航天遥测点异常MSL、SMAP是标准答案维度低、规模小很快就能跑完一轮实验。我个人的建议是不要一上来就追求“最复杂、最工业”的数据集。先把一个公开数据集的预处理和评估流程跑通再换更复杂的场景效率会高很多。2. 主流数据集的“性格差异”从SWaT到Tsinghua把数据集列成一张表很多事情会瞬间清晰。数据集来源环境维度常见切分异常形态获取门槛SWaT水处理试验台51训练约49.5万/测试约44.9万传感器/执行器攻击子序列异常iTrust官网申请WADI水分配系统123训练约78.4万/测试约17.3万泄漏等物理故障子序列异常iTrust官网申请MSL火星科学实验室55训练约5.8万/测试约7.4万遥测点异常为主NASA公开/GitHubSMAP土壤水分卫星25训练约1.4万/测试约4.3万遥测点异常为主NASA公开/GitHubSMD服务器集群监控38×28个实体前28天训练/后14天测试真实运维异常混合形态GitHub公开PSMeBay线上服务26训练约13.2万/测试约14.2万运维异常信号较干净GitHub公开Tsinghua互联网业务KPI单变量KPI×多个序列按时间连续切分真实业务异常人工标注GitHub公开2.1 每个数据集值得注意的细节SWaT的训练集全部是正常数据测试集里混有攻击数据标签列常见的命名是“Normal/Attack”但不同渠道下载的版本列名可能不一样读取时需要先看一眼列名。它的攻击是分阶段注入的异常占比约在一成以上比较适合评估“能否在持续异常中快速报警”。WADI的维度高达123列最容易踩坑的是CSV里可能有特殊字符、空格和编码问题直接pd.read_csv可能会出现一堆列名错乱。另外WADI的异常占比明显低于SWaT正负样本不平衡更严重随手用accuracy评估会得到虚高的漂亮数字基本没有参考价值。MSL和SMAP下载回来通常是npy或pickle格式自带多个实体ID。它们经常被当作“多实体多变量”数据使用但单实体维度不高。因为是以点异常为主很多深度模型在这里其实发挥不出时序优势倒是适合做快速基线验证。SMD是28个服务器实体的监控数据每个实体38个指标训练和测试按天切分。它的价值在于多实体结构更接近真实运维场景但代价是你需要决定是逐实体训练还是做联合建模。PSM是eBay开源的线上服务监控指标26维异常标注做得比较干净分布相对稳定是我个人觉得最适合新手练手的数据集之一。Tsinghua数据集严格说是单变量KPI集合但因为包含大量实体、有明确时间连续性经常被用来做多实体时间序列异常检测的baseline。如果你关注KPI异常检测方向这个数据集基本绕不开。2.2 数据量级与计算成本的匹配很多教程不会提醒你数据集规模对算力的影响。SMD要训练28个实体如果每个实体都上Transformer单卡可能得跑很久而ECOD、Isolation Forest这类轻量模型五分钟就能全跑完。SWaT和WADI的数据量中等GNN或Transformer还能接受但做消融实验时多跑几组也会很费时间。我的经验是初期先用轻量模型把整套流程走通确认代码、评估、可视化都没问题再上重模型省下的都是真金白银的时间。3. 别让数据格式卡住你统一加载与预处理方案数据集下载回来后第一道坎不是模型而是格式。SWaT是CSVMSL/SMAP是npy或pickleSMD是文本文件Tsinghua是一个zip包里面放一堆CSV。如果为每个数据集单独写一套加载逻辑光这一点就很劝退。3.1 SWaT这类CSV的读取坑SWaT的CSV通常有表头第一列是时间戳后面是传感器和执行器数值最后一列是标签。但不同渠道的标签列名不一样可能是“Normal/Attack”也可能是“Label”或“attack”。我建议写一个统一的加载函数先打印出列名看一眼再处理。import pandas as pd def load_swat(train_path, test_path, label_path): train pd.read_csv(train_path) test pd.read_csv(test_path) labels pd.read_csv(label_path) # 这里假设标签列名是 Normal/Attack实际以你下载到的版本为准 train train.drop(columns[Timestamp]) test test.drop(columns[Timestamp]) label_column [c for c in labels.columns if attack in c.lower() or normal in c.lower()] if label_column: y_test labels[label_column[0]].map({Normal: 0, Attack: 1}).values else: y_test labels.iloc[:, -1].values return train.values, test.values, y_testCSV里偶尔会有空值SWaT某些通道在攻击阶段会有NaN。不要直接dropna因为时间序列的行顺序是有含义的删除某一行会破坏连续性和标签对齐。更好的做法是先用前向填充再少量插值。3.2 标准化与数据泄露这是新手最容易踩死的一个坑。很多人习惯把训练集和测试集拼到一起做标准化这属于严重的数据泄露会让测试指标虚高。from sklearn.preprocessing import StandardScaler # 错误示范把train和test放一起fit # data np.concatenate([train, test], axis0) # scaler StandardScaler().fit(data) # 正确做法只用训练数据fit scaler StandardScaler() train scaler.fit_transform(train) test scaler.transform(test)标准化只允许在训练集上估计均值和方差测试集用同一套参数做变换。数据泄露在异常检测里尤其隐蔽因为测试集里本身包含异常点如果这些异常点参与了均值和方差的估计会把异常拉回“正常范围”模型自然看不出来。3.3 滑动窗口切分的正确姿势大多数时序模型需要把原始序列切成固定长度的窗口。简单方式是直接循环切片但数据量大时内存会爆炸。import numpy as np def sliding_window(X, window_size): n len(X) Xs [] for i in range(n - window_size 1): Xs.append(X[i:i window_size]) return np.stack(Xs)如果数据量很大更推荐用PyTorch的Dataset接口在__getitem__里按索引实时取窗口而不是一次性预切分import torch from torch.utils.data import Dataset class SeriesWindowDataset(Dataset): def __init__(self, X, window_size): self.X X self.window_size window_size def __len__(self): return len(self.X) - self.window_size 1 def __getitem__(self, idx): return self.X[idx:idx self.window_size]切窗口时记住一个关键点标签不要乱取一般取窗口最后一个时间点的标签作为整个窗口的标签因为窗口内的历史信息是在为“当前时刻是否异常”服务的。3.4 多实体数据要拆分实体IDSMD、MSL、SMAP这类多实体数据集训练和测试文件里通常包含多个实体。很多人直接整个文件读进来、全局切窗、全局标准化这样做会引入实体间的伪相关属于跨实体的数据混用。标准做法是先按实体ID分组每个实体单独标准化、单独切窗。评估时也一样先算每个实体的指标再取macro平均而不是把所有实体混在一起算。4. 可运行源码盘点官方开源与统一评测框架说实话除了少数分类任务之外大多数异常检测数据集没有官方训练源码。所谓“可运行源码”实际分三类优秀开源项目自带的预处理和模型、统一评测框架、以及你按需组合的最小baseline。4.1 开源项目里已经封装好的数据加载器很多知名异常检测开源项目已经内置了数据集处理逻辑拿过来就能复现论文结果。thuml/Anomaly-Transformer内置了Tsinghua、MSL、SMAP、SMD等数据集的加载与切分逻辑照着README跑一遍就能出结果。OmniAnomaly对SMD的处理非常完整包含数据归一化、窗口化、训练循环和可视化。TranAD也内置了多个数据集的适配器适合用来跑对比实验。我建议你拿到一个新数据集时先去找一个成熟项目看它怎么组织预处理流程比自己摸半天要快得多。很多预处理细节比如标签是0-index还是1-index、测试集有没有重叠窗口、实体ID怎么编码都藏在代码里官方文档反而不写。4.2 最小可运行baselineECOD实战如果你想在自定义数据上快速跑通全链路ECOD经验累积分布函数是目前最省事的无监督方法之一不需要训练标签一管到底。import pandas as pd from pyod.models.ecod import ECOD from pyod.utils.data import evaluate_print # train.csv 全部是正常历史数据 train pd.read_csv(train.csv).values test pd.read_csv(test.csv).values labels pd.read_csv(label.csv).values.ravel() clf ECOD(contamination0.05) clf.fit(train) pred clf.predict(test) evaluate_print(ECOD, labels, pred)这段代码里contamination表示你预先估计的异常比例ECOD会用训练数据的分位数自动确定阈值。整个流程跑通不到一分钟非常适合作为第一个baseline。之后你再换TranAD、Anomaly Transformer这类深度模型就能对比“轻量方法”和“深度方法”的差距到底有多大而不是一头扎进复杂代码里调试。4.3 统一评测框架怎么选如果你不想自己写评估代码有几个现成框架可以用PyOD最通用的异常检测库支持ECOD、IForest、KNN等大量方法接口统一适合快速对比。Tods微软开源偏自动化机器学习的时序异常检测内置了数据处理、特征工程、检测算法全链路。Merlion偏轻量部署自带时序数据集接口和评估工具适合想快速产品化的场景。TimeEval学术评测框架可以把多个算法和多个数据集统一挂进去批量跑实验。这些框架各有侧重但基础思路是一样的数据集通过统一接口加载模型通过统一接口训练和预测减少自己写胶水代码的时间。我的建议是不要每个框架都装先选一个最顺手的用熟其他按需再上。4.4 同一数据集不同切分的结果对比陷阱这是需要特别提醒的一点同一个数据集不同开源项目可能采用完全不同的切分方式结果之间是不能直接对比的。以SWaT为例官方按时间连续切分训练和测试但有些社区复现会随机抽70%数据训练有些会做在线滚动预测还有的会截取某一段攻击最多的区间做测试。同一套算法在这几种切分下F1可能从0.75浮动到0.93差距大得离谱。所以看论文时一定要看它实验部分的“dataset setting”复现时也要确认切分规则和原论文一致。不做这一步你的模型效果“更好”很可能只是切分规则不同造成的假象。5. 跑通之后最容易被忽略的四个细节代码能跑只是第一步我在实际使用中发现下面这四件事决定你的结果是不是真正可信。5.1 点调整PA带来的虚高很多论文在评估时会用点调整策略只要模型预测的某一段和真实异常段有任意重叠就把整个预测段标为正确。好处是贴近“事件是否被命中”的直觉坏处是容易虚高。你的模型可能把一段100个点的异常只预测中了其中1个点PA之后这100个点全算正确F1直接奔着1.0去。这对工业场景是危险的因为实际运维里漏报警和误报警不会因为你“沾了点边”就被原谅。我的建议是评估时同时报两组指标逐点F1和事件级命中率。逐点F1反映模型对异常边界的识别精度事件级命中率反映“有没有抓到这件事”。两个都亮出来模型真实水平一目了然。5.2 窗口尺寸选错异常直接失效窗口大小是所有方法里最微妙也最容易被忽视的参数。窗口太短长漂移异常根本看不出来窗口太长短促点异常会被大量正常历史信息“稀释”掉。我一般这样选先看异常标注的持续时间分布。SWaT攻击通常持续若干秒到几分钟如果传感器是10Hz采样窗口可以取几十到几百个点KPI业务异常通常在1到5分钟内按分钟级采样取5到15个点航天遥测的点异常往往只有一到两个点窗口太多反而帮倒忙。你可以把窗口尺寸当作一个先验知识输入而不是纯超参瞎试。做消融实验时也建议报告不同窗口下的效果很多论文不写这一点但实际上它对结果影响非常大。5.3 阈值只能从训练侧决定无监督异常检测模型输出的往往是异常分数不是概率。分数高不代表“异常概率大”只是“和训练分布偏差大”。这个分数怎么转成0/1标签取决于阈值怎么定。最常见的作弊做法跑完测试集之后用测试集异常分数的95%分位当阈值。这等于提前知道了测试集的信息指标会好看但不真实。正确做法是从训练数据里再切出一段正常的验证集模型训练完成后在验证集上打分取比如95%或99%分位点作为阈值再拿到测试集上预测。阈值一旦定了就不要因为测试集的分数分布往回调整这是确保评估可信的底线。5.4 多实体全局混排会得到伪装的高分SMD和Tsinghua这类多实体数据如果所有实体拼在一起做全局标准化实体之间的水平差异会让模型的异常分数分布严重偏离真实情况。结果往往是分数最高的那批点集中在某些正常实体上真正的异常反而被淹没了。标准流程是每个实体独立标准化、独立切窗、独立预测最后按实体粒度算macro-F1。如果你的模型要联合多个实体学习至少也要加上实体ID作为条件信息让模型知道当前处理的是哪台设备。落地部署时这个细节更重要因为运维关心的是“哪台设备出了问题”不是一个模糊的全局分数。6. 工业界的另一种视角从WM-811K到安检图像的时间序列思维最后一个部分想说说热词里反复出现的WM-811K和X光安检物品检测。这些看起来是图像任务和时序异常检测关系不大但工业场景里很多问题站在时间序列角度看会完全不一样。6.1 WM-811K的“空间快照”与时间展开WM-811K是晶圆制造领域的经典数据集样本是晶圆图被用来做缺陷分类和异常检测。它看起来是二值图像分类问题但晶圆制造过程中腔室温度、压力、气流速率等状态变量都是连续记录的多变量时间序列。一块晶圆出现缺陷往往是某些工艺参数在某个阶段发生异常累积的结果。如果你已经会做多变量时间序列异常检测完全可以把WM-811K当作下游验证场景用工艺参数时间序列预测晶圆良率缺陷而不是只对着缺陷图做空间分类。这也是工业AI落地中很常见的思路把问题从“事后找图”变成“事前告警”。6.2 安检图像连续帧背后的序列异常网上有人搜“X光安检物品检测数据集 vocyolo”他们真正想解决的是传送带上的物品识别。但X光安检的视频流天然带时间维度物品在传送带上运动、遮挡、分离异常物品往往不是在某一帧突然出现而是多帧连续观察中才暴露特征的。这和时序异常检测的“状态转移”理念是相通的。只看单帧图像重物遮挡、角度变化都可能误判连续多帧联合判断能把“这是一个完整物体”和“这里有不该出现的东西”区分得更好。所以我建议做图像异常检测的工程师也值得学一点多变量时间序列思维它提供的不是另一种算法而是另一种看问题的视角。6.3 工业落地的三件烦心事最后说点实在的。工业异常检测落地跟刷benchmark完全是两码事。标签稀缺是最普遍的痛点时间序列异常的人工标注成本极高很多工厂连“哪些时间点出了问题”都说不清。类别不平衡也很要命异常占比经常不到百分之一模型很容易学成“永远报正常”。概念漂移就更麻烦了设备老化、工艺调整、季节变化都会让数据分布缓慢移动今天好用的模型三个月后可能就是废的。我个人现在的选择是在算法研究之外一定要给自己留一条在线监控和定期重训的路径。模型跑在真实系统里不是训完就完事而是要能回放历史数据、查看误报漏报、定期加入新样本迭代。如果让我从零开始做这个方向流程会短很多先用Tsinghua或SMD把全链路跑通再用SWaT/WADI验证物理系统异常场景最后才碰大规模多实体模型和跨模态工业数据。这个顺序能帮你避开我当年踩过的那些坑。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CC Switch 里 TaoToken 档:Claude Code 与 Codex 切 GLM 5.3 Flash 2026/9/20 15:01:54

CC Switch 里 TaoToken 档:Claude Code 与 Codex 切 GLM 5.3 Flash

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
全流程端到端交付管理:从合同到回款的项目闭环实战指南 2026/9/20 15:01:54

全流程端到端交付管理:从合同到回款的项目闭环实战指南

简介:《华为的全流程端到端交付管理》以客户需求为导向,系统梳理了企业必须回答的5个核心问题:产品稳定性、核心技术领先、成本具有竞争力、客户投资保护以及及时有效的售后服务,并结合华为1997年引入IBM诊断、经过八年探索实践的…

阅读更多 →
1000MW凝汽式机组全厂原则性热力系统设计全解析 2026/9/20 15:01:54

1000MW凝汽式机组全厂原则性热力系统设计全解析

简介:这份课程设计围绕1000MW凝汽式发电机组全厂原则性热力系统展开,适合能源与动力工程、热能与动力工程专业学生及电厂设计入门者参考。方案以N1000-26.25/600/600型超超临界汽轮机、HG2953/27.46YM1型直流锅炉为对象,详细给出了八级回热抽…

阅读更多 →
Matlab实现法诺共振拟合与Q因子计算 2026/9/20 15:01:54

Matlab实现法诺共振拟合与Q因子计算

1. 法诺共振现象与微观世界探测法诺共振(Fano resonance)是量子系统中一种特殊的干涉现象,表现为非对称的线型谱线特征。这种独特的共振模式最早由意大利物理学家Ugo Fano在1961年提出,用来解释原子光谱中的非对称峰。与常见的洛伦…

阅读更多 →
高中数学知识点全总结:八大板块知识框架与复习文档制作指南 2026/9/20 15:01:54

高中数学知识点全总结:八大板块知识框架与复习文档制作指南

简介:这是一份面向高中生与高考复习者的数学知识点系统梳理文档,将高中数学九大章节的核心考点按模块归类,涵盖函数与导数、三角函数与平面向量、数列、立体几何、概率统计、解析几何、参数方程等,并配有学习策略与易错点提醒&…

阅读更多 →
通达信VOL量价监测公式:一眼识别主力吸筹与出货 2026/9/20 14:58:53

通达信VOL量价监测公式:一眼识别主力吸筹与出货

以前盯盘的时候,我也跟很多人一样,扫一眼成交量柱子高低就完事。红柱高就是放量上涨,绿柱高就是放量下跌,这种看法不能说完全没用,但放到真正的主力资金面前,基本等于只看表情不看动作——表情可以演&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞