Python异常检测 - LSTM(长短期记忆网络)

系列文章目录

Python异常检测- Isolation Forest(孤立森林)
python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)
python异常检测-局部异常因子(LOF)算法
Python异常检测- DBSCAN
Python异常检测- 单类支持向量机(One-Class SVM)
Python异常检测-3Sigma
Python异常检测-K最近邻算法(KNN)
Python异常检测-主成分分析(PCA)
python异常检测-ARIMA(自回归积分滑动平均模型)
Python异常监测- 包络线


文章目录


前言

在时间序列分析中,异常值检测是一个重要的任务,它可以帮助我们发现数据中的异常情况,比如突发的异常波动、异常值等。

一、 LSTM(长短期记忆网络)

RNN :RNN(Recurrent Neural Network)循环神经网络,RNN 的神经网络单元不但与输入和输出存在联系,而且自身也存在一个循环 / 回路 / 环路 / 回环 (loop)。这种回路允许信息从网络中的一步传递到下一步。因此RNN中,上一个时刻的网络状态将会作用于到下一个时刻的网络状态,同时这也表明 RNN 和序列数据密切相关。

参考文献中,对RNN的展开和收起有一个简单的图示:

**梯度消失或梯度爆炸:**在训练过程中,随着网络深度增加,梯度会逐渐减小至零(梯度消失)或无限增大(梯度爆炸),导致网络难以训练。

LSTM,全称为Long Short-Term Memory(长短期记忆网络),是一种特殊的循环神经网络(Recurrent Neural Network, RNN)。LSTM最初由Hochreiter和Schmidhuber于1997年提出,主要是为了解决传统RNN在处理长序列数据时遇到的梯度消失或梯度爆炸问题。

下图一和图二是关于经典RNN结构与LSTM结构对比图,从结构上,可以看出,LSTM是一种特殊的RNN,两者的区别在于普通的RNN单个循环结构内部只有一个状态。而LSTM的单个循环结构(又称为细胞)内部有四个状态。

图一: RNN结构

图二: LSTM结构

通过结构图的对比,可以看出LSTM单元要复杂许多。每个LSTM单元中包含了4个交互的网络层,这个四层结构的网络层主要包括如下内容:

  • 记忆单元(Memory Cell):记忆单元是LSTM的核心部分,它能够存储信息,并通过门控机制来控制信息的流入、流出以及保持。
  • 遗忘门(Forget Gate):遗忘门决定上一时刻的单元状态有多少需要保留到当前时刻。
  • 输入门(Input Gate):输入门决定当前时刻网络的输入数据有多少需要保存到单元状态。
  • 输出门(Output Gate):输出门决定了控制当前单元状态有多少需要输出到当前的输出值。

1.1 记忆单元

记忆细胞提供了记忆的功能,在网络结构加深时仍能传递前后层的网络信息。参考文件中给出了下图,示例是最简单的模式,采用的是函数只有两个sigmod 和tanh神经网络层。其中红色部分就是记忆单元的表示,输入数据在结合遗忘门,输入门数据后进行相应的输出。

1.2 遗忘门

遗忘门的作用是要决定从记忆细胞c中是否丢弃某些信息,即at-1中有多少信息进行保留。参考文件中的图片很清晰的表明其在单元中的位置,基于上图的示例,可以通过一个 Sigmoid函数来进行处理。

1.3 输入门

输入门的作用就是往状态信息中添加新东西,输入门包含记忆细胞候选值和更新门两个元素,同时使用了两个神经元函数。参考文件中对其位置的说明如下图。

1.4 输出门

输出门是输出的记忆,也就是前面的积累。首先,通过 tanh 进行记忆单元的输出进行处理,它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分,最后通过运行一个 softmax 层来过滤后,确定细胞状态的哪个部分将输出出去。

二、LSMT的优缺点

通义千问对LSTM的优缺点的总结信息如下:
优点

  • 解决长期依赖问题:LSTM通过其独特的结构设计,特别是输入门、遗忘门和输出门的设计,能够有效地捕捉长时间间隔的信息依赖关系,这是标准RNN难以做到的。

  • 防止梯度消失/爆炸:由于LSTM内部状态的传递方式,它能够在训练过程中较好地保持梯度的稳定,从而避免了梯度消失或梯度爆炸的问题。

  • 灵活的模型能力:LSTM可以适应多种类型的序列数据,包括但不限于自然语言处理、语音识别、时间序列预测等领域。

  • 并行计算能力:虽然LSTM本质上是一个序列模型,但是它可以通过一些技巧实现一定程度上的并行化计算,提高训练效率。

缺点

  • 计算成本高:相比于简单的RNN模型,LSTM的参数量更多,因此在训练和推理时需要更多的计算资源和时间。

  • 过拟合风险:由于LSTM具有较强的表达能力,如果数据集较小或正则化手段不当,容易发生过拟合现象。

  • 调参复杂:LSTM中存在多个超参数需要调整,如学习率、隐藏层单元数、层数等,这使得模型调优变得更加困难。

  • 解释性较差:尽管LSTM在很多任务上表现优秀,但它属于黑盒模型,内部的工作机制对于非专业人士来说难以理解,这限制了其在某些需要高度可解释性的领域的应用。

