CMAPSS数据集FD004过拟合问题实战:从数据增强到模型正则化的解决方案

1次阅读
没有评论

共计 1833 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点

CMAPSS 数据集是 NASA 开发的航空发动机退化仿真数据,其中 FD004 子集包含多工况(6 种飞行条件)和小样本(仅 249 个训练序列)特性。这些特性使得传统 LSTM 模型极易过拟合:

CMAPSS 数据集 FD004 过拟合问题实战:从数据增强到模型正则化的解决方案

  • 训练损失快速下降至 0.1 以下,而验证损失在 20epoch 后开始上升
  • 测试集 MAE 高达 35.2,比训练集指标(12.7)高出近 3 倍
  • 模型对某些工况的预测误差显著高于其他工况

技术方案

数据层增强

  1. 滑窗增强 :将原始序列切分为固定长度(128 时间步)的滑动窗口,步长设为 32,使样本量扩大 4 倍

  2. 特征筛选

  3. 计算 21 个传感器信号与 RUL 的互信息得分
  4. 保留 Top15 特征(如 T24、T30 等核心温度传感器)
  5. 剔除低相关性特征(如 P15 燃油流量)

模型架构

class BiLSTM_Attn(nn.Module):
    def __init__(self, input_dim=15):
        super().__init__()
        self.bilstm = nn.LSTM(input_dim, 64, bidirectional=True)
        self.attention = nn.Sequential(nn.Linear(128, 32),
            nn.Tanh(),
            nn.Linear(32, 1, bias=False)
        )

    def forward(self, x):
        lstm_out, _ = self.bilstm(x)  # [seq_len, batch, 128]
        attn_weights = F.softmax(self.attention(lstm_out), dim=0)
        return (attn_weights * lstm_out).sum(dim=0)

正则化策略

  • DropPath:以 0.2 概率随机丢弃 LSTM 的隐藏状态转移路径
  • Label Smoothing:将硬标签替换为 ε =0.1 的平滑标签
  • 梯度裁剪 :限制梯度范数不超过 5.0

代码实现

数据加载器

class CMAPSSDataset(Dataset):
    def __init__(self, df, window_size=128, stride=32):
        self.windows = []
        for unit_id in df['unit'].unique():
            unit_data = df[df['unit']==unit_id].sort_values('cycle')
            for i in range(0, len(unit_data)-window_size, stride):
                self.windows.append(unit_data.iloc[i:i+window_size])

    def __getitem__(self, idx):
        window = self.windows[idx]
        x = torch.FloatTensor(window[SELECTED_FEATURES].values)
        y = torch.FloatTensor([window['RUL'].iloc[-1]])
        return x, y

训练循环

def train_epoch(model, loader, optimizer):
    model.train()
    total_loss = 0
    for x, y in loader:
        optimizer.zero_grad()
        pred = model(x.to(device))
        loss = F.mse_loss(pred, y.to(device))
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), 5.0)
        optimizer.step()
        total_loss += loss.item()
    return total_loss / len(loader)

实验对比

方案 MAE RMSE 训练时间 (hr)
原始 LSTM 35.2 41.7 1.2
+ 数据增强 28.4 36.1 1.5
+BiLSTM-Attn 25.3 32.8 1.8
完整方案 21.6 29.4 2.1

生产建议

  1. 分段归一化 :按工况类别分别计算均值和方差
  2. 超参数搜索
  3. 学习率:对数空间 [1e-4, 1e-2]
  4. DropPath 率:[0.1, 0.3]
  5. 窗口大小:{64, 128, 256}
  6. 模型量化
  7. 使用 PyTorch 的 quantization 模块进行 INT8 量化
  8. 对 Attention 层保留 FP16 精度

开放问题

如何设计工况自适应的正则化强度?当前固定比例的 DropPath 可能不适合所有飞行条件,未来可探索:

  • 基于工况特征的动态 DropPath 率
  • 元学习策略自动调整正则化强度
  • 在线学习过程中的自适应调整
正文完
 0
评论(没有评论)