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(长短期记忆网络)
- 1.1 记忆单元
- 1.2 遗忘门
- 1.3 输入门
- 1.4 输出门
- 二、LSMT的优缺点
- 三、LSTM的应用场景
- 四、python的实现
- 4.1. 数据准备
- 4.2. 构建 LSTM 模型
- 4.3. 训练模型
- 4.4. 异常检测
- 4.5. 结果分析
前言
在时间序列分析中,异常值检测是一个重要的任务,它可以帮助我们发现数据中的异常情况,比如突发的异常波动、异常值等。
一、 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——深度学习主力军