☰
PHM轴承数据集性能特征分析:从特征提取到退化指标构建
2026/10/22 13:51:44 网站建设 项目流程

简介:这是一份围绕2016年PHM数据集性能特征分析的个人学习资源,面向从事设备故障预测和预测性维护的初学者与研究者。资源以多方法对比分析为主线,重点介绍三模态与双模态划分实验,用于探索不同特征组合对设备故障识别与预测效果的影响。压缩包共759个文件,总大小17.84MB,主体包含563个csv数据文件,另有py分析脚本、png可视化图、npy数据文件及readme说明文档等,可支撑从数据读取、特征分析到结果呈现的完整流程。目前已有76人学习下载。借助该包,读者可快速掌握PHM竞赛数据集的目录结构与文件用途,获得实验划分思路和多方法对比的实践参考,并利用附带脚本与图表理解关键特征在故障预测中的作用;同时license等文件也明确了仅供个人学习交流的合规边界。

1. 分析2016年PHM数据集性能特征:从看不懂数据到构建可靠退化指标

2016年PHM数据集是故障预测与健康管理领域避不开的公开数据,轴承剩余使用寿命预测方向的论文几乎都会拿它做对比实验。但这个数据集的“性格”并不友好:早期样本和晚期样本混在一起,转速负载有变化,直接拿原始振动信号去训练,十有八九会得到一个在训练集上漂亮、在测试集上一塌糊涂的模型。问题的核心不在算法,而在“性能特征”这层——能不能从时域、频域、时频多个角度提炼出真正跟随退化过程单调变化的特征,决定了RUL预测的下限。这篇文章会按照我实际分析这类数据时的路径走一遍,从数据组织方式开始,到特征提取与筛选,再到评估特征优劣的量化方法,最后把踩过的坑逐一摊开。

2. 先把数据拆明白:2016年PHM数据集的组织方式与工况边界

2.1 训练样本与测试样本的构成差异

拿到2016年PHM数据集之后,第一件事不是写代码,而是把文件结构摸清楚。常见做法是,每个轴承样本对应一个独立文件夹,里面存放水平方向和垂直方向的振动加速度信号,采样率是25.6kHz左右。训练集每个样本都记录了完整的生命周期,从健康状态一直磨损到明显故障;测试集则在生命周期中的某个未知截断点被切断,只给出故障前的一段,要求预测剩余使用寿命。

这个组织方式带来一个很容易被忽略的问题:训练集和测试集里面的样本,其“退化起点”不在同一个水平上。有的测试样本被截断时已经严重退化,而有的测试样本相对健康。如果直接用全局归一化做特征缩放,健康程度不同的样本会被压缩到相似的范围内,模型很难区分。我一般会先对每个样本单独统计其振动幅值的均值和峰值,画一条按时间展开的RMS曲线,人工扫一遍退化起点的位置,再去决定后续特征工程的缩放策略。

2.2 工况参数对特征基线的干扰

这个数据集里的样本并不全在恒定工况下采集,转速和负载的变化会让时域统计量产生明显的偏移。比如同一个轴承在健康状态下,转速升高时RMS值自然会变大,这并不代表退化加剧。很多初次分析这个数据集的工程师会在这一步翻车:不区分工况,把不同转速下的特征混在一起训练,结果模型学到的是转速模式而不是退化模式。

处理这个问题,常见做法是从信号本身的波形特征入手,先估计每个时刻的转速基频,再对特征做转速归一化。可以用简单的自相关法或过零率估计基频,然后把RMS和峰值这类幅值特征除以基频的平方,得到一个在一定程度上消除工况影响的比值。虽然不完美,但作为工程起点已经足够让退化趋势浮出水面。

另一个需要注意的点是样本长度差异极大。完整的训练样本可能包含数百万个采样点,而阶段性的退化过程只占其中很小一部分。如果直接对整个样本做一次性的FFT,时域上的退化位置信息就完全丢失了。所以预处理阶段必须引入分帧和加窗,把长信号切成固定时长的片段,再在片段级别提取特征。

2.3 标签映射与剩余使用寿命的定义方式

