ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

轴承寿命预测实战:从时域变换到健康指标构建

轴承寿命预测实战:从时域变换到健康指标构建 简介面向轴承寿命预测的MATLAB源码包聚焦时域变换与状态特征提取适用于工业物联网、设备健康管理与故障诊断领域的研究者、工程师及相关专业学生。资源内共3个m文件压缩包仅1KB三个脚本分工明确分别对应数据读取与预处理、时域指标均方根、峭度、幅值计算以及寿命预测模型构建与验证可帮助读者在MATLAB中快速搭建从振动信号到剩余寿命评估的完整分析流程。代码在预处理环节融合了时域变换思路便于观察信号能量、尖峰分量与幅值突变等退化征兆是理解轴承失效机理的良好范例。已有1138人学习该资源其简洁结构便于初学者按步骤理解特征提取逻辑同时也可作为工程人员开发状态监测算法时的参考模板。通过研读代码不仅能掌握时域变换在轴承故障识别中的具体应用还能进一步延伸至小波变换、经验模态分解等时频方法为预防性维护和智能运维实践提供直接支撑。1. 轴承寿命预测不是算法竞赛先把“寿命”变成一条能拟合的曲线车间里最贵的一次停机往往不是故障本身而是故障发生在备件到货之前。主轴轴承从正常到失效通常会经历一个缓慢的退化窗口如果能提前几百小时给出预警就足够安排一次计划内换轴把非计划停机变成计划内维护。这就是轴承寿命预测剩余寿命预测RUL Prediction要解决的事用传感器采到的振动信号推断轴承还能稳定运行多久。输出不是一个“坏了没”的布尔值而是一个小时数或转数。这个方向最容易卡住的环节不在深度学习模型而在信号到特征的“时域变换”。原始振动波形是几十万个采样点不可能直接喂给预测模型你需要先把时域信号变换成一组能描述退化程度的指标序列再做趋势推断。本文的目标很实际把数据准备、时域特征、健康指标、寿命映射这条链路完整跑通并给出参数边界和工程坑。适合两种人刚接手预测性维护项目的设备工程师以及被“先跑个AI模型”带偏、但还没建立数据意识的算法工程师。2. 数据准备与标签对齐时域变换的前提是“时间戳干净”2.1 公开数据集先跑通XJTU-SY 与 PHM2012 的标签差异在哪里做轴承寿命预测一开始别急着上自己的产线数据先找公开的加速寿命试验数据集。业界最常用的两个是西安交通大学的 XJTU-SY 滚动轴承加速寿命试验数据集和 IEEE PHM 2012 轴承数据集。这两套数据有一个本质差异XJTU-SY 记录的工况更接近工程实际有 3 类工况每类多个轴承而 PHM2012 把数据集直接划分为学习集和测试集测试集不提供退化标签逼着你先建模再外推。标签差异是新手第一个会踩的坑。XJTU-SY 这类数据集里每个轴承从试验开始到最终失效都有完整振动记录标签通常是“当前时刻距失效还剩多少个采样点/多少转”。PHM2012 的测试集则是“只给前一部分波形要你预测剩余寿命”不给你失效点在哪。两种标签直接决定了建模方式前者可以做成监督学习回归后者更像是“先用学习集构建退化模式再对测试集外推”。我的建议是先用 XJTU-SY 这类完整退化数据把流程跑通因为你能看到真实的退化全貌方便验证特征是否有效。等流程稳定了再用 PHM2012 的协议去检验模型的跨轴承泛化能力。不要一上来就追求精度先把“从波形到寿命”的链路打通。2.2 振动信号读入与时间轴对齐别看漏了采样率这一列拿到原始振动 CSV 之后第一步不是提特征而是做时间对齐。公开数据集的 CSV 通常是三列水平方向振动、竖直方向振动、时间戳或采样序号。实际产线采集时还会遇到设备停机、采集卡重启、丢包时间戳往往不是严格等间隔的。如果直接按行号滑窗退化曲线里会掺入一堆“假跳变”。我一般会先做这样几步读入数据后检查时间差分布把间隔异常大的采样点单独标出来然后按时间戳重采样到统一频率最后再进入滑窗。下面这段代码以 XJTU-SY 格式为例两列振动加一列时间戳演示了时间对齐和缺失值处理的通用写法。import pandas as pd import numpy as np # 读入原始振动数据列名按常见格式设定 df pd.read_csv(bearing_vibration.csv, names[timestamp, vib_x, vib_y], header0) # 1) 时间戳转成秒并按时间排序 df[timestamp] pd.to_datetime(df[timestamp]) df df.sort_values(timestamp).reset_index(dropTrue) # 2) 检查采样间隔找出异常跳变 df[dt] df[timestamp].diff().dt.total_seconds() print(dt 统计中位数 %.6f s最大值 %.6f s % (df[dt].median(), df[dt].max())) # 3) 按中位数间隔重采样缺失区间自动补 NaN fs 1.0 / df[dt].median() # 估算实际采样率 df df.set_index(timestamp).resample( pd.Timedelta(seconds1.0 / fs)).mean().reset_index() df df.interpolate(limit_directionboth) # 对短缺失做线性插值这段代码的核心是第 3 步重采样频率不按 CSV 里写的标称值而是按时间戳差分的中位数重新估算。很多采集卡的标称采样率和实际采样率有微小偏差时间长了会累积成相位漂移滑窗的特征序列会莫名抖动。插值只建议处理短于 0.1 秒的缺失长时间停产段宁可切断也不要硬补否则会把停机特征当成退化特征。重采样之后建议把两路振动合并观察。常见做法是取两轴的合力幅值sqrt(vib_x^2 vib_y^2)作为分析对象这样能减少传感器安装方向对特征的干扰。位数上保留 float32 就够原始波形没必要用 double后续滑窗计算会省一半内存。2.3 滑窗变换把连续波形切成与“寿命”对齐的样本序列时域变换的下一步是滑窗把连续波形切成长度固定的帧每个窗口计算一组特征这个特征值就代表“当前时刻”的退化状态。滑窗有两个参数——窗口长度和步长。窗口长度决定单帧的统计稳定性一般建议覆盖 1 到 2 个转频周期以上步长决定特征序列的时间分辨率也直接影响寿命预测的“提前量”。以 32kHz 采样率为例如果轴承转速约 2000 转/分钟转频约 33Hz一个转频周期约 0.03 秒窗口长度取 0.1 到 0.2 秒也就是 3200 到 6400 个采样点能同时兼顾统计稳定性和退化响应速度。步长常见取窗口长度的四分之一到二分之一让相邻窗口有重叠减少特征序列的阶跃感。代码实现如下。def sliding_window(data, window_len, step_len): 对一维振动信号做滑窗切分 data: np.ndarray, 一维振动幅值 window_len: 窗口内的采样点数 step_len: 窗口滑动的采样点数 返回: 二维数组形状为 (n_windows, window_len) n len(data) starts range(0, n - window_len 1, step_len) return np.stack([data[i:i window_len] for i in starts]) # 参数示例窗口 6400 点约 0.2 秒 32kHz步长 1600 点0.05 秒 win_len, step_len 6400, 1600 frames sliding_window(signal, win_len, step_len) print(滑窗数量:, frames.shape[0])窗口长度别拍脑袋定。我自己的经验是先看信号的频谱找到转频和故障特征频率再反推窗口至少要覆盖转频周期的 2 倍。否则峭度这类高阶统计量会因样本量不足而方差极大退化曲线像锯齿。步长如果再小于窗口的四分之一特征序列点数太多后续拟合会变慢收益却很小。滑窗切出来之后每帧就是一个“伪样本”它对应的“寿命标签”是这一帧中心时刻距离轴承失效的时间差。这里要特别强调标签的单位必须和你的预测目标一致。如果现场只记录了运行时间那标签就是小时如果现场有转速计标签建议换算成转数因为同一型号轴承在不同转速下的寿命差异很大转数是更稳定的退化度量。2.4 为什么“标签对齐”比特征工程还容易翻车标签对齐的细节常常决定模型能不能收敛。常见的错误做法是把数据集的“采样序号”当成时间单位来做寿命标签。加速寿命试验里采集卡可能因为存储上限自动跳过部分数据段采样序号和真实时间的对应关系并不可靠。另一个更隐蔽的问题是数据集里有些轴承从试验开始就已处于中度退化状态如果直接把这个起点当成健康基准构建出的健康指标会在一开始就偏高后续退化趋势的斜率被严重低估。正确做法是先用一小段早期数据通常是最初 5% 的时间验证轴承是否处于健康状态。如果早期 RMS 已经明显高于同型号其他轴承的出厂水平就该单独处理不能和健康轴承混在一起建模。标签对齐这件事宁可多画几次时间-幅值曲线人工确认也不要盲目相信 CSV 文件名里的编号顺序。3. 时域变换怎么做从原始振动到特征向量的四个必做步骤3.1 时域统计特征RMS、峰值、峭度、裕度因子的适用边界这一章是核心。所谓“时域变换”在工程上通常指的就是把原始波形变换为有物理含义的时域统计特征。做轴承寿命预测常用的时域统计量并不多一只手数得过来均方根值 RMS、峰值、峭度、波形因子、脉冲因子、裕度因子。它们的计算都不复杂但每种的适用边界差别很大。RMS 反映的是振动能量水平轴承退化时接触面磨损加剧能量整体上升所以 RMS 几乎是所有寿命预测方案里必选的基础特征。峭度对冲击型故障比如点蚀、剥落极其敏感早期出现微裂纹时峭度会先跳起来但它后期会剧烈波动不适合单独做趋势拟合。峰值和裕度因子对瞬时冲击敏感容易受环境噪声干扰一般作为辅助特征。幅度因子这类归一化特征的好处是对载荷变化不敏感但缺点是早期退化响应慢。import numpy as np def time_domain_features(x): 输入一个滑窗的一维振动信号 x返回时域统计特征 rms np.sqrt(np.mean(x ** 2)) peak np.max(np.abs(x)) mean_abs np.mean(np.abs(x)) std np.std(x) # 峭度四阶中心矩除以标准差的四次方 kurt np.mean((x - np.mean(x)) ** 4) / (std ** 4 1e-12) # 波形因子 RMS / 平均绝对幅值 waveform_factor rms / (mean_abs 1e-12) # 脉冲因子 峰值 / 平均绝对幅值 impulse_factor peak / (mean_abs 1e-12) # 裕度因子 峰值 / (平均sqrt幅值)^2 margin_factor peak / (np.mean(np.sqrt(np.abs(x))) ** 2 1e-12) return { rms: rms, peak: peak, kurtosis: kurt, waveform_factor: waveform_factor, impulse_factor: impulse_factor, margin_factor: margin_factor, }注意代码里所有分母都加了1e-12防止除零。这个不是形式主义当轴承还没跑合、振动极小的时候平均绝对幅值可能接近 0因子类特征直接算出无穷大后续归一化会出 NaN。峭度的计算要求窗口内样本量足够经验值是窗口内至少包含 2000 个采样点。低于这个数峭度估计的方差大到没法用。如果你发现峭度曲线在健康段疯狂跳动先检查窗口长度别急着换特征。3.2 把特征向量串成退化曲线平滑与异常值剔除单帧特征算完之后你会得到一条随时间变化的特征序列。但原始序列噪声很大——轴承滚动体划过缺陷时的冲击是随机的相邻两个窗口的峭度可能差出好几倍。直接拿这条毛刺曲线去拟合寿命结果必然发散。我一般先做两步清洗中值滤波去掉孤立尖峰再用 Savitzky-Golay 平滑保留趋势形状。中值滤波的窗口设为 5 到 11 个点用于剔除异常帧Savitzky-Golay 的窗口设到 31 到 51 个点多项式阶数 2 到 3 阶。这两个参数组合起来的效果是短促的冲击被滤掉缓慢的退化趋势被保留。from scipy.signal import savgol_filter from scipy.ndimage import median_filter # 假设 rms_series 是滑窗计算得到的 RMS 序列 rms_clean median_filter(rms_series, size7) # 剔除孤立尖峰 rms_smooth savgol_filter(rms_clean, window_length41, polyorder3) # 平滑后的曲线才是后续寿命拟合的输入 print(原始长度:, len(rms_series))这里有个常见的误用有人直接用移动平均做平滑结果退化突变点被抹得过于圆钝寿命预测的报警点会滞后。Savitzky-Golay 比移动平均好的地方在于它做的是局部多项式拟合对趋势的保形能力更强尤其适合 RMS 这种缓变特征。如果你发现平滑曲线在退化加速段出现“提前抬头”说明窗口太长或阶数太高适当减短窗口即可。平滑做完之后把清洗后的特征存入结构化数据列名统一为timestamp, rms, kurtosis, ...后面构建健康指标时不会再手忙脚乱。3.3 特征筛选的三个指标相关性、单调性、鲁棒性特征算了一大堆不是全都该进模型。寿命预测里特征选择有一套和分类任务不同的标准分类看的是区分度寿命预测看的是“随时间单调退化”的能力。一个有用的退化特征应该满足三个条件与剩余寿命的相关性高、序列本身单调性好、在相同工况下重复试验的变异性低。具体量化时我常用三个指标。趋势性用 Spearman 秩相关系数衡量特征与时间是否单调相关单调性用特征序列前后向差分的正负占比衡量鲁棒性用特征在健康段前 20% 寿命的变异系数衡量。特征是去是留直接按这三个指标打分。from scipy.stats import spearmanr def monotonicity(x): diff np.diff(x) n_pos np.sum(diff 0) n_neg np.sum(diff 0) return abs(n_pos - n_neg) / len(diff) def robustness(x, health_ratio0.2): health_part x[:int(len(x) * health_ratio)] return np.std(health_part) / (np.mean(health_part) 1e-12) # 以峭度序列为例 score_corr, _ spearmanr(np.arange(len(kurt_series)), kurt_series) score_mono monotonicity(kurt_series) score_robust robustness(kurt_series) print(f峭度 - 相关性:{score_corr:.3f}, 单调性:{score_mono:.3f}, 鲁棒性:{score_robust:.3f})实际筛选中相关性高于 0.7、单调性高于 0.5、鲁棒性变异系数低于 0.2 的特征是首选。RMS 通常相关性很高但早期单调性一般峭度早期单调性好但后期鲁棒性差。这就是为什么要“组合”而不是“单选”。单个特征做不到的事特征组合能做到。3.4 一个常被低估的时域变换思路冲击能量包络除了统计量时域变换里还有一个非常实用的操作希尔伯特变换提取包络。轴承出现局部缺陷时振动信号表现为高频载波上的周期冲击直接看原始波形很难量化。用希尔伯特变换求出解析信号的幅值包络再对包络做低通滤波就能把“冲击能量随时间的积累”提取出来。它本质上是一种时域到包络域的变换对早期点蚀的敏感度明显优于 RMS。from scipy.signal import hilbert, butter, filtfilt def envelope_energy(frame, fs): analytic hilbert(frame) # 解析信号 env np.abs(analytic) # 包络幅值 # 低通滤波只保留冲击包络的低频趋势 b, a butter(4, 20 / (fs / 2), btypelow) env_smooth filtfilt(b, a, env) return np.mean(env_smooth ** 2) # 包络能量 # 示例对第 i 个滑窗计算包络能量 energy envelope_energy(frames[i], fs32000)包络能量这个特征在退化早期比 RMS 抬头更早但容易受到其他机械部件齿轮、丝杠冲击干扰。用它的前提是传感器安装位置尽量靠近轴承座且确认主轴空载时的包络能量处于低水平。把它和 RMS、峭度合在一起做健康指标比单用某一个特征稳定得多。4. 健康指标与寿命映射把多维特征变成一条能预测的退化曲线4.1 健康指标构建从多维特征降维到一维退化量有了多个时域特征之后下一步是把它们融合成一个健康指标 HIHealth Indicator一条从 0 到 1或从 0 到 100的退化曲线。为什么要融合因为单个特征在不同退化阶段各有盲区RMS 在早期退化时变化缓慢峭度在后期乱跳包络能量易受干扰。融合之后各取所长曲线的单调性会明显好过任何单一特征。常见的融合思路有三种归一化后加权平均、马氏距离、自编码器重构误差。工程上我最常用的是马氏距离——它把多维特征映射为“当前状态相对于健康状态的距离”无需人工定权重且能自动考虑特征间的相关性。from scipy.stats import chi2 def mahalanobis_distance(features, health_data): features: (n_samples, n_features), 全生命周期的特征矩阵 health_data: (n_health, n_features), 健康段的特征矩阵 返回: 每个样本的马氏距离 mu np.mean(health_data, axis0) cov np.cov(health_data.T) cov_inv np.linalg.pinv(cov) # 用伪逆防止奇异矩阵 diff features - mu md np.sqrt(np.sum(diff cov_inv * diff, axis1)) return md # 取前 10% 数据作为健康基准 n_health int(len(feature_matrix) * 0.1) health_data feature_matrix[:n_health] hi_raw mahalanobis_distance(feature_matrix, health_data) # 归一化到 0~1用最大值做除法保留相对退化程度 hi hi_raw / np.max(hi_raw)马氏距离的参数主要在健康基准的选取。健康基准用前 5% 还是前 20% 的数据对结果影响巨大取的太少协方差估计不稳取太多可能混入早期退化信息让健康状态的方差虚高。我的经验是先画出前 30% 的 RMS 曲线目测确认哪个位置开始稳定爬升再回头选健康段。不要机械地取固定比例。归一化的方式也有讲究。用全寿命最大值做除法会把所有轴承都归一到终点为 1好处是曲线形态直观但如果要做跨轴承预测最大值本身未知就得用阈值的绝对物理量比如出厂振动限值做归一化。4.2 退化阶段划分正常期、缓慢退化期、急剧退化期HI 曲线构建好之后别急着直接拟合整条曲线。实际轴承退化不是匀速的通常分为三段正常期HI 基本平稳、缓慢退化期HI 线性爬升、急剧退化期HI 指数加速。如果用一个全局模型去拟合三段混合曲线容易在阶段切换点出现系统性偏差。我一般在拟合寿命之前先找退化加速的起始点。最省事的办法是计算 HI 序列的滑动窗口斜率当斜率超过健康段斜率标准差的 5 倍以上时标记为退化起始点。只对退化起始点到当前时刻这一段做剩余寿命拟合精度会显著提升。4.3 从 HI 到剩余寿命先跑指数拟合再考虑深度学习剩余寿命预测模型选择上有一条经验对于单个轴承的退化趋势指数或双指数模型拟合往往比 LSTM 更可靠。轴承的加速退化过程在工程上经常表现为 HI 随时间指数上升取对数后变成线性关系用最小二乘拟合就能得到很好的结果。def predict_rul_linear_log(hi, t, threshold0.8, lookback50): 对 HI 序列取对数后做线性拟合预测到达阈值的时间 hi: 归一化健康指标序列 t: 对应的时间戳序列单位小时 threshold: 失效阈值 # 只取最近一段退化数据做拟合避免早期噪声干扰 y np.log(hi[-lookback:] 1e-6) x t[-lookback:] slope, intercept np.polyfit(x, y, 1) # 解方程 log(threshold) slope * t intercept t_fail (np.log(threshold) - intercept) / slope rul t_fail - t[-1] return max(rul, 0), slope # 示例用最近 50 个滑窗点外推 rul, slope predict_rul_linear_log(hi, time_hours, threshold0.85) print(预测剩余寿命: %.1f 小时, 退化斜率: %.4f % (rul, slope))代码里的 lookback 是最近多少个点参与拟合这个参数要按退化阶段动态调整。退化早期的斜率小用较长的 lookback 可以稳定估计退化加速后斜率变化快lookback 太长会导致预测滞后要相应缩短。我常用的方法是用变点检测把最近一次斜率突变时刻作为 lookback 的起点保证拟合窗口刚好覆盖“当前退化段”。那深度学习什么时候上当你有大量同型号轴承的全寿命数据、且要跨轴承预测时LSTM/Transformer 才能发挥优势。它们本质上是学习大量轴承的退化“模板”。如果手里只有三五个轴承的数据老老实实用指数拟合或高斯过程回归不要硬上深度学习。深度学习在数据量不足时拟合出的曲线不仅不平滑还会给出离谱的外推结果。4.4 阈值标定失效阈值不是拍脑袋定的HI 归一化到 0~1 之后失效阈值取 0.8 还是 0.9对剩余寿命影响很大。最靠谱的标定方法是统计多套同型号轴承在寿终时的 HI 分布取 5% 分位数作为保守阈值。没有历史数据时可以结合实际检修记录把轴承出现明显剥落、温升超过 10 度时的 HI 值回填为阈值。这个参数宁低勿高因为低估寿命最多提前换轴承高估寿命则会直接导致失效漏报。5. 参数校准与避坑5 个让模型翻车的工程细节5.1 起始基准漂移第二个窗口就把阈值打穿了现象健康指标 HI 在轴承刚启动的第一个小时就冲到 0.6 以上整条退化曲线的对比度被压缩后续拟合完全失效。原因新装的轴承本身有一个跑合期头几百秒振动偏大另外传感器刚固定时接触状态不稳定导致初始几段滑窗的特征值虚高。直接把前 10% 数据当作健康基准结果基准本身就包含了噪声峰值。这不是轴承退化的病是测量初始段的病。解决采集后先截掉前一定比例的数据我一般去 3% 到 5%再做健康基准估计或者用滑窗特征序列的中位数而不是均值做基准中位数对初始段的尖峰更鲁棒。这是轴承寿命预测里最隐蔽的数据污染来源。5.2 RMS 对早期退化不敏感峭度先跳RMS 不动现象特征筛选时RMS 的相关性得分很高但实际画出来发现它在前 60% 寿命段基本是一条平线后期才开始抬头。单独用 RMS 做健康指标寿命提前量只有十几个小时。原因早期微点蚀产生的冲击能量占总能量比例极低RMS 是能量平均统计量对局部冲击不敏感而峭度是四阶统计量对冲击幅值变化放大明显。解决健康指标里至少同时包含 RMS 和峭度包络能量更佳。如果只能选两个特征我会选 RMS 峭度。RMS 管后期整体能量上升峭度管早期局部冲击。单靠任何一个人都会在某个阶段失明。5.3 标签单位搞错按“采样序号”还是按“时间”还是按“转数”现象两份同型号轴承的数据用同样的代码训练一个预测误差 10%另一个误差 80%。原因其中一份数据的标签是按采集序号算的但采集系统在试验中因磁盘写入抖动丢过数据段序号和时间的关系已经错位。另一份的标签是按时间算的可两台试验机的转速差了 30%时间标签根本不可比。解决统一标签基准。有转速计的用转数累计转过的圈数没有转速计的用采集系统主时钟时间但必须先做时间戳连续性检查。不要直接拿 CSV 的行号当标签这是很多人第一次跑公开数据集时最容易踩的坑。5.4 滑窗长度与步长的组合陷阱短了抖长了钝现象滑窗长度取 0.05 秒峭度曲线在健康段疯狂跳动改成 0.5 秒曲线平滑了但退化起始点被延迟到很靠后的位置寿命提前量被吃掉。原因窗口太短每个窗口内的冲击样本数量不足高阶统计量估计方差大窗口太长单个窗口平均了退化信息相当于低通滤波把突变给抹掉了。解决窗口长度覆盖转频周期的 2~4 倍步长取窗口长度的四分之一。调试时画两条曲线对比一条是不同窗口长度下的峭度值箱线图选健康段方差最小且退化段响应最快的那个长度。不要同时试太多组合“三长三短”基本能收敛到合适的区间。5.5 同型号轴承换工况后模型失效现象在试验台转速 1500 转/分钟下训练的模型换到现场 3000 转/分钟的相同轴承上寿命预测结果偏得离谱有时甚至给出负寿命。原因特征绝对值随转速变化很大RMS 和峰值能量随转速升高而增大模型学到的阈值和斜率在新工况下全部失效。解决两个思路。一是做特征无量纲化——用波形因子、峭度这类归一化特征替代 RMS 等绝对量二是做工况归一化——按转速把时间轴换算成等效转数再用无监督的健康指标方法如马氏距离代替有监督回归。核心原则是模型里尽量不放随工况漂移的绝对量。6. 用一张退化趋势图验证模型比准确率指标更可信的验证方法最后一个环节也是我认为整个流程里最值得花时间的一步验证模型的方式要对抗“回看偏差”。很多团队把同一个轴承的数据既用来训练又用来测试得到的准确率很好看但换到新轴承上立刻打回原形。我的验证习惯是训练阶段只用早期 50% 的退化数据要求模型预测后半段的失效时间然后与真实失效点对比。这个协议能真实模拟现场“只知道历史、不知道未来”的状态。具体操作上我不会只盯单点预测误差而是画出整条“预测寿命随时间更新”的曲线。横轴是时间纵轴是模型在当前时刻给出的剩余寿命然后把真实的寿命倒计时画成 45 度参考线。好模型的更新曲线应该绕着参考线小幅振荡误差随接近失效而收敛如果曲线偏得太远且在末期还在发散说明特征或拟合窗口选得不对。这张图一眼就能看出模型是真会预测还是只会背答案。再进阶一点建议做稀疏采样鲁棒性验证把训练数据每隔 10 个点抽 1 个如果预测结果变化不大说明模型学的是趋势而非噪声如果寿命预测结果剧烈变化说明特征序列里噪声占比过高回去检查平滑参数。这个验证成本极低却最能暴露特征工程的真实质量。我自己早期做这个方向时犯过一个非常典型的错在一个公开数据集上训练测试同源数据得到的 RUL 误差不到 5%当时以为模型已经收敛得差不多。直到换到另一组工况的数据上误差直接飙到 60% 以上才意识到之前的“高精度”完全是回看偏差在撑场面。后来我给自己定了条规矩任何寿命预测模型上线前必须过一遍“早期训练、后期验证、跨轴承测试”三关少一关都不算完成。这套流程虽然慢但它能避免你在控制室里对着一个漂亮却不可用的预测值做决策。希望这些经验对你有帮助——从时域变换到健康指标再到寿命外推每一步都值得你用真实数据亲自验证一遍。本文还有配套的精品资源点击获取
返回列表