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

LSTM序列数据如何整形?LSTM自编码器异常检测时序输入维度调整问题

关于LSTM自编码器时间步选择的解答

为什么教程中将time step设为1

这个设置是入门教程为了快速适配LSTM要求的三维输入格式((样本总数, 时间步, 特征总数))做的简化处理,没有实际时序建模价值。时间步为1时,每个输入样本仅包含当前时刻的特征,LSTM无法捕捉前后时间点的依赖关系,本质是把LSTM当成普通全连接层使用,浪费了时序建模能力。

你的数据集时间步选择方法

你的数据集采样间隔可通过维度计算得出:57天共1368个样本,对应每1小时采集1个数据点,可参考以下规则选择时间步:

  • 参考业务中异常的持续周期:如果你要检测的异常通常需要连续数小时才能表现出规律,可选择覆盖完整异常周期的数值,比如异常通常持续3~6小时就可以选择3、6、12作为时间步。
  • 参考数据的固有周期:时序数据通常存在日度/周度规律,你可以优先尝试24(对应1天的完整序列)、48(对应2天)、72(对应3天)这类和周期匹配的数值。
  • 实操验证选最优:你可以选择6、12、24、48几个候选值分别训练模型,对比验证集上的重构误差表现,选择效果最好的数值即可。

正确的序列生成代码

你原有代码直接reshape的方式没有生成真实的时序序列,可使用滑窗方法生成对应时间步的序列,示例代码如下(以时间步设为24为例):

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler

def create_sequences(data, time_steps=24):
    sequences = []
    for i in range(len(data) - time_steps + 1):
        sequences.append(data[i:i+time_steps, :])
    return np.array(sequences)

df = pd.read_csv('416celldata.csv', parse_dates=True, index_col="timestamp")
train = df['2014-04-01 04:00:00+00:00': '2014-05-20 06:00:00+00:00']
test = df['2014-05-20 06:00:00+00:00':]
print("原始训练集形状:", train.shape)
print("原始测试集形状:", test.shape) 

# 归一化
scaler = MinMaxScaler()
X_train = scaler.fit_transform(train)
X_test = scaler.transform(test)

# 生成时间步为24的序列
time_steps = 24
X_train_seq = create_sequences(X_train, time_steps)
X_test_seq = create_sequences(X_test, time_steps)
print("处理后训练集形状:", X_train_seq.shape)
print("处理后测试集形状:", X_test_seq.shape)

提示:如果是无监督异常检测场景不需要标注标签,直接用训练好的自编码器输出的重构误差判断异常即可。
你提到的数据概览图如下:
数据概览

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:24:06