1. 基于LSTM的剩余寿命预测

基于LSTM的剩余寿命预测 学习卡片

任务说明

本案例使用LSTM网络对机械设备(以涡轮风扇发动机为例)的剩余寿命(RUL, Remaining Useful Life)进行预测。输入为传感器多变量时间序列数据,输出为当前时刻至失效的剩余循环数。通过均方误差(MSE)与评分函数评估预测精度。

数据集与预处理

采用NASA C-MAPSS数据集中的FD001子集(训练集100台发动机,测试集100台发动机)。每台发动机包含21个传感器通道的退化信号。预处理步骤:

  1. 仅保留对退化敏感的信号通道(剔除恒定值通道,保留14个通道);
  2. 使用滑动窗口(窗口长度30)构造样本,每个样本对应一个RUL标签;
  3. RUL标签采用分段线性函数,上限设为125(即当真实RUL大于125时,标签截断为125)。

LSTM模型结构

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.optimizers import Adam

def build_lstm_model(input_shape):
    """构建LSTM回归模型"""
    model = Sequential([
        LSTM(64, return_sequences=True, input_shape=input_shape),
        Dropout(0.2),
        LSTM(32, return_sequences=False),
        Dropout(0.2),
        Dense(16, activation='relu'),
        Dense(1)  # 线性输出,预测RUL
    ])
    model.compile(optimizer=Adam(learning_rate=0.001),
                  loss='mse',
                  metrics=['mae'])
    return model

# 输入形状: (窗口长度, 特征通道数)
input_shape = (30, 14)
model = build_lstm_model(input_shape)
model.summary()

数据加载与训练

def load_fd001_data():
    """加载并预处理FD001数据集(需提前下载至本地)"""
    # 实际使用时替换为真实数据路径
    # 此处为演示,生成模拟数据验证代码流程
    np.random.seed(42)
    n_train, n_test = 100, 100
    seq_len, n_features = 30, 14
    
    # 模拟退化趋势:信号缓慢漂移 + 噪声
    def gen_signals(n_units):
        X, y = [], []
        for _ in range(n_units):
            life = np.random.randint(80, 250)
            start = np.random.rand(n_features) * 0.5
            drift = np.random.rand(n_features) * 0.01
            for t in range(life):
                if t >= seq_len:
                    window = start + drift * np.arange(t-seq_len, t)[:, None] \
                             + np.random.normal(0, 0.05, (seq_len, n_features))
                    X.append(window)
                    rul = min(life - t, 125)
                    y.append(rul)
        return np.array(X), np.array(y)
    
    X_train, y_train = gen_signals(n_train)
    X_test, y_test = gen_signals(n_test)
    
    # 归一化(按训练集统计量)
    mean = X_train.mean(axis=(0,1))
    std = X_train.std(axis=(0,1)) + 1e-8
    X_train = (X_train - mean) / std
    X_test = (X_test - mean) / std
    
    return X_train, y_train, X_test, y_test

# 加载数据
X_train, y_train, X_test, y_test = load_fd001_data()
print(f"训练样本: {X_train.shape}, 测试样本: {X_test.shape}")

# 训练模型
history = model.fit(X_train, y_train,
                    validation_split=0.1,
                    epochs=20,
                    batch_size=256,
                    verbose=1)

预测与精度评估

from sklearn.metrics import mean_squared_error

# 测试集预测
y_pred = model.predict(X_test).flatten()

# 评估指标
mse = mean_squared_error(y_test, y_pred)
mae = np.mean(np.abs(y_test - y_pred))

# PHM08评分函数(非对称惩罚:早预测惩罚小于晚预测)
def phm_score(y_true, y_pred):
    d = y_pred - y_true
    return np.sum(np.where(d < 0, np.exp(-d/10) - 1, np.exp(d/13) - 1))

score = phm_score(y_test, y_pred)

print(f"MSE: {mse:.4f}")
print(f"MAE: {mae:.4f}")
print(f"PHM Score: {score:.2f}")

# 保存模型
model.save('rul_lstm_model.h5')

验证方法

运行以上代码后,观察训练损失是否收敛(验证损失持续下降)。测试集MSE与MAE数值越小表示预测越准确;PHM Score越低表示综合性能越好。由于本案例使用模拟数据演示完整流程,实际应用时需将load_fd001_data()中的数据加载部分替换为真实C-MAPSS数据集路径,并重新训练。判定标准:在真实FD001数据集上,MSE低于400、PHM Score低于350即达到可接受的预测精度。

LSTM剩余寿命预测流程 多变量时间序列 21个传感器通道 窗口长度=30 预处理 剔除恒定通道 Z-score归一化 LSTM模型 LSTM(64) → Dropout LSTM(32) → Dropout Dense(16) → Dense(1) 优化器: Adam, lr=0.001 RUL 预测值 精度评估指标 MSE = mean((y_true - y_pred)²) PHM Score = Σ(exp(d/13)-1) 或 Σ(exp(-d/10)-1) 训练集: 100台 测试集: 100台 RUL标签采用分段线性函数,上限截断为125 滑动窗口步长=1,覆盖全生命周期退化过程 数据流 模型与输出

运行说明

本案例代码可直接运行(使用模拟数据验证流程)。若需复现真实结果:

  1. 从NASA官网下载C-MAPSS FD001数据集;
  2. 将load_fd001_data()函数替换为真实数据解析代码;
  3. 训练约50个epoch(视硬件性能调整),观察验证损失收敛后停止。

依赖库:tensorflow 2.x、numpy、scikit-learn。模型训练完成后,可通过model.predict()对新样本进行RUL预测。