别再乱设标签了!手把手教你用Python为CMAPSS数据集生成三种RUL预测标签(附代码)

张开发
2026/4/13 12:12:49 15 分钟阅读

分享文章

别再乱设标签了!手把手教你用Python为CMAPSS数据集生成三种RUL预测标签(附代码)
别再乱设标签了手把手教你用Python为CMAPSS数据集生成三种RUL预测标签附代码在设备预测性维护领域剩余使用寿命RUL预测是核心任务之一。许多初学者拿到CMAPSS这类经典数据集后往往陷入如何为模型生成有效标签的困境。本文将带你深入理解三种主流标签生成方法并提供可直接运行的Python代码实现。1. RUL标签生成的核心逻辑与数据准备CMAPSS数据集是NASA发布的涡扇发动机退化仿真数据包含多个发动机单元从正常运行到失效的完整周期。每台发动机的传感器数据按时间周期记录我们需要为每个时间点生成对应的RUL标签。首先加载必要的Python库并准备数据import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler # 加载CMAPSS数据集的训练集 train_data pd.read_csv(CMAPSSData/train_FD001.txt, sep , headerNone) train_data.drop([26, 27], axis1, inplaceTrue) # 删除空列 columns [unit, cycle] [fsensor_{i} for i in range(1,22)] [RUL] train_data.columns columns每个发动机单元的完整生命周期不同我们需要先计算每个单元的最大周期数max_cycles train_data.groupby(unit)[cycle].max().reset_index() max_cycles.columns [unit, max_cycle] train_data train_data.merge(max_cycles, onunit, howleft)2. 分段线性RUL标签生成方法分段线性标签是最直观的RUL表示方式假设设备从某个阈值周期才开始退化def piecewise_rul(df, threshold125): df[RUL_linear] df[max_cycle] - df[cycle] # 应用阈值限制 df[RUL_linear] df[RUL_linear].apply(lambda x: x if x threshold else threshold) return df train_data piecewise_rul(train_data)这种方法的特点优点实现简单物理意义明确缺点阈值选择需要领域知识可能丢失早期退化信息适用场景当设备有明显健康-退化转变点时效果最佳可视化标签分布import matplotlib.pyplot as plt plt.figure(figsize(10,6)) plt.plot(train_data[train_data[unit]1][cycle], train_data[train_data[unit]1][RUL_linear]) plt.title(Piecewise Linear RUL Label for Unit 1) plt.xlabel(Cycle) plt.ylabel(RUL) plt.show()3. 寿命百分比RUL标签生成方法寿命百分比标签将RUL表示为当前剩余寿命占总寿命的比例def percentage_rul(df): df[RUL_percentage] (df[max_cycle] - df[cycle]) / df[max_cycle] return df train_data percentage_rul(train_data)这种方法的特性归一化优势所有样本的标签都在0-1范围利于模型训练数据敏感对寿命周期异常值敏感可能需要预处理最佳实践适合与健康指标结合使用我们可以对比同一单元两种标签的差异unit1 train_data[train_data[unit]1] plt.figure(figsize(12,5)) plt.subplot(1,2,1) plt.plot(unit1[cycle], unit1[RUL_linear]) plt.title(Linear RUL) plt.subplot(1,2,2) plt.plot(unit1[cycle], unit1[RUL_percentage]) plt.title(Percentage RUL) plt.tight_layout()4. 基于健康指标的RUL标签生成健康指标HI通过降维技术从多传感器数据中提取设备退化特征from sklearn.decomposition import PCA def health_indicator(df, n_components1): sensor_cols [fsensor_{i} for i in range(1,22)] scaler MinMaxScaler() scaled_data scaler.fit_transform(df[sensor_cols]) pca PCA(n_componentsn_components) hi pca.fit_transform(scaled_data) df[health_indicator] hi return df train_data health_indicator(train_data)健康指标的关键要点降维技术选择除PCA外也可尝试t-SNE、Autoencoder等归一化处理传感器数据通常需要先标准化可解释性挑战需要结合领域知识验证指标合理性生成基于健康指标的RUL标签def hi_based_rul(df): # 按单元分组处理 for unit in df[unit].unique(): unit_data df[df[unit]unit].copy() max_hi unit_data[health_indicator].max() min_hi unit_data[health_indicator].min() unit_data[RUL_hi] (unit_data[health_indicator] - min_hi) / (max_hi - min_hi) df.loc[df[unit]unit, RUL_hi] unit_data[RUL_hi] return df train_data hi_based_rul(train_data)5. 三种标签的对比与应用建议我们通过表格对比三种标签的特性标签类型计算复杂度数据要求模型适配性可解释性分段线性低需知阈值LSTM/CNN较好高寿命百分比中需完整生命周期所有模型中健康指标高需多传感器数据深度模型低实际应用时的选择策略数据充足时尝试健康指标百分比标签的组合快速原型开发使用分段线性标签模型对比实验建议同时生成三种标签进行效果对比保存处理好的数据集train_data.to_csv(processed_train_data.csv, indexFalse)6. 标签生成的高级技巧与注意事项在实际项目中我们还需要考虑以下进阶问题标签平滑技术def smooth_labels(df, window_size5): for unit in df[unit].unique(): unit_data df[df[unit]unit].copy() unit_data[RUL_smoothed] unit_data[RUL_linear].rolling(windowwindow_size).mean() df.loc[df[unit]unit, RUL_smoothed] unit_data[RUL_smoothed] return df.fillna(methodbfill)多标签融合方法def hybrid_labels(df, alpha0.7): df[RUL_hybrid] alpha*df[RUL_percentage] (1-alpha)*df[RUL_hi] return df关键注意事项不同标签可能需要不同的损失函数设计 健康指标生成过程应单独保存以便应用于测试集 建议对最终标签进行可视化检查确保符合预期在真实项目中我发现结合领域知识微调标签生成参数能显著提升模型性能。例如针对航空发动机数据将分段线性阈值设为实际维护周期附近的数值通常效果更好。

更多文章