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
相关产品推荐
相关产品推荐


