LSTM+AE用于时间序列异常检测

求助各位大佬,为什么会出现当归一化后的数据超过0.75就无法重构的现象,在0.75以下重构效果还比较好。

### 使用LSTMAE进行异常检测 #### LSTMAE简介 长短时记忆自编码器(Long Short-Term Memory Autoencoder, LSTMAE)是一种基于循环神经网络(RNN)的无监督学习模型,特别适用于时间序列数据中的异常检测。该模型能够捕捉时间序列中的长期依赖关系,并通过重构误差来识别异常。 #### 数据预处理 为了训练LSTMAE模型,输入的时间序列数据通常需要经过标准化或归一化处理。这一步骤可以提高模型的学习效率和稳定性[^1]。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() data_scaled = scaler.fit_transform(data) ``` #### 构建LSTMAE模型 构建LSTMAE模型涉及定义编码器和解码器结构。编码器负责压缩输入数据到低维表示,而解码器则尝试从这些低维表示重建原始输入。如果某个时间步的数据无法被很好地重建,则可能表明这是一个异常点。 ```python import tensorflow as tf from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, LSTM, RepeatVector, TimeDistributed, Dense input_dim = data.shape[-1] timesteps = data.shape[0] inputs = Input(shape=(timesteps, input_dim)) encoded = LSTM(64, activation='relu')(inputs) decoded = RepeatVector(timesteps)(encoded) decoded = LSTM(input_dim, return_sequences=True)(decoded) autoencoder = Model(inputs, decoded) autoencoder.compile(optimizer='adam', loss='mse') ``` #### 训练模型 使用正常样本作为训练集,让模型学会如何有效地重构正常的模式。对于异常检测任务来说,在训练过程中只用到了未标记的历史正常数据即可完成整个过程。 ```python history = autoencoder.fit( X_train, X_train, epochs=50, batch_size=32, validation_split=0.1, callbacks=[tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)], shuffle=False ) ``` #### 设定阈值并预测异常 一旦模型训练完毕,就可以利用它来进行新数据上的异常检测工作了。具体做法是计算每一个时间窗口下的重构损失函数值;当这个数值超过预先设定好的阈值时即认为发生了异常事件。 ```python train_pred = autoencoder.predict(X_train) test_pred = autoencoder.predict(X_test) # Calculate reconstruction error (MSE) train_mse = np.mean(np.power(X_train - train_pred, 2), axis=1) test_mse = np.mean(np.power(X_test - test_pred, 2), axis=1) threshold = np.percentile(train_mse, 95) # Set threshold based on training set's MSE distribution anomalies = test_mse > threshold ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值