2016年PHM数据集的标签不是直接给剩余时间数值,而是通过一种相对比例的方式表达退化程度。很多分析代码中,完整健康段被标记为0,故障阶段被标记为1,中间段按照线性插值给出一个0到1的退化标签。这种定义方式看似简单,但存在一个关键假设:退化过程是从健康到故障线性发展的。实际轴承退化曲线往往是先平稳、再加速、最后剧变的三段式,线性插值会把中间段的加速退化信息平滑掉,导致训练出来的模型对早期-中期过渡不敏感。

我的应对方式是构建退化标签时加一个分段权重:前30%不参与损失计算,后20%放大损失权重。这本质上是把线性标签变成一种分段线性标签,让模型把注意力放在真正有信息量的区间上。这种方式不会改变数据本身,纯粹是对标签的重新映射,在多数RUL预测任务上都能看到明显的收敛加速。

2.4 数据加载与预处理的代码骨架

import numpy as np from scipy import signal def load_and_frame(file_path, win_seconds=1.0, fs=25600, overlap=0.5): # 读取原始一维振动信号,假设已为np.float64 raw = np.loadtxt(file_path) win_size = int(win_seconds * fs) step = int(win_size * (1 - overlap)) frames = [] start = 0 while start + win_size <= len(raw): frames.append(raw[start:start + win_size]) start += step return np.array(frames) # shape: (frame_count, win_size)

这段代码做的事情是把长信号分割为1秒长度的片段,相邻片段有50%重叠,目的是在保留时间分辨率和控制特征数量之间取一个平衡。win_seconds取1秒的原因是在25.6kHz采样率下,1秒包含25600个点,做频谱分析有足够的频域分辨率;如果取0.1秒,频率分辨率降到10Hz,会丢失一些轴承故障特征频率附近的细节。overlap=0.5是工程上常用的滑窗参数,如果内存紧张可以把overlap改小到0.25,但退化事件的检出灵敏度会相应下降。

3. 三类特征提取方法:时域、频域、时频分析怎么用在这个数据集上

3.1 时域统计特征:RMS与峭度的信息互补

时域特征是性能分析的第一道门槛,计算量小、物理意义直观,几乎每个做PHM数据的人都会先看RMS和峰值。RMS反映振动能量,轴承磨损加剧通常会让能量逐步上升;峭度反映信号中是否存在周期性冲击,早期剥落会产生明显的脉冲性,峭度会先升高到一个峰值,之后随着磨损面扩大反而回落。

这两者的信息互补关系值得注意。RMS是全局能量指标,适合描述长期退化趋势;峭度是局部冲击指标,适合检测损坏萌生的起始点。如果只用一个特征,容易在某个阶段失效——RMS在早期变化微弱,峭度在晚期饱和。所以我在实际分析中从来不看单一特征,而是把两者组合成一个二维状态向量,后续再叠加频域特征一起丢给模型。

3.2 频域特征与边带能量追踪

频域分析在这个数据集里的核心任务不是做一次全频段的FFT,而是追踪特定故障特征频率附近的能量变化。轴承内外圈故障会在频谱上产生特征频率,比如外圈故障频率通常是转频乘以某个倍数,计算公式取决于轴承几何尺寸。问题在于,这个公开数据集并没有附带完整的轴承几何参数,所以更多时候我们用“高频共振解调”的思路来处理。

def spectral_band_energy(frames, fs=25600, low=5000, high=12000): energies = [] for frame in frames: windowed = frame * np.hanning(len(frame)) spec = np.abs(np.fft.rfft(windowed)) freqs = np.fft.rfftfreq(len(frame), d=1/fs) mask = (freqs >= low) & (freqs <= high) energies.append(np.sqrt(np.mean(spec[mask] ** 2))) return np.array(energies)

这里选择5000~12000Hz这段高频带,原因是一般轴承结构共振频率落在这个区间,故障冲击会激起该频带的谐振能量。代码先把信号乘上汉宁窗以减小频谱泄露,再计算指定频段的均方根谱能量,相当于一个带通滤波器加能量检波器。阈值low和high的选取有门道,需要先用全频段频谱看一眼:如果轴承内圈故障特征频率是158Hz,谐波成分会延伸到数千Hz,共振带才是有价值的分析目标。调试时把low从3000Hz逐步往上调,观察退化末段的能量是否明显抬升,能抬起来的频带才是有效频带。

3.3 时频分析:小波包能量作为短时冲击的指纹

