1. 自动编码器简介
自动编码器是一种特殊类型的神经网络,经过训练后可将其输入复制到输出。例如,给定一张手写数字图像,自动编码器首先将该图像编码为较低维度的潜在表示,然后将潜在表示解码回图像。自动编码器学习压缩数据,同时最小化重构误差。
书接上回 【自动编码器2 图像去噪 全python代码】,自动编码器的训练目的是最小化重构误差。您将仅在正常节律上训练自动编码器,然后使用它来重构所有数据。我们的假设是,异常节律将具有更高的重构误差。然后,如果重构误差超过固定阈值,您将把节律归类为异常。
2. Python 实现
在此示例中,您将训练自动编码器来检测ECG5000 数据集上的异常。此数据集包含 5,000 个心电图,每个心电图有 140 个数据点。您将使用数据集的简化版本,其中每个示例都已标记为0(对应于异常节律)或1(对应于正常节律)。您感兴趣的是识别异常节律。
原数据集下载地址 ECG5000数据集下载
这个实例用的数据集是一个csv文件:心电图数据
注意:这是一个带标签的数据集,因此您可以将其描述为监督学习问题。此示例的目的是说明异常检测概念可以应用于较大的数据集,在这些数据集中您没有可用的标签(例如,如果您有数千个正常节律,但只有少量异常节律)。
您将如何使用自动编码器检测异常?回想一下,自动编码器的训练目的是最小化重构误差。您将仅在正常节律上训练自动编码器,然后使用它来重构所有数据。我们的假设是,异常节律将具有更高的重构误差。然后,如果重构误差超过固定阈值,您将把节律归类为异常。
2.1 导入 TensorFlow 和其他库
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.model_selection import train_test_split
from tensorflow.keras import layers, losses
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.models import Model
2.2 加载心电图数据
# Download the dataset
dataframe = pd.read_csv('http://storage.googleapis.com/download.tensorflow.org/data/ecg.csv', header=None)
raw_data = dataframe.values
dataframe.head()
# The last element contains the labels
labels = raw_data[:, -1]
# The other data points are the electrocadriogram data
data = raw_data[:, 0:-1]
train_data, test_data, train_labels, test_labels = train_test_split(
data, labels, test_size=0.2, random_state=21
)
2.3 数据预处理
- 将数据标准化为[0,1]。
min_val = tf.reduce_min(train_data)
max_val = tf.reduce_max(train_data)
train_data = (train_data - min_val) / (max_val - min_val)
test_data = (test_data - min_val) / (max_val - min_val)
train_data