共计 2396 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
CMAPSS(Commercial Modular Aero-Propulsion System Simulation)数据集由 NASA 发布,是航空发动机剩余使用寿命(RUL)预测领域的标杆数据集。该数据集通过高保真度仿真模型生成,包含 21 个传感器测量值和 3 个工况参数,模拟了不同飞行条件下的发动机退化过程。

数据集包含 4 个子集,差异主要体现在:
- FD001:单一工况、单一故障模式(高压压缩机退化)
- FD002:多工况、单一故障模式
- FD003:单一工况、复合故障模式(高压压缩机 + 风扇退化)
- FD004:多工况、复合故障模式
数据结构分析
每个样本包含 26 维时间序列数据,其物理含义可分为三类:
- 工况参数(3 个):
- 高度(altitude)
- 马赫数(Mach number)
-
油门解析器角度(throttle resolver angle)
-
传感器测量值(21 个):
- 温度测量(T24、T30、T50 等)
- 压力测量(P15、P30、Ps30 等)
- 转速(Nf、Nc)
-
物理特性(W31、W32 等)
-
元数据(2 个):
- 发动机编号(unit number)
- 循环次数(time in cycles)
工况条件采用 6 种离散操作模式(OP1-OP6)编码,组合了不同的飞行条件(爬升、巡航等)和环境参数。
特征工程挑战
处理 CMAPSS 数据时需特别注意以下问题:
- 传感器噪声:
- 使用移动平均或低通滤波平滑数据
-
对突变值进行修正或剔除
-
缺失值处理:
- 前向填充(forward fill)连续缺失
-
对长期缺失的传感器采用插值或标记方法
-
初始磨损差异:
- 对每个发动机单独做 z -score 标准化
- 使用相对退化指标而非绝对值
代码示例
数据加载
import pandas as pd
import numpy as np
# 加载训练数据
train = pd.read_csv('CMAPSS/train_FD001.txt', sep=' ', header=None)
# 删除空列
train.drop(train.columns[[26, 27]], axis=1, inplace=True)
# 设置列名
cols = ['unit', 'time'] + [f'sensor_{i}' for i in range(1,22)] + ['op1', 'op2', 'op3']
train.columns = cols
传感器可视化
import matplotlib.pyplot as plt
# 绘制特定发动机的传感器趋势
def plot_sensors(unit_id, sensors=[2,3,4]):
unit_data = train[train['unit']==unit_id]
plt.figure(figsize=(12,6))
for s in sensors:
plt.plot(unit_data['time'], unit_data[f'sensor_{s}'],
label=f'Sensor {s}')
plt.legend()
plt.xlabel('Time (cycles)')
plt.ylabel('Sensor value')
plt.title(f'Engine {unit_id} Sensor Trends')
plt.show()
plot_sensors(unit_id=5, sensors=[7,12,15])
建模实践
常用模型对比
- RNN 基础模型:
- 优点:简单易实现
-
缺点:难以捕捉长期依赖
-
LSTM 模型:
- 优点:自动学习时间模式
-
缺点:计算成本较高
-
Transformer 模型:
- 优点:并行处理能力强
- 缺点:需要大量数据
LSTM 实现示例
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 数据预处理
def prepare_data(data, window_size=30):
X, y = [], []
for unit in data['unit'].unique():
unit_data = data[data['unit']==unit]
# 创建滑动窗口
for i in range(len(unit_data)-window_size):
X.append(unit_data.iloc[i:i+window_size, 2:-3].values)
y.append(unit_data.iloc[i+window_size, 1])
return np.array(X), np.array(y)
X_train, y_train = prepare_data(train)
# 构建 LSTM 模型
model = Sequential([LSTM(64, input_shape=(X_train.shape[1], X_train.shape[2])),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
# 训练
history = model.fit(X_train, y_train,
epochs=50,
batch_size=32,
validation_split=0.2)
避坑指南
- 数据泄露问题:
- 确保测试集发动机未出现在训练集
-
时间序列划分时严格按时间顺序
-
评估指标选择:
- 常用 RMSE(均方根误差)
-
考虑 Early RUL Score(惩罚过早预警)
-
超参数设置:
- 固定随机种子(如 42)
- 使用交叉验证调参
延伸阅读
- 原始论文:
-
Saxena A, et al. “Damage Propagation Modeling for Aircraft Engine Run-to-Failure Simulation” (2008)
-
GitHub 项目:
- NASA/CMAPSS-Data: 官方数据集
-
jaungiers/LSTM-Neural-Network-for-Time-Series-Prediction: 经典实现
-
进阶方向:
- 多任务学习(同时预测故障类型)
- 不确定性量化(预测区间估计)
- 在线学习(持续更新模型)