对2016年PHM数据集中某些退化模式极其陡峭的样本,单纯看频谱很难捕捉到冲击出现的时间点。时频分析把时间轴保留下来,同时展示频率结构的时间演变。短时傅里叶是最容易实现的,但窗口长度固定,低频和高频的时间分辨率无法同时满足。工程上我更多用离散小波包分解,把信号分解成不同频带,然后分帧计算各频带的能量比。

小波包的分解深度决定了频带宽度。在25.6kHz采样率下,分解到第4层,每个频带宽度是1600Hz,对共振频带的定位足够用了;分解到第5层,频带宽度降到800Hz,但单帧特征维度翻倍,模型过拟合风险增加。我通常分解到第4层,然后选取包含共振频率段的2~3个小波包节点,计算它们的能量占总能量的比例。这个比例特征比绝对值更稳定,因为它不受信号整体幅值变化影响。

import pywt def wavelet_packet_energy(frame, depth=4): wp = pywt.WaveletPacket(data=frame, wavelet='db4', mode='symmetric') nodes = wp.get_level(depth, order='freq') energies = [] for node in nodes: energies.append(np.sum(np.square(node.data))) total = np.sum(energies) + 1e-12 return np.array(energies) / total

pywt默认按频带顺序排列节点,order='freq'确保节点顺序不是按树遍历的先后,而是按实际频率从低到高。db4小波基对振动信号里的瞬态冲击比较敏感,换用haar则容易把噪声也当成冲击。这个函数最后返回的是归一化能量比向量,可以直接作为多方法分析中的一组时频特征,也可以进一步对多个子带求和得到单维退化指标。

4. 用三项量化指标判断特征性能:单调性、相关性、鲁棒性

4.1 单调性:特征值是否只随退化方向变化

一个特征能不能用,首要判断标准是它是否单调。轴承退化是不可逆过程,理想情况下特征应该只增不减或只减不增,如果特征曲线来回波动剧烈,模型很难从中学到时间趋势。量化单调性可以用Spearman秩相关系数的绝对值,或者更工程化的“方向一致性率”计算。

方向一致性率的做法是:按时间顺序遍历特征序列,统计相邻时刻特征值上升或下降的方向,用占多数的方向次数除以总变化次数。这个值越接近1,说明特征随时间的方向越稳定。注意这里的分析尺度按帧窗口进行,过小的窗口会产生大量高频抖动,导致方向一致性被低估;我一般按5秒聚合一次特征再计算方向一致性率。

4.2 相关性:特征与剩余使用寿命的线性关联

相关性指标回答的是“特征值变化了多少能对应寿命减少多少”的问题。Pearson相关系数在这里够用,因为退化标签本身就是数值型,特征也通常是连续数值,不存在严重的非线性关系。但有一个重要前提:相关性的计算必须基于训练集范围内的所有样本,而不是挑选某个退化显著的段来计算。

具体做法是取训练集全部样本的特征序列,按截断位置对齐到剩余使用寿命,然后计算特征与寿命的Pearson和Spearman相关系数绝对值。两者结合可以看出是否为单调线性关系:Pearson高而Spearman低说明有饱和段,Spearman高而Pearson低说明有加速段。一个合格的特征应当两项都在0.7以上。

from scipy.stats import pearsonr, spearmanr def evaluate_feature(feature_series, rul): p, _ = pearsonr(feature_series, rul) s, _ = spearmanr(feature_series, rul) monotonicity = np.mean(np.sign(np.diff(feature_series))) robustness = np.corrcoef(np.vstack([feature_series, rul]))[0, 1] return {"pearson": abs(p), "spearman": abs(s), "monotonicity": abs(monotonicity)}

这段代码把三项指标一次算完。monotonicity取的是符号差的均值,越接近1说明方向越一致;这里没有进一步对序列做平滑是为了避免人为引入虚假趋势。robustness字段的使用场景是对同一个特征重复3次交叉验证时,检查相关系数在不同数据子集之间的波动范围。波动超过0.2的特征直接丢弃,因为它们的表现取决于样本选择,放到新数据上极不稳定。

4.3 鲁棒性:抗噪声与抗工况干扰的能力

鲁棒性在这类数据集上表现为两种:一是对原始信号中偶然出现的尖峰干扰不敏感,二是对转速负载小幅波动的敏感程度低。尖峰干扰的来源可能只是数据采集卡的电气噪声,在时域上表现为一个远高于正常幅值的孤立点,能让峰值和峰峰值的计算瞬间失去意义。