三、LSTM的应用场景

LSTM作为一种先进的深度学习模型,其在多个领域的应用都展现了其强大的数据处理能力和灵活性,其主要应用场景包括:

  • 自然语言处理(NLP) :LSTM在文本生成、机器翻译、语音识别等领域表现突出。例如,Google翻译使用的就是基于LSTM的模型[^1^]。
  • 时间序列预测:LSTM能够捕捉时间序列中的时间依赖性,适用于股票价格预测、天气预测等场景。
  • 视频分析:在视频内容分析和动作识别中,LSTM可以有效地处理视频帧之间的时序关系。
  • 生物信息学:在DNA序列分析、蛋白质结构预测等生物信息学领域,LSTM也显示出了强大的能力。
  • 音乐创作:LSTM被用于生成音乐和作曲,能够学习音乐的风格并进行创作。
  • 机器人技术:在机器人路径规划和控制系统中,LSTM可以帮助机器人更好地理解和预测环境变化。
  • 游戏AI:在电子游戏中,LSTM可以用来开发更智能的NPC对手或队友。

随着技术的不断进步,LSTM在未来的应用前景将更加广阔。

四、python的实现

4.1. 数据准备

首先,需要准备你的时序数据。通常,这包括数据的收集、清洗和预处理。对于异常检测任务,你可能需要将原始数据转换为监督学习问题的形式,即创建输入-输出对。

本实例通过从csv中读取两列数据的方案来实现。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# 加载数据
data = pd.read_csv('your_data.csv')

# 选择特征列
features = data[['feature1', 'feature2']]

# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_features = scaler.fit_transform(features)

# 创建数据集
def create_dataset(data, time_step=1):
    X, Y = [], []
    for i in range(len(data)-time_step-1):
        a = data[i:(i+time_step), 0]
        X.append(a)
        Y.append(data[i + time_step, 0])
    return np.array(X), np.array(Y)

time_step = 60  # 可以根据具体需求调整
X, y = create_dataset(scaled_features, time_step)

4.2. 构建 LSTM 模型

接下来,构建一个简单的 LSTM 模型来学习时序数据中的模式。

from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout

model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, scaled_features.shape[1])))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')

4.3. 训练模型

使用训练集数据训练模型。为了防止过拟合,可以设置验证集来监控模型在未见过的数据上的表现。

history = model.fit(X, y, epochs=100, batch_size=64, validation_split=0.1, verbose=1)

4.4. 异常检测

训练完成后,可以通过计算预测值与实际值之间的误差来进行异常检测。较大的误差可能指示异常点。

# 使用模型预测
train_predict = model.predict(X)

# 反向转换预测值
train_predict = scaler.inverse_transform(train_predict)
y_true = scaler.inverse_transform(y.reshape(-1, 1))

# 计算误差
errors = np.abs(y_true - train_predict)

# 定义阈值来判断是否为异常
threshold = np.percentile(errors, 99.75)  # 例如,选择99.75%(3个标准差)分位数作为阈值
anomalies = errors > threshold

4.5. 结果分析

最后,你可以通过可视化或其他方法来检查哪些数据点被认为是异常的。

import matplotlib.pyplot as plt

plt.figure(figsize=(14, 5))
plt.plot(y_true, label='True value')
plt.plot(train_predict, label='Predicted value')
plt.scatter(np.where(anomalies)[0], y_true[anomalies], c='r', label='Anomaly')
plt.legend()
plt.show()

参考
Python LSTM时间序列异常值检测
深入理解LSTM
最简单的LSTM讲解,多图展示,源码实践,建议收藏
神经网络 | CNN 与 RNN------深度学习主力军

相关推荐
Joyner20184 分钟前
pytorch训练的双卡,一个显卡占有20GB,另一个卡占有8GB,怎么均衡?
人工智能·pytorch·python
瑞雨溪18 分钟前
python中的OS模块的基本使用
开发语言·python
Leuanghing25 分钟前
使用Python生成F分布表并导出为Excel文件
开发语言·python·excel·f分布
沈小农学编程30 分钟前
【LeetCode面试150】——202快乐数
c++·python·算法·leetcode·面试·职场和发展
封步宇AIGC1 小时前
量化交易系统开发-实时行情自动化交易-4.2.1.简单移动平均线实现
人工智能·python·机器学习·数据挖掘
Hotchip华芯邦科技1 小时前
MEMS硅麦克风应用电子烟雾化产业稳步爬升,耐高温、 防油、防酸、防腐蚀等性能优势和可实现自动化贴片及极高的一致性等特性使其必将成为主流
科技·单片机·金融·生活·社交电子·健康医疗·制造
封步宇AIGC1 小时前
量化交易系统开发-实时行情自动化交易-4.1.4.A股布林带(BOLL)实现
人工智能·python·机器学习·数据挖掘
sun_weitao1 小时前
括号匹配算法
开发语言·python
敲代码不忘补水1 小时前
Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介
开发语言·python·信息可视化·numpy·pandas·matplotlib
傻啦嘿哟2 小时前
深入探索Python数据可视化:自定义颜色映射、标签与进阶技巧
python