自编码在ECG场景异常检测
本文总结了基于自编码模型的异常检测在医疗健康领域ECG应用方式。通过对ECG的序列数据分析和深度学习发现异常的ECG数据,
从而检测出可能存在的心脏疾病等健康问题。另外通过对本文的学习,可以了解异常检测、自编码的概念,自编码模型架构,以及
自编码的异常检测模型如何实现和在实时场景如何应用。首先介绍下一些核心的概念:
ECG 即心电图(Electrocardiogram)。ECG数据中的异常可能预示着心脏疾病等健康问题。
对ECG数据进行异常检测可以帮助医生及时发现潜在的健康风险。
异常检测(也称为离群值分析)是数据挖掘中的一个步骤,它可以识别偏离数据集正常行为的数据点、事件、观察结果。
异常检测也广泛应用于工业制造、信息安全、医疗健康等多个领域,而机器学习的方法正逐渐被用于实现异常检测的自动化,包括以下方式:
监督学习方法(分类、回归);无监督学习(聚类、Isolation Forest、PCA);半监督(One-Class SVM、自编码器);深度学习方法(DNN、GAN)。
1. 问题背景介绍
实现方法:
- 构建Autoencoder 模型对正常的ECG数据进行训练,使得模型能够学习到正常 ECG信号的特征。
- 当输入新的ECG数据时, 如果重构后的信号与原始信号之间的差异较大, 则判断该数据为异常的ECG信号, 可能存在心脏疾病 等异常情况。
以下的项目 对ECG 数据进行预处理,例如 去除噪声、标准化等操作, 以提高模型的性能。
2. 基于自编码器的异常检测
Autoencoder-based anomaly detection
2.1 什么是异常检测
What is anomaly detection?
Anomaly detection (aka outlier analysis) is a step in data mining that identifies data points, events, and/or observations that deviate from a dataset’s normal behavior. Anomalous data can indicate critical incidents, such as a technical glitch, or potential opportunities, for instance a change in consumer behavior. Machine learning is progressively being used to automate anomaly detection.
异常检测(也称为离群值分析)是数据挖掘中的一个步骤,它可以识别偏离数据集正常行为的数据点、事件和 / 或观察结果。异常数据可以指示关键事件,例如技术故障,或者潜在的机会,例如消费者行为的变化。机器学习正逐渐被用于实现异常检测的自动化。
2.2 基于自编码器的异常检测
Autoencoder-based anomaly detection
自编码器是一种无监督学习的神经网络结构,在异常检测中,基于自编码器的方法通常利用自编码器学习正常数据的模式,然后通过比较新数据与自编码器重构数据的差异来检测异常。如果新数据的重构误差较大,则可能被判定为异常数据。
2.2.1 什么是自编码
What is Autoencoder?
自编码器尽可能地学习产生与输入相同的输出。通过这个学习过程,输入的表示可以在潜在空间中被有效地压缩。换句话说,它压缩了维度并将输入的表示存储在潜在空间中。
自编码器的目标是学习如何将输入数据编码为低维表示,然后再将这个低维表示解码回尽可能接近原始输入的数据。所以在训练自编码器时,输入数据既是期望的输出数据。(先encode,再decode)
2.2.2 自编码异常检测原理
自编码异常检测原理
3. 项目介绍(模型实践)
3.1 kaggle相关项目(医疗健康:ECG)
kaggle项目:Dectecting Anomaly using Autoencoder
编辑的:fork from Dectecting Anomaly using Autoencoder
模型文件见:kaggle的以上项目链接
废弃:kaggle项目:ECG Anomaly Detection
3.2 数据集介绍
此数据集包含患者的心电图读数。每一行对应一位患者的一次完整心电图。每一个心电图都由 140 个数据点(读数)组成。
- 第 0 至 139 列包含特定患者的心电图数据点。这些是浮点数。
- 标签显示心电图是正常还是异常。它是一个分类变量,值为 0 或 1。
3.2.1 Plot ECG
Plot the normal/abnormal ECG.
3.2.2 Preprocessing
数据预处理:归一化
1 | const preProcessing = (data0) => { |
关于数据归一化:归一化时, 取了原始数据集的最大值、最小值。 当然有多种取法: 整个数据集(单个特征单独取、所有特征一起取)
- 如果特征尺度差异很大,特征分别归一化可能更合适;如果特征尺度相对接近,一起归一化可能更简单有效。
- 训练时的归一化,在推理时怎么处理呢? 记录训练时的统计信息(均值、标准差、最大最小值) ,用于推理时特征处理.
问题:
如果把 异常的模式数据 作为正常 加到训练集中,会有什么影响? 自编码器 对不同模式的 学习能力强不强,还是说适合指针对 某个范围内的 模式序列?
3.3 模型训练
3.3.1 模型定义
1 | class AnomalyDetector(Model): |
encoder 是一个由三层全连接层组成的神经网络。每层的神经元数量分别为 32、16 和 8,激活函数均为relu。这个编码器将输入数据压缩成低维表示。
decoder 同样是一个由三层全连接层组成的神经网络。每层的神经元数量分别为 16、32 和 140,激活函数为relu和sigmoid。这个解码器将低维表示解码回原始数据的形状。
输入数据维度与神经元之间关系:
1.连接方式:如果是一个全连接层,输入数据的每个特征(维度)都会连接到该层的每个神经元. 输入数据维度n,m个神经元,则总共有n*m个连接
2.神经元数量对模型的影响:表达能力、过拟合风险
- 选择合适的神经元数量
关于模型输出:依据自编码器的工作原理,解码器处理后,最终的输出为一个向量,其维度与输入数据一致。以尽量接近地还原原始输入。
问题:那怎么用于实际场景 判断当前数据是否异常呢(怎么分类)? 计算2个张量之间的差异(使用 平均绝对误差MAE方法),详见模型测试(Test model)
encoder,decoder架构在深度学习模型中的定位? 为什么是三层的网络.
3.3.2 模型训练
The autoencoder is trained using only regular ECGs, but evaluated using the full test set.
1 | history = autoencoder.fit(normal_train_data, normal_train_data, |
3.3.3 模型保存
1 | # 保存整个模型 |
3.3.4 plot model
loss
If the reconstruction error is greater than one standard deviation from the normal training example, classify the ECG as abnormal. First, let’s plot the normal ECG of the training set, the reconstruction after being encoded and decoded by the autoencoder, and the reconstruction error.
3.3.5 Test model
分别用 normal data 和 abnormal data 进行测试.
1 | # 推理(single_data 为一个 tf.Tensor |
3.3.6 模型加载和推理
1 | import tensorflow as tf |
查看tensorflow模型结构1
2saved_model_cli show --dir /Users/-/Downloads/my_autoencoder_model --tag_set serve --signature_def serving_default