提高鲁棒性的工程手段有两层。第一层在特征提取前,对每个帧做中值滤波,用窗口长度来抑制孤立尖峰;第二层在特征提取后,对特征序列做滑动均值平滑,窗口大小取原始信号长度的1%左右。这两层平滑是有代价的——过度平滑会让早期退化信号被抹平,检测灵敏度降低。我的经验是:先做中值滤波,不做滑动均值,如果计算出的单调性指标低于0.6,再逐步增加平滑强度。

5. 避坑指南:分析2016年PHM数据时常遇到的五个典型问题

5.1 症状:训练集特征曲线很完美,测试集上一片混乱

原因是特征工程做了全局归一化,测试集被单独分割后,特征分布已经超出训练集的覆盖范围。表现为测试集的RMS特征均值比训练集偏高30%以上,分类器或回归器直接失效。解决方法是只用训练集统计出均值和标准差,把归一化参数固定,再应用到测试集。严格禁止用测试集参与任何形式的统计计算,包括可视化时的分位数裁剪。

5.2 症状:峭度特征在中段出现断崖式回落

原因是早期剥落磨损面扩大,冲击被持续的强振动淹没,峭度从峰值下降到接近正常水平。如果基于峭度做退化检测,到了中期就会误判轴承“修复了”。解决方案是改用峭度与RMS的乘积作为特征,RMS持续上升,峭度回落时可以靠RMS撑住趋势。另一个更稳妥的做法是使用峰的包络能量替代峭度,取信号经带通滤波后的包络做峭度,能延迟饱和的发生。

5.3 症状:不同转速下RMS基线差很大,特征趋势被工况分段

原因是信号转速不是恒定值,某个样本可能前半段是1500rpm、后半段是1200rpm,RMS在不同的转速段呈现阶梯跳跃。解决方法是先按转速把信号分段,对各段分别做特征提取与归一化,然后再拼接成全局特征序列。转速估计算法不必很精确,粗略判断每分钟转速区间就够用——按0.5秒窗口计算过零率,把连续窗口聚成转速段。

5.4 症状:小波包特征维度太高,模型训练速度慢且容易过拟合

原因是把16个子带能量全部作为独立特征,样本量不大时特征数量与样本数量相当或超过,模型必然过拟合。解决方法是先使用单变量筛选,对每个子带特征单独计算与寿命的Spearman系数,保留系数绝对值低于0.3的子带,再对剩余子带计算两两相关性,相关性超过0.9的只保留其中一个。

5.5 症状:RUL预测结果在寿命末期偏差极大

原因往往是最后一阶段的退化加速度远高于早期,任何线性模型都无法跟上这种突变。解决方法是把退化标签做对数变换,预测结果再变换回来,相当于让模型先学习“对数寿命”的变化规律,最后还原时误差在小值端被压缩。这个技巧带来的改善可能比换更复杂的模型结构还明显。

6. 把多方法特征分析沉淀成可复用的评估流程

最后分享一个我常用的工作流整合技巧:把前面讲的所有特征提取和评估函数封装成一个统一的评估类,输入是原始信号路径,输出是一张特征评分表,包含单调性、相关性、鲁棒性和计算耗时四项。有了这张表,拿到新数据集时不需要重复造轮子,直接按分数从高到低挑选TopK特征交给下游预测模型。这个做法本质上是一种“特征热力检查”,能在15分钟内圈定有效特征范围,省掉无方向的调参时间。

这个评估类的核心参数有两个:一个是帧长度,决定时间分辨率;另一个是特征数量上限,决定后续计算压力。每次换数据集都要重新验证这两个参数。例如初期样本退化较慢的数据集,帧长度应该适当加长到2秒,以降低单帧噪声;退化较快的样本则用0.5秒帧,避免把快速变化平滑掉。

我自己的教训是曾经跳过第4章的评估步骤,用全部时域频域特征直接训练,结果模型在测试集上的误差比只用三个特征的基线还大。后来才明白,多方法不是多堆特征,而是多角度捕捉退化现象,再用评估指标去除冗余。现在每次数据分析都严格走“分帧提取→候选特征池→三项指标打分→特征精简→预测”的路线,系统运行稳定很多。这套分析法已在我自己的模拟项目上多次复用,希望能帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询