做故障诊断方向的研究或者工业项目最常听到的抱怨不是算法跑不通而是“数据呢”。找开源数据集像考古有的藏在高校官网的偏僻目录里得照着论文列表一个个点有的是某次竞赛结束就没人维护链接已经404就算下载下来采样率、故障类型、标签含义都各说各话。所以看到“三十多个开源数据集”这样的整理我特别有感同时知道光有链接不够——怎么选、怎么读、怎么避免训练集测试集切错才是真正省时间的地方。这篇文章把故障诊断常用开源数据集的来源、分类、选型与实际跑通的办法一次说清适合刚入门的学生、做横向课题的工程师还有想用公开数据验证新算法的研究人员。1. 故障诊断开源数据集的三大来源方向先说一个基本判断故障诊断领域能公开拿到、还不是玩具级的数据基本就三个方向——高校实验台采集、国际竞赛发布、机构仿真与公开研究项目。理解这三个来源比单纯收藏几十个链接更有用因为不同来源决定了数据的标签质量、文件格式和可复现性。1.1 高校实验台数据真实信号与明确的故障标签高校实验台是大多数人入门的首选。最有代表性的就是CWRU也就是美国凯斯西储大学轴承数据中心那套数据。它把电机驱动端和风扇端的滚动轴承故障通过电火花加工出来故障类型覆盖内圈、外圈、滚动体损伤尺寸分好几档负载从0到3马力变化采样频率有12k和48k两档。很多故障诊断论文里的“标准实验”就是在CWRU上做的类间区分度清晰用最基础的时域特征也能跑出不错的结果。但CWRU有个问题故障是人工预制的和实际设备里自然磨损出来的故障形态有差距。这也是后来德国帕德博恩大学PU数据集受欢迎的原因——它同时包含人工损伤和真实损伤两类样本更贴近“现场感”。国内的代表作是西安交大的XJTU-SY数据集做的是轴承加速寿命试验从正常状态一直记录了完整退化到失效这类数据对做剩余寿命预测特别关键。高校实验台数据普遍特征是信号真实、工况固定、标签由实验设计者预先设定缺点是设备结构相对单一传感器数量和位置也不如工业现场复杂。用这类数据时我建议先做一件事把每个文件的实验条件记录下来包括转速、负载、采样率、故障制造方式、传感器位置。别看这些字段不起眼后面做迁移学习和跨工况实验时全得靠它们。1.2 竞赛挑战赛数据把“预测”做成任务的先行者国际学术会议和竞赛发布的数据通常是“任务导向”的主办方故意不给你完整答案只给训练集和打分规则。这对做研究的人来说是好事因为数据划分、评价指标都是现成的复现论文很方便。PHM系列是故障诊断圈里绕不开的名字。PHM 2009发的是齿轮箱数据PHM 2010发的是铣刀磨损数据PHM 2012发的是轴承退化数据。这几个数据集被引用量极大尤其是PHM 2012的轴承数据训练集、测试集边界清晰还配套了预测误差的评价方式很多剩余寿命相关的论文用它做基准。IMS轴承退化数据也属于同一类思路它由美国辛辛那提大学智能维护系统中心发布记录了轴承从健康到失效的完整过程每隔一段时间采集一段振动信号适合做异常检测和早期故障预警。竞赛数据的优点在于“场景完整”不是给你一堆零散样本而是让你在有限数据上做预测、做决策。同样要注意竞赛数据通常按“设备编号”“通道编号”划分训练和测试而不是随机打乱样本很多人第一次用的时候把划分方式搞错导致指标虚高后面再复盘就很尴尬。1.3 机构发布与仿真数据解决“样本不够”的另一条路工业设备真实故障难以大批量采集所以很多公开数据集来自仿真环境或机构长期实验。NASA的C-MAPSS涡扇发动机退化数据集就是典型它用商用模块化航空推进系统仿真生成了一批发动机从健康到失效的监测序列包含几十个传感器通道训练集和测试集数量都不小剩余寿命预测方向的人基本都碰过。后来NASA又推出了改进版本N-CMAPSS加入了更多物理参数仿真场景更接近真实气路。电池退化数据也属于这个类别。NASA电池数据集、马里兰大学CALCE电池数据集、牛津大学电池退化数据集都记录了锂离子电池在充放电循环中的容量衰减过程这类数据对健康因子提取、寿命预测方法研究很有价值。结构健康监测方向则有IASC-ASCE基准结构数据集用的是四层框架结构的仿真与实验数据适合做损伤识别和模态参数相关实验。仿真数据的优势是样本量大、工况可控制、标签可以做得非常细缺陷是“仿真和真实之间永远有一层窗户纸”。如果模型只在C-MAPSS这种仿真数据上表现好到了真实设备上大概率要打折扣。所以用这类数据做出来的算法我认为至少要在一个真实采集的数据集上做一轮验证才算闭环。2. 三十多个数据集怎么分类设备对象、任务类型与数据形态把零零散散的数据源理顺我习惯按“设备对象”先分大类因为不同设备的故障机理差异很大选错类别等于白做。下面这张表整理了常见类别和代表数据源拆开来看三十多个来源并不夸张——很多数据集本身还分了工况、转速、损伤尺寸等多个子集。设备对象代表性开源数据源及渠道适合场景注意点滚动轴承CWRU、PU、IMS、XJTU-SY、PHM2012、MFPT故障分类、损伤程度评估、剩余寿命预测故障制造方式不同标签口径差异大齿轮与传动PHM2009、UMA Gearbox、东南大学齿轮箱数据断齿、磨损、缺齿分类多传感器融合转速工况变化大需先做转速归一化刀具与加工PHM2010 / NASA Milling刀具磨损阶段识别、剩余寿命预测需要同时用振动和切削力信号单通道信息不足航空发动机C-MAPSS、N-CMAPSS剩余寿命预测、多传感器退化建模属于仿真数据部署到真实设备前要验证液压系统HAU液压系统状态监测数据集多部件状态识别、表格型故障诊断大部分是统计特征偏传统机器学习电池储能NASA Battery、CALCE、Oxford Battery容量退化建模、健康因子提取每块电池的循环终止条件不同标签要统一结构健康IASC-ASCE基准结构损伤定位、模态分析仿真和实验混合使用前需分清数据来源车辆气动Scania APS气动系统数据类别不平衡下的故障预测表格型数据不一定适合深度学习竞赛与平台整理国内工业大数据竞赛、Kaggle二次整理、GitHub汇总仓库快速跑通流程、做算法对比二手版本可能改过标签用前找原始说明2.1 按任务需求拆诊断、预测与异常检测光看设备还不够任务需求才是决定数据选型的第一权重。故障诊断严格说分成三类任务分类诊断、退化预测、异常检测每类任务对数据的标签要求完全不同。分类诊断需要的是“健康/故障A/故障B/故障C”这样的离散标签CWRU是最经典的起步选择类别多、样本整齐、文件好读取。退化预测则需要连续时间序列上有明确的寿命终点XJTU-SY、IMS、PHM2012、C-MAPSS都适合但要注意这些数据集里的“寿命终点”阈值定义不同有的以振动幅值超限为准有的以仿真失效时刻为准建模前必须统一。异常检测比较特殊它只需要大量正常样本然后把偏离正常分布的样本挑出来IMS数据的前期健康段就经常被用来做这类训练。我见过很多新手拿分类数据去做RUL预测拿退化数据去做分类也不是不行但预处理方式完全不同绕了一大圈后会发现指标上不去根源其实是数据和任务不匹配。先问自己到底要做什么再去找数据能省一半精力。2.2 按信号类型拆振动、电流、压力与多模态故障诊断里最普及的信号是振动冲击、磨损、裂纹都会在振动响应中留下痕迹。但并不是所有公开数据都给了原始振动波形HAU液压系统数据集给的是统计特征更适合直接跑传统机器学习Scania APS是气压系统的运行参数记录根本没有波形可看。所以拿到一个数据集第一反应应该是看信号类型和自己掌握的算法是否匹配。近几年电流信号诊断电机故障也比较流行优势是非侵入、传感器安装成本低缺点是早期故障在电流信号里很微弱。CWRU虽然主推振动但实验环境同时记录了电机电气参数有些人会拿它做振动和电流的对比实验。还有不少数据集是多通道、多模态的比如PHM2010铣刀磨损数据同时给了切削力和振动信号东南大学齿轮箱数据也有多传感器通道。多模态数据处理起来要额外关注一个坑各个通道采样率不一定相同使用时必须先对齐或重采样否则特征拼接会出现严重偏差。2.3 按数据形态拆原始波形、特征表与时频图同样是“故障诊断数据集”内部形态差别很大。CWRU、PU、IMS这类给的是原始时域波形你可以自己画频谱、包络谱、短时傅里叶变换做深度学习的空间很大。HAU、Scania APS给的是表格化特征适合随机森林、XGBoost等传统模型。还有一类数据虽然来自原始采集但平台已经帮你转成了时频图或频谱图表现为图片形式这类数据做图像分类很方便但想再换一种特征提取方式就不太自由。我的看法是除非你已经明确要做图像类模型否则尽量选原始波形数据入手。原始波形是信息无损的想抽特征、做时频图、做端到端深度学习都可以特征表已经把信息固定死了后面只能在这个框架里打转。真到了工业项目里也一样能从现场拿到原始信号就不要只拿统计值。3. 实操把数据集跑起来的关键动作与代码数据下载下来只是第一步真正跑通才能谈算法。这一节给出一套最小可复现的流程覆盖从“看到文件”到“出特征”的几个关键动作。3.1 下载后先看什么建立元数据意识我踩过的第一个坑就是不看README直接跑代码。很多数据集压缩包里都有一份说明文件可能是PDF、txt甚至网页链接里面写着采样率、通道含义、故障标签表、时长和文件命名规则。这些信息比波形本身更重要。拿到数据集后我建议先把下面这些字段整理到本地表格里数据集名称与版本原始下载链接、本地存储路径信号类型振动、电流、压力、统计特征等采样率与通道数故障类型清单和标签定义每个类别的样本数量与类别是否平衡实验工况转速、负载、温度等授权许可与可商用范围论文出处或引用格式这个动作看着麻烦但以后每次换数据、写论文、给别人交接代码都会庆幸当初记过这些。没有元数据意识的人通常会在一个月后自己都不记得某个文件夹里到底装了什么。3.2 最小可复现读取流程从mat文件到可视化CWRU数据是典型的.mat格式用Python读取时要注意版本兼容。最常用的库是scipy.io代码可以这样开始import scipy.io as sio import numpy as np mat sio.loadmat(./data/12k Drive End Bearing Fault Data/IR007_0.mat) print(mat.keys())CWRU每个文件里的键名通常包含DE驱动端、FE风扇端、BA等字段具体以文件里的键为准。比如某个文件里可能是一个以DE开头的键存储了振动数组。取出数据后先确认长度和采样率再把原始信号画出来import matplotlib.pyplot as plt sr 12000 # 部分CWRU文件是12k部分文件是48k以说明文档为准 data mat[X200_DE_time].flatten() t np.arange(len(data)) / sr plt.figure(figsize(12, 4)) plt.plot(t[:2000], data[:2000]) plt.xlabel(Time (s)) plt.ylabel(Vibration (g)) plt.show()做频谱可以快速看故障特征频率附近有没有峰值from numpy.fft import rfft, rfftfreq spec np.abs(rfft(data)) freqs rfftfreq(len(data), 1 / sr) plt.figure(figsize(12, 4)) plt.semilogy(freqs[:sr // 2], spec[:sr // 2]) plt.xlabel(Frequency (Hz)) plt.ylabel(Amplitude) plt.show()这里有个细节很多.mat文件来自不同版本的MATLAB用scipy读取时如果报“Unknown mat file version”说明MATLAB存储版本太高可以用MATLAB打开后另存为v7.3以外的格式或者用h5py读取HDF5格式。我建议不要在读取环境上耗太久直接统一转成numpy数组或CSV保存到本地后续流程会顺畅很多。3.3 训练/测试划分的第一原则先定窗口再谈精度故障诊断实验里最常见的翻车现场是数据泄露同一个实验记录的前半段被切进训练集后半段被切进测试集结果模型学到的不是故障特征而是“这一段和下一段很相似”。尤其是用滑动窗口切样本时如果窗口重叠率很高训练集和测试集几乎就是邻居验证分数当然漂亮但一到新工况就崩。正确做法是先看数据集说明把“独立实验单元”作为最小的不可切分组。CWRU里一个.mat文件是一次实验记录应按“故障类型负载组合”的方式分组划分而不是按时间顺序硬切。XJTU-SY里每套轴承是一条完整的退化序列做剩余寿命预测时应该按轴承编号把整条序列划到训练或测试绝不能让同一套轴承同时出现在两个集合里。滑动窗口切样本的代码很简单但边界要控制好def make_windows(data, win_len, step256): windows [] for i in range(0, len(data) - win_len, step): windows.append(data[i:i win_len]) return np.array(windows)生成窗口后建议把所有窗口都打上“来源文件”“所属实验单元”的标签然后用GroupKFold这类分组交叉验证工具来切分而不是用普通的train_test_split。3.4 从数据集到模型预处理与特征提取的最短路径故障诊断不是只有深度学习一条路。先抽特征、再跑传统模型往往是更快得到可靠结果的方式。时域特征里最常用的是均方根值RMS和峭度前者反映能量大小后者对冲击性故障敏感频域里则常用包络谱突出轴承故障成分。代码可以很轻量def extract_features(x): rms np.sqrt(np.mean(x ** 2)) std np.std(x) kurt np.mean((x - np.mean(x)) ** 4) / (std ** 4 1e-12) return rms, kurt把CWRU每个文件的窗口都抽成RMS和峭度两维特征再配上故障类别标签喂给随机森林或XGBoost通常就能得到不错的基线。之后再加频谱特征、包络谱特征看增量效果怎样。如果非要用深度学习最省事的方式是把原始窗口直接输入一维卷积网络或者通过scipy.signal.stft把窗口转成频谱图再用图像分类模型处理。但我要提醒一句不要一上来就堆复杂模型。先用传统特征跑通基线、发现问题再上深度模型效率会高很多。4. 选数据集前必看的避坑指南常见问题与翻车现场这一节是我实际使用里遇到最多的问题也是博客评论区咨询最多的地方。与其一个个在群里回复不如直接整理成速查表按图索骥去排查。4.1 按任务匹配数据集一张速查表解决选择困难很多人问“我应该用哪个数据集”其实答案取决于目标。我给团队内部整理的选型逻辑如下想做的事推荐先试不推荐 / 特别注意故障分类入门CWRU PU不要只在一个数据集上调参很容易过拟合跨工况 / 迁移学习CWRU不同负载PU与CWRU互迁移转速和负载差异必须记录否则分析不了域偏移剩余寿命预测XJTU-SY、IMS、C-MAPSS终点阈值定义要统一样本长度差异大多传感器融合PHM2010、东南大学齿轮箱数据注意各通道采样率是否一致无监督异常检测IMS健康段、HAU正常工况有些数据集没有提供纯健康样本需要自己从早期切传统机器学习Scania APS、HAU表格型数据不要硬套卷积网络另外如果目标是用公开数据发论文我建议在主实验数据集之外再选一个不同设备的数据集做泛化验证。很多审稿人会问“换一个数据集是否还成立”提前准备能省去补实验的痛苦。4.2 直接踩过的坑问题、原因与对策坑典型表现根本原因对策下载链接失效官网404或迁移高校站点没人长期维护用Internet Archive回溯或在GitHub/Kaggle找镜像mat文件读不出来scipy报版本错误MATLAB存储版本过高用MATLAB转存或用h5py读取HDF5格式类别不平衡某类故障样本特别少实验时故障程度有限加噪增强、少数类重采样、改用评价指标F1工况混用离线指标好现场部署崩训练测试来自不同转速/负载且没有分组使用GroupKFold按工况分组验证数据泄露验证分数异常高滑动窗口重叠同一序列分到两边按独立实验单元划分禁止跨文件切分多通道没对齐长度不一致拼接报错各通道采样频率不同统一重采样或按时间戳对齐标签含义理解错0/1完全反了只看文件名没看说明文档找原始论文或README里的故障表核对这里最有价值的一条是“数据泄露”。我见过不止一次有人在同一个.mat文件里按90%/10%切训练测试然后用滑动窗口获得了99%的准确率兴奋地说自己算法无敌。其实只要把划分改成按故障负载分组准确率立刻掉到90%以下。做研究一定要搞清楚模型学到的是真正的故障特征还是仅仅记住了数据里的“邻居关系”。4.3 把数据源管起来一份有用的元数据清单公开数据越来越多但如果没有管理每次做新实验都像第一次接触一样。我自己的做法是建一个本地的数据索引表建议用Excel或CSV维护字段不算多但信息密度很高数据源本地路径信号类型采样率(Hz)故障类别样本量是否可商用备注CWRU./data/cwru振动12000/48000内圈、外圈、滚动体、正常每文件上千段学术友好商用确认负载0-3hpXJTU-SY./data/xjtu振动25600完整退化15根轴承学术友好含寿命终点标签HAU./data/hau统计特征不适用多部件状态2205条宽松适合传统ML这个表不用做得太复杂哪怕是在网盘里建一个“数据说明”目录、每个压缩包旁边放一个txt也够用。关键是保持原始文件不改所有预处理脚本都输出到新目录这样整个实验过程可追溯。我自己习惯把下载链接也放进备注方便以后查版本。5. 我建议的“数据集工作流”从下载到出结果的十个步骤最后把我用的工作流完整整理出来。对照这个流程走基本能在半天内把一个陌生数据集从压缩包变成可训练的特征矩阵。5.1 十步工作流清单第一步明确任务。先在纸上写清楚是做分类、RUL预测还是异常检测这决定后面所有选择。第二步按设备对象和信号类型在表格里筛数据源。别贪多先选两个最匹配的。第三步下载原始文件并做完整性校验。压缩包损坏很常见有MD5校验就核对没有就重新解压确认大小。第四步建目录和说明文件。每个数据源单独一个文件夹里面放README或者自己写的txt说明。第五步读原始说明记录元数据。采样率、通道、故障表、工况条件全部录入表格。第六步写读取脚本把数据统一转成numpy或CSV。原始文件绝不动转出来的新文件才能被后续代码使用。第七步做基础可视化随机抽几段时域波形和频谱。这一步能帮你快速发现数据有明显异常还是基本可用。第八步设计划分方案。确定哪个字段是不可切分的组按组划分训练验证测试。第九步抽特征或做时频变换跑一个最简单的基线模型。别管精度先确认流程没断。第十步记录指标、模型参数和运行时间到实验笔记。回填到元数据表保证一个月后还能复现。5.2 长期维护数据集的三个习惯这套工作流的价值在于“可复现”和“可扩展”。我见过不少团队把数据集下了一大堆结果每个人都在自己的电脑上重新踩一遍同样的坑就是因为缺少统一的本地归档和说明。坚持给每个数据集做元数据表、坚持把主实验划分方式固定下来、坚持每次预处理都用脚本而不是手工操作这三个习惯能省下一大半重复劳动。我个人在实际操作中的体会是故障诊断研究短期内不会缺公开数据缺的是对数据的认真程度。三十多个开源数据集摆在那里真正跑通的人未必多。如果你能把一个数据集的说明文档读透把数据泄露问题避开把基线模型老老实实跑出来你的进度已经快过大多数只收藏链接的人。希望这篇内容能帮你把第一步走稳剩下的就是多上手、多记录、多复盘。