You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras结合LSTM与CNN做时间序列分类时验证准确率停滞问题排查

问题排查与优化方案

初始val_accuracy固定为0.4166的根因排查

该准确率接近随机猜测的上限,说明模型完全未学到有效区分特征,可从以下方向排查:

  • 标签校验:检查one-hot编码逻辑是否正确,是否存在训练集、验证集标签与样本未对齐,或编码规则不统一的问题;同时统计验证集三类样本的占比,若某一类占比恰好为41.67%,说明模型默认全部预测该类别,无分类能力。
  • 特征标准化校验:多变量时间序列做StandardScaler标准化时,需先将3维输入(样本数, 时间步, 特征数)reshape为(样本数*时间步, 特征数)再拟合scaler,直接对3维数据调用标准化接口会导致特征变换错误,完全失效。
  • 训练数据打乱校验:若训练集未做随机打乱,连续样本均为同一类别,SGD优化器会陷入局部最优,无法学习到跨类别的区分特征。

修正数据后模型的进一步优化方案

调整数据后模型已正常收敛,但仍有性能提升空间,可从以下维度调整:

模型结构调整

  • 当前输入的时间步仅为5,时序依赖极短,可降低LSTM参数量至64/128,避免参数冗余导致过拟合;也可调整结构顺序,先用Conv1D提取局部时序特征,再输入LSTM建模依赖,短序列下该结构效果更优。
  • 补充激活与正则层:原有代码中Dense(100)无激活函数,仅为线性变换,特征提取能力弱,可添加ReLU激活,同时在Conv1D层、全连接层后增加Dropout(0.2~0.3)抑制过拟合。
    示例调整后的代码:
model = keras.Sequential()
# 也可将Conv1D放到LSTM之前
model.add(keras.layers.LSTM(128, return_sequences=True, 
                            input_shape=(X_train_scaled.shape[1], X_train_scaled.shape[2]) ))
model.add(keras.layers.Conv1D(128, kernel_size=2, activation = 'relu'))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.GlobalMaxPooling1D())
model.add(keras.layers.Dense(64, activation='relu'))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Dense(y_train.shape[1], activation='softmax'))

训练策略调整

  • 替换优化器为Adam,默认学习率1e-3即可,SGD对学习率敏感度极高,默认参数收敛速度极慢,训练日志中20轮仍处于收敛上升阶段,未达到拟合瓶颈。
  • 增加训练回调:添加EarlyStopping回调监控val_loss,patience设为5,避免过拟合;添加ReduceLROnPlateau回调,当val_loss连续3轮不下降时自动降低学习率,进一步提升收敛效果。
    编译示例:
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(learning_rate=1e-3), metrics=['acc'])

数据层面调整

  • 检查三类样本的分布是否均衡,若存在类别不平衡,可在model.fit中传入class_weight参数做损失加权,或对少数类样本做过采样。
  • 可尝试增加时间序列数据增强,比如给特征添加小幅度高斯噪声、小幅偏移时间步,提升模型泛化能力。

内容的提问来源于stack exchange,提问作者kimla010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:54:02