共计 3221 个字符,预计需要花费 9 分钟才能阅读完成。
CMAPSS 数据集实战指南:从数据预处理到 RUL 预测的完整流程
1. CMAPSS 数据集背景介绍
CMAPSS(Commercial Modular Aero-Propulsion System Simulation)数据集是 NASA 提供的航空发动机退化仿真数据集,广泛应用于剩余使用寿命(RUL)预测研究。数据集包含四个子集(FD001-FD004),每个子集包含:

- 训练集:多个发动机单元的时间序列运行数据
- 测试集:同样结构但未提供最终 RUL 的数据
- RUL 标签:测试集的真实 RUL 值(用于验证)
每个时间步记录 21 个传感器测量值(温度、压力、转速等)和 3 个操作条件。核心目标是:根据历史传感器数据预测发动机还能正常运行多少周期(RUL)。
2. 数据预处理关键步骤
2.1 数据加载与初步观察
import pandas as pd
import numpy as np
# 加载训练数据(示例使用 FD001)train_data = pd.read_csv('CMAPSS/train_FD001.txt', sep=' ', header=None)
train_data.drop([26, 27], axis=1, inplace=True) # 删除末尾两列空值
columns = ['unit', 'cycle'] + [f'sensor_{i}' for i in range(1,22)]
train_data.columns = columns
2.2 缺失值处理
CMAPSS 数据本身质量较好,但需检查:
missing_values = train_data.isnull().sum()
print(missing_values[missing_values > 0]) # 确认无缺失值
2.3 数据标准化
不同传感器量纲差异大,必须标准化:
from sklearn.preprocessing import MinMaxScaler
sensor_cols = [f'sensor_{i}' for i in range(1,22)]
scaler = MinMaxScaler()
train_data[sensor_cols] = scaler.fit_transform(train_data[sensor_cols])
2.4 滑动窗口处理
时间序列预测需要构造滑动窗口样本:
def create_sequences(data, window_size=30):
sequences = []
for unit in data['unit'].unique():
unit_data = data[data['unit'] == unit]
for i in range(len(unit_data) - window_size):
seq = unit_data.iloc[i:i+window_size][sensor_cols].values
rul = len(unit_data) - (i + window_size)
sequences.append((seq, rul))
return sequences
window_size = 30
train_sequences = create_sequences(train_data, window_size)
3. 特征工程方法
3.1 时域特征提取
对每个滑动窗口计算统计特征:
def extract_features(sequences):
features = []
for seq, rul in sequences:
# 基本统计量
mean = np.mean(seq, axis=0)
std = np.std(seq, axis=0)
# 添加到特征列表
features.append(np.concatenate([mean, std]))
return np.array(features)
X_train = extract_features(train_sequences)
y_train = np.array([rul for _, rul in train_sequences])
3.2 特征选择
使用随机森林评估特征重要性:
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(X_train, y_train)
importance = rf.feature_importances_
# 筛选重要性大于 0.01 的特征
selected_idx = np.where(importance > 0.01)[0]
X_train_selected = X_train[:, selected_idx]
4. LSTM 模型构建
4.1 网络结构设计
import torch
import torch.nn as nn
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size=64):
super(LSTMModel, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
self.linear = nn.Linear(hidden_size, 1)
def forward(self, x):
_, (h_n, _) = self.lstm(x)
out = self.linear(h_n.squeeze(0))
return out
input_size = X_train_selected.shape[1]
model = LSTMModel(input_size)
4.2 训练流程
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 转换数据为 PyTorch 张量
X_tensor = torch.FloatTensor(X_train_selected).unsqueeze(1)
y_tensor = torch.FloatTensor(y_train).unsqueeze(1)
# 训练循环
for epoch in range(100):
optimizer.zero_grad()
outputs = model(X_tensor)
loss = criterion(outputs, y_tensor)
loss.backward()
optimizer.step()
if epoch % 10 == 0:
print(f'Epoch {epoch}, Loss: {loss.item():.4f}')
5. 模型评估
5.1 RMSE 计算
from sklearn.metrics import mean_squared_error
with torch.no_grad():
y_pred = model(X_tensor).numpy()
rmse = np.sqrt(mean_squared_error(y_train, y_pred))
print(f'RMSE: {rmse:.2f}')
5.2 RUL 误差分析
error = np.abs(y_train - y_pred.squeeze())
print(f'平均绝对误差: {np.mean(error):.2f} 周期')
print(f'最大误差: {np.max(error):.2f} 周期')
6. 避坑指南
- 数据泄露 :确保测试集数据不参与任何预处理步骤的拟合(如 scaler.fit)
- 超参数调优 :
- 使用交叉验证选择窗口大小
- 尝试不同的 LSTM 层数和隐藏单元数
- 早停机制 :监控验证集损失防止过拟合
进阶思考题
- 如何利用迁移学习将 FD001 训练的模型应用到 FD002-FD004?
- 除了 LSTM,还有哪些时序模型适合 RUL 预测?比较它们的优缺点
- 如何设计自定义损失函数来惩罚早期预测偏差(过早预测失效)?
通过本教程,你应该已经掌握了 CMAPSS 数据集的基础处理流程和 LSTM 建模方法。实际应用中,还需要根据具体需求调整特征工程策略和模型结构。希望这篇指南能为你的 RUL 预测研究提供扎实的起点。
正文完
