Anomaly Detection
Anomaly Detection
pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
dataframe = pd.read_csv('http://storage.googleapis.com/download.tensorflow.org/
data/ecg.csv', header=None)
raw_data = dataframe.values
dataframe.head()
#Entrenará el codificador automático usando solo los ritmos normales, que están
etiquetados en este
#conjunto de datos como 1 . Separar los ritmos normales de los ritmos anormales.
train_labels = train_labels.astype(bool)
test_labels = test_labels.astype(bool)
normal_train_data = train_data[train_labels]
normal_test_data = test_data[test_labels]
anomalous_train_data = train_data[~train_labels]
anomalous_test_data = test_data[~test_labels]
#Construye el modelo
class AnomalyDetector(Model):
def __init__(self):
super(AnomalyDetector, self).__init__()
self.encoder = tf.keras.Sequential([
layers.Dense(32, activation="relu"),
layers.Dense(16, activation="relu"),
layers.Dense(8, activation="relu")])
self.decoder = tf.keras.Sequential([
layers.Dense(16, activation="relu"),
layers.Dense(32, activation="relu"),
layers.Dense(140, activation="sigmoid")])
autoencoder = AnomalyDetector()
autoencoder.compile(optimizer='adam', loss='mae')
#Tenga en cuenta que el codificador automático se entrena utilizando solo los ECG
normales, pero se evalúa
# utilizando el conjunto de prueba completo.
encoded_data = autoencoder.encoder(normal_test_data).numpy()
decoded_data = autoencoder.decoder(encoded_data).numpy()
plt.plot(normal_test_data[0], 'b')
plt.plot(decoded_data[0], 'r')
plt.fill_between(np.arange(140), decoded_data[0], normal_test_data[0],
color='lightcoral')
plt.legend(labels=["Input", "Reconstruction", "Error"])
#plt.show()
#Cree una trama similar, esta vez para un ejemplo de prueba anómalo.
encoded_data = autoencoder.encoder(anomalous_test_data).numpy()
decoded_data = autoencoder.decoder(encoded_data).numpy()
plt.plot(anomalous_test_data[0], 'b')
plt.plot(decoded_data[0], 'r')
plt.fill_between(np.arange(140), decoded_data[0], anomalous_test_data[0],
color='lightcoral')
plt.legend(labels=["Input", "Reconstruction", "Error"])
#plt.show()
plt.hist(train_loss[None,:], bins=50)
plt.xlabel("Train loss")
plt.ylabel("No of examples")
#plt.show()
#Elija un valor de umbral que sea una desviación estándar por encima de la media.
threshold = np.mean(train_loss) + np.std(train_loss)
print("Threshold: ", threshold)
reconstructions = autoencoder.predict(anomalous_test_data)
test_loss = tf.keras.losses.mae(reconstructions, anomalous_test_data)
print_stats(np.array(preds), np.array(test_labels))